image.c revision b06de80843e7d096bed4ae03ddc5e2842f1876af
1544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/**************************************************************************
2544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
3544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Copyright 2009 VMware, Inc.  All Rights Reserved.
4544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
5544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Permission is hereby granted, free of charge, to any person obtaining a
6544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * copy of this software and associated documentation files (the
7544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * "Software"), to deal in the Software without restriction, including
8544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * without limitation the rights to use, copy, modify, merge, publish,
9544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * distribute, sub license, and/or sell copies of the Software, and to
10544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * permit persons to whom the Software is furnished to do so, subject to
11544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * the following conditions:
12544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
13544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * The above copyright notice and this permission notice (including the
14544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * next paragraph) shall be included in all copies or substantial portions
15544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * of the Software.
16544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
17544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
25544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin **************************************************************************/
26544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
27544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "image.h"
28544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
29544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_translate.h"
30544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_context.h"
31544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "matrix.h"
32544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "renderer.h"
33544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util_array.h"
34544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "api_consts.h"
35544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "shader.h"
36544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
37544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_context.h"
38544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_screen.h"
3928486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
406df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol#include "util/u_format.h"
41544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_tile.h"
42544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_memory.h"
43544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_math.h"
44e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger#include "util/u_sampler.h"
45544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
46544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic enum pipe_format vg_format_to_pipe(VGImageFormat format)
47544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
48544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   switch(format) {
49544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   case VG_sRGB_565:
50b306308757c0ce3cf47a50bac12bb39f212ca6b2José Fonseca      return PIPE_FORMAT_B5G6R5_UNORM;
51544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   case VG_sRGBA_5551:
52b306308757c0ce3cf47a50bac12bb39f212ca6b2José Fonseca      return PIPE_FORMAT_B5G5R5A1_UNORM;
53544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   case VG_sRGBA_4444:
54b306308757c0ce3cf47a50bac12bb39f212ca6b2José Fonseca      return PIPE_FORMAT_B4G4R4A4_UNORM;
55544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   case VG_sL_8:
56544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   case VG_lL_8:
57544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return PIPE_FORMAT_L8_UNORM;
58544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   case VG_BW_1:
59b306308757c0ce3cf47a50bac12bb39f212ca6b2José Fonseca      return PIPE_FORMAT_B8G8R8A8_UNORM;
60544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   case VG_A_8:
61544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return PIPE_FORMAT_A8_UNORM;
62544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#ifdef OPENVG_VERSION_1_1
63544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   case VG_A_1:
64544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   case VG_A_4:
65544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return PIPE_FORMAT_A8_UNORM;
66544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
67544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   default:
68b306308757c0ce3cf47a50bac12bb39f212ca6b2José Fonseca      return PIPE_FORMAT_B8G8R8A8_UNORM;
69544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
70544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
71544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
72544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE void vg_sync_size(VGfloat *src_loc, VGfloat *dst_loc)
73544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
74544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   src_loc[2] = MIN2(src_loc[2], dst_loc[2]);
75544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   src_loc[3] = MIN2(src_loc[3], dst_loc[3]);
76544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dst_loc[2] = src_loc[2];
77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dst_loc[3] = src_loc[3];
78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
79544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
8033ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wustatic void vg_get_copy_coords(VGfloat *src_loc,
8133ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu                               VGfloat src_width, VGfloat src_height,
8233ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu                               VGfloat *dst_loc,
8333ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu                               VGfloat dst_width, VGfloat dst_height)
84544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
85544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat dst_bounds[4], src_bounds[4];
86544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat src_shift[4], dst_shift[4], shift[4];
87544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
88544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dst_bounds[0] = 0.f;
89544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dst_bounds[1] = 0.f;
9033ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   dst_bounds[2] = dst_width;
9133ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   dst_bounds[3] = dst_height;
92544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
93544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   src_bounds[0] = 0.f;
94544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   src_bounds[1] = 0.f;
9533ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   src_bounds[2] = src_width;
9633ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   src_bounds[3] = src_height;
97544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
98544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_bound_rect(src_loc, src_bounds, src_shift);
99544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_bound_rect(dst_loc, dst_bounds, dst_shift);
100544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   shift[0] = src_shift[0] - dst_shift[0];
101544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   shift[1] = src_shift[1] - dst_shift[1];
102544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
103544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (shift[0] < 0)
104544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_shift_rectx(src_loc, src_bounds, -shift[0]);
105544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   else
106544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_shift_rectx(dst_loc, dst_bounds, shift[0]);
107544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
108544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (shift[1] < 0)
109544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_shift_recty(src_loc, src_bounds, -shift[1]);
110544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   else
111544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_shift_recty(dst_loc, dst_bounds, shift[1]);
112544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
113544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_sync_size(src_loc, dst_loc);
11433ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu}
11533ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu
11633ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wustatic void vg_copy_texture(struct vg_context *ctx,
11733ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu                            struct pipe_resource *dst, VGint dx, VGint dy,
11833ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu                            struct pipe_sampler_view *src, VGint sx, VGint sy,
11933ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu                            VGint width, VGint height)
12033ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu{
12133ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   VGfloat dst_loc[4], src_loc[4];
12233ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu
12333ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   dst_loc[0] = dx;
12433ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   dst_loc[1] = dy;
12533ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   dst_loc[2] = width;
12633ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   dst_loc[3] = height;
12733ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu
12833ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   src_loc[0] = sx;
12933ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   src_loc[1] = sy;
13033ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   src_loc[2] = width;
13133ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   src_loc[3] = height;
13233ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu
13333ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   vg_get_copy_coords(src_loc, src->texture->width0, src->texture->height0,
13433ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu                      dst_loc, dst->width0, dst->height0);
135544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
136544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (src_loc[2] >= 0 && src_loc[3] >= 0 &&
137544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       dst_loc[2] >= 0 && dst_loc[3] >= 0) {
13820ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu      struct pipe_surface *surf;
13920ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu
14020ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu      /* get the destination surface */
14120ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu      surf = ctx->pipe->screen->get_tex_surface(ctx->pipe->screen,
14220ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu            dst, 0, 0, 0, PIPE_BIND_RENDER_TARGET);
14320ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu      if (surf && renderer_copy_begin(ctx->renderer, surf, VG_TRUE, src)) {
14420ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu         renderer_copy(ctx->renderer,
14520ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu               dst_loc[0], dst_loc[1], dst_loc[2], dst_loc[3],
14620ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu               src_loc[0], src_loc[1], src_loc[2], src_loc[3]);
14720ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu         renderer_copy_end(ctx->renderer);
14820ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu      }
14920ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu
15020ce148c305200c760f34d2098d92bc77cb6deeeChia-I Wu      pipe_surface_reference(&surf, NULL);
151544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
152544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
153544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
154544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_copy_surface(struct vg_context *ctx,
155544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                     struct pipe_surface *dst, VGint dx, VGint dy,
156544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                     struct pipe_surface *src, VGint sx, VGint sy,
157544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                     VGint width, VGint height)
158544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
159544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat dst_loc[4], src_loc[4];
160544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
161544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dst_loc[0] = dx;
162544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dst_loc[1] = dy;
163544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dst_loc[2] = width;
164544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dst_loc[3] = height;
165544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
166544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   src_loc[0] = sx;
167544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   src_loc[1] = sy;
168544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   src_loc[2] = width;
169544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   src_loc[3] = height;
170544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
17133ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu   vg_get_copy_coords(src_loc, src->width, src->height,
17233ca973e7a6036566aa7363681419a58a30ab0f3Chia-I Wu                      dst_loc, dst->width, dst->height);
173544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
174544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (src_loc[2] > 0 && src_loc[3] > 0 &&
175544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       dst_loc[2] > 0 && dst_loc[3] > 0) {
176544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      if (src == dst)
177544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         renderer_copy_surface(ctx->renderer,
178544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src,
179544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src_loc[0],
180544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src->height - (src_loc[1] + src_loc[3]),
181544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src_loc[0] + src_loc[2],
182544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src->height - src_loc[1],
183544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst,
184544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst_loc[0],
185544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst->height - (dst_loc[1] + dst_loc[3]),
186544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst_loc[0] + dst_loc[2],
187544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst->height - dst_loc[1],
188544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               0, 0);
189544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      else
190544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         renderer_copy_surface(ctx->renderer,
191544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src,
192544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src_loc[0],
193544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src->height - src_loc[1],
194544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src_loc[0] + src_loc[2],
195544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               src->height - (src_loc[1] + src_loc[3]),
196544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst,
197544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst_loc[0],
198544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst->height - (dst_loc[1] + dst_loc[3]),
199544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst_loc[0] + dst_loc[2],
200544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               dst->height - dst_loc[1],
201544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               0, 0);
202544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
203544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
204544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
205544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
206287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic struct pipe_resource *image_texture(struct vg_image *img)
207544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
208287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *tex = img->sampler_view->texture;
209544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return tex;
210544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
211544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
212544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
213544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic void image_cleari(struct vg_image *img, VGint clear_colori,
214544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                         VGint x, VGint y, VGint width, VGint height)
215544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
216544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint *clearbuf;
217544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint i;
218544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat dwidth, dheight;
219544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
220544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   clearbuf = malloc(sizeof(VGint)*width*height);
221544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   for (i = 0; i < width*height; ++i)
222544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      clearbuf[i] = clear_colori;
223544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
224544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dwidth = MIN2(width, img->width);
225544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   dheight = MIN2(height, img->height);
226544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
227544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image_sub_data(img, clearbuf, width * sizeof(VGint),
228544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                  VG_sRGBA_8888,
229544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                  x, y, dwidth, dheight);
230544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   free(clearbuf);
231544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
232544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
233544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct vg_image * image_create(VGImageFormat format,
234544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                               VGint width, VGint height)
235544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
236544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
237e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   struct pipe_context *pipe = ctx->pipe;
238544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_image *image = CALLOC_STRUCT(vg_image);
239544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   enum pipe_format pformat = vg_format_to_pipe(format);
240287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource pt, *newtex;
241e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   struct pipe_sampler_view view_templ;
242e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   struct pipe_sampler_view *view;
243544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_screen *screen = ctx->pipe->screen;
244544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
245544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_init_object(&image->base, ctx, VG_OBJECT_IMAGE);
246544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
247544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->format = format;
248544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->width = width;
249544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->height = height;
250544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
251544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
252544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
253544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
254544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
255544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
256544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.normalized_coords = 1;
257544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
258544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(screen->is_format_supported(screen, pformat, PIPE_TEXTURE_2D,
259c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger                                      0, PIPE_BIND_SAMPLER_VIEW, 0));
260544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
261544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   memset(&pt, 0, sizeof(pt));
262544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   pt.target = PIPE_TEXTURE_2D;
263544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   pt.format = pformat;
264544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   pt.last_level = 0;
265d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   pt.width0 = width;
266d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   pt.height0 = height;
267d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   pt.depth0 = 1;
268287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pt.bind = PIPE_BIND_SAMPLER_VIEW;
269544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
270287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   newtex = screen->resource_create(screen, &pt);
271544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
272544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   debug_assert(newtex);
273544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
274e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   u_sampler_view_default_template(&view_templ, newtex, newtex->format);
275d873f1f5b63e7243c20751e92389e4189d39fd42Chia-I Wu   /* R, G, and B are treated as 1.0 for alpha-only formats in OpenVG */
276d873f1f5b63e7243c20751e92389e4189d39fd42Chia-I Wu   if (newtex->format == PIPE_FORMAT_A8_UNORM) {
277d873f1f5b63e7243c20751e92389e4189d39fd42Chia-I Wu      view_templ.swizzle_r = PIPE_SWIZZLE_ONE;
278d873f1f5b63e7243c20751e92389e4189d39fd42Chia-I Wu      view_templ.swizzle_g = PIPE_SWIZZLE_ONE;
279d873f1f5b63e7243c20751e92389e4189d39fd42Chia-I Wu      view_templ.swizzle_b = PIPE_SWIZZLE_ONE;
280d873f1f5b63e7243c20751e92389e4189d39fd42Chia-I Wu   }
281d873f1f5b63e7243c20751e92389e4189d39fd42Chia-I Wu
282e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   view = pipe->create_sampler_view(pipe, newtex, &view_templ);
283e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   /* want the texture to go away if the view is freed */
284287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&newtex, NULL);
285e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger
286e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   image->sampler_view = view;
287544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
288544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_context_add_object(ctx, VG_OBJECT_IMAGE, image);
289544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
290544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image_cleari(image, 0, 0, 0, image->width, image->height);
291544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return image;
292544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
293544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
294544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid image_destroy(struct vg_image *img)
295544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
296544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
297544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_context_remove_object(ctx, VG_OBJECT_IMAGE, img);
298544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
299544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
300544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (img->parent) {
301544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      /* remove img from the parent child array */
302544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      int idx;
303544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      struct vg_image **array =
304544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         (struct vg_image **)img->parent->children_array->data;
305544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
306544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      for (idx = 0; idx < img->parent->children_array->num_elements; ++idx) {
307544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         struct vg_image *child = array[idx];
308544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         if (child == img) {
309544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin            break;
310544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         }
311544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      }
312544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      debug_assert(idx < img->parent->children_array->num_elements);
313544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      array_remove_element(img->parent->children_array, idx);
314544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
315544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
316544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (img->children_array && img->children_array->num_elements) {
317544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      /* reparent the children */
318544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      VGint i;
319544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      struct vg_image *parent = img->parent;
320544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      struct vg_image **children =
321544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         (struct vg_image **)img->children_array->data;
322544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      if (!parent) {
323544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         VGint min_x = children[0]->x;
324544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         parent = children[0];
325544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
326544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         for (i = 1; i < img->children_array->num_elements; ++i) {
327544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin            struct vg_image *child = children[i];
328544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin            if (child->x < min_x) {
329544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin               parent = child;
330544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin            }
331544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         }
332544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      }
333544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
334544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      for (i = 0; i < img->children_array->num_elements; ++i) {
335544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         struct vg_image *child = children[i];
336544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         if (child != parent) {
337544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin            child->parent = parent;
338544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin            if (!parent->children_array) {
339544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin               parent->children_array = array_create(
340544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                  sizeof(struct vg_image*));
341544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin            }
342544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin            array_append_data(parent->children_array,
343544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                              &child, 1);
344544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         } else
345544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin            child->parent = NULL;
346544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      }
347544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      array_destroy(img->children_array);
348544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
349544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
350e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   pipe_sampler_view_reference(&img->sampler_view, NULL);
351f914cd1796845164109c837a111c39ba64852ad4nobled   FREE(img);
352544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
353544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
354544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid image_clear(struct vg_image *img,
355544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                 VGint x, VGint y, VGint width, VGint height)
356544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
357544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
358544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat *clear_colorf = ctx->state.vg.clear_color;
359544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGubyte r, g, b ,a;
360544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint clear_colori;
361544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* FIXME: this is very nasty */
362544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   r = float_to_ubyte(clear_colorf[0]);
363544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   g = float_to_ubyte(clear_colorf[1]);
364544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   b = float_to_ubyte(clear_colorf[2]);
365544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   a = float_to_ubyte(clear_colorf[3]);
366544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   clear_colori = r << 24 | g << 16 | b << 8 | a;
367544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image_cleari(img, clear_colori, x, y, width, height);
368544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
369544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
370544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid image_sub_data(struct vg_image *image,
371544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                    const void * data,
372544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                    VGint dataStride,
373544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                    VGImageFormat dataFormat,
374544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                    VGint x, VGint y,
375544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                    VGint width, VGint height)
376544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
377544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const VGint yStep = 1;
378544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGubyte *src = (VGubyte *)data;
379544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
380544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat *df = (VGfloat*)temp;
381544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint i;
382544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
383b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell   struct pipe_context *pipe = ctx->pipe;
384287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *texture = image_texture(image);
385544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint xoffset = 0, yoffset = 0;
386544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
387544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (x < 0) {
388544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      xoffset -= x;
389544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      width += x;
390544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      x = 0;
391544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
392544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (y < 0) {
393544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      yoffset -= y;
394544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      height += y;
395544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      y = 0;
396544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
397544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
398544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0) {
399544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
400544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
401544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
402544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
403544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (x > image->width || y > image->width) {
404544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
405544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
406544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
407544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
408544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (x + width > image->width) {
409544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      width = image->width - x;
410544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
411544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
412544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (y + height > image->height) {
413544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      height = image->height - y;
414544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
415544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
416544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   { /* upload color_data */
417287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      struct pipe_transfer *transfer = pipe_get_transfer(
418b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell         pipe, texture, 0, 0, 0,
419d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger         PIPE_TRANSFER_WRITE, 0, 0, texture->width0, texture->height0);
420544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      src += (dataStride * yoffset);
421544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      for (i = 0; i < height; i++) {
422544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         _vega_unpack_float_span_rgba(ctx, width, xoffset, src, dataFormat, temp);
423d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell         pipe_put_tile_rgba(pipe, transfer, x+image->x, y+image->y, width, 1, df);
424544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         y += yStep;
425544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         src += dataStride;
426544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      }
427287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe->transfer_destroy(pipe, transfer);
428544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
429544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
430544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
431544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid image_get_sub_data(struct vg_image * image,
432544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                        void * data,
433544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                        VGint dataStride,
434544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                        VGImageFormat dataFormat,
435544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                        VGint sx, VGint sy,
436544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                        VGint width, VGint height)
437544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
438544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
439544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_context *pipe = ctx->pipe;
440544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
441544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat *df = (VGfloat*)temp;
442544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint y = 0, yStep = 1;
443544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint i;
444544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGubyte *dst = (VGubyte *)data;
445544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
446544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   {
447544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      struct pipe_transfer *transfer =
448287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         pipe_get_transfer(pipe,
449e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger                                  image->sampler_view->texture,  0, 0, 0,
450544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                                  PIPE_TRANSFER_READ,
451544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                                  0, 0,
452544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                                  image->x + image->width,
453544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                                  image->y + image->height);
454544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      /* Do a row at a time to flip image data vertically */
455544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      for (i = 0; i < height; i++) {
456544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if 0
457544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         debug_printf("%d-%d  == %d\n", sy, height, y);
458544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
459d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell         pipe_get_tile_rgba(pipe, transfer, sx+image->x, y, width, 1, df);
460544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         y += yStep;
461544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         _vega_pack_rgba_span_float(ctx, width, temp, dataFormat, dst);
462544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         dst += dataStride;
463544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      }
464544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
465287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe->transfer_destroy(pipe, transfer);
466544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
467544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
468544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
469544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct vg_image * image_child_image(struct vg_image *parent,
470544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                                    VGint x, VGint y,
471544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                                    VGint width, VGint height)
472544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
473544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
474544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_image *image = CALLOC_STRUCT(vg_image);
475544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
476544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_init_object(&image->base, ctx, VG_OBJECT_IMAGE);
477544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
478544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->x = parent->x + x;
479544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->y = parent->y + y;
480544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->width = width;
481544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->height = height;
482544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->parent = parent;
483e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   image->sampler_view = NULL;
484e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   pipe_sampler_view_reference(&image->sampler_view,
485e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger                               parent->sampler_view);
486544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
487544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
488544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
489544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
490544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
491544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
492544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   image->sampler.normalized_coords = 1;
493544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
494544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!parent->children_array)
495544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      parent->children_array = array_create(
496544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin         sizeof(struct vg_image*));
497544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
498544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   array_append_data(parent->children_array,
499544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                     &image, 1);
500544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
501544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_context_add_object(ctx, VG_OBJECT_IMAGE, image);
502544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
503544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return image;
504544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
505544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
506544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid image_copy(struct vg_image *dst, VGint dx, VGint dy,
507544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                struct vg_image *src, VGint sx, VGint sy,
508544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                VGint width, VGint height,
509544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                VGboolean dither)
510544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
511544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
512544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
513544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (width <= 0 || height <= 0) {
514544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
515544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
516544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
517544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* make sure rendering has completed */
518544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   ctx->pipe->flush(ctx->pipe, PIPE_FLUSH_RENDER_CACHE, NULL);
519e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   vg_copy_texture(ctx, dst->sampler_view->texture, dst->x + dx, dst->y + dy,
520e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger                   src->sampler_view, src->x + sx, src->y + sy, width, height);
521544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
522544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
52334f466d4e6a720138c0846ab6233c32dc039fe58Chia-I Wuvoid image_draw(struct vg_image *img, struct matrix *matrix)
524544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
525544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
526b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu   struct matrix paint_matrix;
527544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat x1, y1;
528544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat x2, y2;
529544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat x3, y3;
530544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat x4, y4;
531544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
532b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu   if (vg_get_paint_matrix(ctx,
533b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu                           &ctx->state.vg.fill_paint_to_user_matrix,
534b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu                           matrix,
535b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu                           &paint_matrix))
536b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu      return;
537b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu
538544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   x1 = 0;
539544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   y1 = 0;
540544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   x2 = img->width;
541544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   y2 = 0;
542544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   x3 = img->width;
543544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   y3 = img->height;
544544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   x4 = 0;
545544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   y4 = img->height;
546544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
547544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   matrix_map_point(matrix, x1, y1, &x1, &y1);
548544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   matrix_map_point(matrix, x2, y2, &x2, &y2);
549544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   matrix_map_point(matrix, x3, y3, &x3, &y3);
550544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   matrix_map_point(matrix, x4, y4, &x4, &y4);
551544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
552544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   shader_set_drawing_image(ctx->shader, VG_TRUE);
553544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   shader_set_paint(ctx->shader, ctx->state.vg.fill_paint);
554b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu   shader_set_paint_matrix(ctx->shader, &paint_matrix);
555544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   shader_set_image(ctx->shader, img);
556544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   shader_bind(ctx->shader);
557544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
558544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   renderer_texture_quad(ctx->renderer, image_texture(img),
559544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                         img->x, img->y, img->x + img->width, img->y + img->height,
560544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                         x1, y1, x2, y2, x3, y3, x4, y4);
561544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
562544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
563544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid image_set_pixels(VGint dx, VGint dy,
564544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                      struct vg_image *src, VGint sx, VGint sy,
565544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                      VGint width, VGint height)
566544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
567544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
568544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_context *pipe = ctx->pipe;
569544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_screen *screen = pipe->screen;
570544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_surface *surf;
571544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct st_renderbuffer *strb = ctx->draw_buffer->strb;
572544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
573544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* make sure rendering has completed */
574544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL);
575544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
576544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   surf = screen->get_tex_surface(screen, image_texture(src),  0, 0, 0,
577c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger                                  0 /* no bind flags as surf isn't actually used??? */);
578544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
579544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_copy_surface(ctx, strb->surface, dx, dy,
580544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                   surf, sx+src->x, sy+src->y, width, height);
581544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
582544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   screen->tex_surface_destroy(surf);
583544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
584544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
585544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid image_get_pixels(struct vg_image *dst, VGint dx, VGint dy,
586544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                      VGint sx, VGint sy,
587544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                      VGint width, VGint height)
588544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
589544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *ctx = vg_current_context();
590544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_context *pipe = ctx->pipe;
591544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_screen *screen = pipe->screen;
592544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_surface *surf;
593544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct st_renderbuffer *strb = ctx->draw_buffer->strb;
594544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
595544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* flip the y coordinates */
596544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /*dy = dst->height - dy - height;*/
597544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
598544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* make sure rendering has completed */
599544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL);
600544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
601544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   surf = screen->get_tex_surface(screen, image_texture(dst),  0, 0, 0,
602c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger                                  0 /* no bind flags as surf isn't actually used??? */);
603287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
604544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   vg_copy_surface(ctx, surf, dst->x + dx, dst->y + dy,
605544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                   strb->surface, sx, sy, width, height);
606544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
607544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   pipe_surface_reference(&surf, NULL);
608544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
609544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
610544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
611544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack RusinVGboolean vg_image_overlaps(struct vg_image *dst,
612544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                            struct vg_image *src)
613544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
614544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (dst == src || dst->parent == src ||
615544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       dst == src->parent)
616544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return VG_TRUE;
617544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (dst->parent && dst->parent == src->parent) {
618544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      VGfloat left1 = dst->x;
619544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      VGfloat left2 = src->x;
620544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      VGfloat right1 = dst->x + dst->width;
621544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      VGfloat right2 = src->x + src->width;
622544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      VGfloat bottom1 = dst->y;
623544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      VGfloat bottom2 = src->y;
624544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      VGfloat top1 = dst->y + dst->height;
625544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      VGfloat top2 = src->y + src->height;
626544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
627544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return !(left2 > right1 || right2 < left1 ||
628544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin               top2 > bottom1 || bottom2 < top1);
629544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
630544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return VG_FALSE;
631544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
632544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
633544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack RusinVGint image_bind_samplers(struct vg_image *img, struct pipe_sampler_state **samplers,
634e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger                          struct pipe_sampler_view **sampler_views)
635544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
636544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   img->sampler.min_img_filter = image_sampler_filter(img->base.ctx);
637544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   img->sampler.mag_img_filter = image_sampler_filter(img->base.ctx);
638544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   samplers[3] = &img->sampler;
639e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   sampler_views[3] = img->sampler_view;
640544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return 1;
641544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
642544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
643544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack RusinVGint image_sampler_filter(struct vg_context *ctx)
644544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
645544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    switch(ctx->state.vg.image_quality) {
646544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    case VG_IMAGE_QUALITY_NONANTIALIASED:
647544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       return PIPE_TEX_FILTER_NEAREST;
648544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       break;
649544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    case VG_IMAGE_QUALITY_FASTER:
650544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       return PIPE_TEX_FILTER_NEAREST;
651544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       break;
652544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    case VG_IMAGE_QUALITY_BETTER:
653f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri       /* possibly use anisotropic filtering */
654544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       return PIPE_TEX_FILTER_LINEAR;
655544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       break;
656544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    default:
657544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin       debug_printf("Unknown image quality");
658544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    }
659544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    return PIPE_TEX_FILTER_NEAREST;
660544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
661