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#ifndef VG_CONTEXT_H 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VG_CONTEXT_H 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vg_state.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_format.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pointer.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/st_api.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_hash.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_context.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct renderer; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct shaders_cache; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct shader; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vg_shader; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct mapi_table; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_renderbuffer { 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *surface; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *texture; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint width, height; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_framebuffer { 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGint width, height; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_renderbuffer *strb; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_renderbuffer *dsrb; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *surface_mask_view; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *blend_texture_view; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_framebuffer_iface *iface; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum st_attachment_type strb_att; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *privateData; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int32_t stamp; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int32_t iface_stamp; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum vg_object_type { 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_OBJECT_UNKNOWN = 0, 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_OBJECT_PAINT, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_OBJECT_IMAGE, 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_OBJECT_MASK, 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_OBJECT_FONT, 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_OBJECT_PATH, 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VG_OBJECT_LAST 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum dirty_state { 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BLEND_DIRTY = 1 << 0, 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FRAMEBUFFER_DIRTY = 1 << 1, 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEPTH_STENCIL_DIRTY = 1 << 2, 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PAINT_DIRTY = 1 << 3, 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ALL_DIRTY = BLEND_DIRTY | 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FRAMEBUFFER_DIRTY | 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEPTH_STENCIL_DIRTY | 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PAINT_DIRTY 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vg_context 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_context_iface iface; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mapi_table *dispatch; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format ds_format; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_state vg; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGbitfield dirty; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } state; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGErrorCode _error; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_framebuffer *draw_buffer; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_hash *owned_objects[VG_OBJECT_LAST]; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *cbuf; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_state sampler; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_shader *union_fs; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_shader *intersect_fs; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_shader *subtract_fs; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_shader *set_fs; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } mask; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cso_context *cso_context; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct renderer *renderer; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct shaders_cache *sc; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct shader *shader; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_state blend_sampler; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_paint *default_paint; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct blit_state *blit; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int32_t draw_stamp; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Base class for VG objects like paths, images, fonts. 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vg_object { 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum vg_object_type type; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGHandle handle; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_context *ctx; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vg_init_object(struct vg_object *obj, struct vg_context *ctx, enum vg_object_type type); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vg_free_object(struct vg_object *obj); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean vg_object_is_valid(VGHandle object, enum vg_object_type type); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vg_context *vg_create_context(struct pipe_context *pipe, 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *visual, 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_context *share); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vg_destroy_context(struct vg_context *ctx); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vg_context *vg_current_context(void); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vg_set_current_context(struct vg_context *ctx); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean vg_context_is_object_valid(struct vg_context *ctx, 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum vg_object_type type, 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGHandle object); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vg_context_add_object(struct vg_context *ctx, 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_object *obj); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vg_context_remove_object(struct vg_context *ctx, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vg_object *obj); 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vg_validate_state(struct vg_context *ctx); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid vg_set_error(struct vg_context *ctx, 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGErrorCode code); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_sampler_view *vg_prepare_blend_surface(struct vg_context *ctx); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_sampler_view *vg_prepare_blend_surface_from_mask(struct vg_context *ctx); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_sampler_view *vg_get_surface_mask(struct vg_context *ctx); 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean vg_get_paint_matrix(struct vg_context *ctx, 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct matrix *paint_to_user, 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct matrix *user_to_surface, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct matrix *mat); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE VGboolean is_aligned_to(const void *ptr, VGbyte alignment) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *aligned = align_pointer(ptr, alignment); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ptr == aligned) ? VG_TRUE : VG_FALSE; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE VGboolean is_aligned(const void *ptr) 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return is_aligned_to(ptr, 4); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void vg_shift_rectx(VGfloat coords[4], 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const VGfloat *bounds, 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const VGfloat shift) 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[0] += shift; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[2] -= shift; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bounds) { 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[2] = MIN2(coords[2], bounds[2]); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bound x/y + width/height */ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) { 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[2] = (bounds[0] + bounds[2]) - coords[0]; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void vg_shift_recty(VGfloat coords[4], 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const VGfloat *bounds, 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const VGfloat shift) 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[1] += shift; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[3] -= shift; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bounds) { 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[3] = MIN2(coords[3], bounds[3]); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) { 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[3] = (bounds[1] + bounds[3]) - coords[1]; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void vg_bound_rect(VGfloat coords[4], 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const VGfloat bounds[4], 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VGfloat shift[4]) 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if outside the bounds */ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (coords[0] > (bounds[0] + bounds[2]) || 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[1] > (bounds[1] + bounds[3]) || 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (coords[0] + coords[2]) < bounds[0] || 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (coords[1] + coords[3]) < bounds[1]) { 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[0] = 0.f; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[1] = 0.f; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[2] = 0.f; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[3] = 0.f; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift[0] = 0.f; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift[1] = 0.f; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bound x */ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (coords[0] < bounds[0]) { 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift[0] = bounds[0] - coords[0]; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[2] -= shift[0]; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[0] = bounds[0]; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift[0] = 0.f; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bound y */ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (coords[1] < bounds[1]) { 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift[1] = bounds[1] - coords[1]; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[3] -= shift[1]; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[1] = bounds[1]; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift[1] = 0.f; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift[2] = bounds[2] - coords[2]; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shift[3] = bounds[3] - coords[3]; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bound width/height */ 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[2] = MIN2(coords[2], bounds[2]); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[3] = MIN2(coords[3], bounds[3]); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bound x/y + width/height */ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) { 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[2] = (bounds[0] + bounds[2]) - coords[0]; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) { 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[3] = (bounds[1] + bounds[3]) - coords[1]; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if outside the bounds */ 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((coords[0] + coords[2]) < bounds[0] || 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (coords[1] + coords[3]) < bounds[1]) { 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[0] = 0.f; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[1] = 0.f; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[2] = 0.f; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[3] = 0.f; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 283