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