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