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#ifndef VG_CONTEXT_H 28544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#define VG_CONTEXT_H 29544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 30544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_state.h" 31544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 32544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_format.h" 33544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_state.h" 34544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_pointer.h" 35544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_math.h" 368bcd616a3ffd040ef28b61b38b22da2dad9e2242Chia-I Wu#include "state_tracker/st_api.h" 37544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 38544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "cso_cache/cso_hash.h" 39544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "cso_cache/cso_context.h" 40544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 41544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct renderer; 42544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct shaders_cache; 43544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct shader; 44544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct vg_shader; 4575143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wustruct mapi_table; 46544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 47544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct st_renderbuffer { 48544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin enum pipe_format format; 49544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_surface *surface; 50287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *texture; 51544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGint width, height; 52544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}; 53544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 54544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct st_framebuffer { 551ed63119452396e764a0f5b11db78903a2594df1Chia-I Wu VGint width, height; 56544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct st_renderbuffer *strb; 57544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct st_renderbuffer *dsrb; 58544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 59c91c38601234dc67fa356160cbe3bd389cac083aChia-I Wu struct pipe_sampler_view *surface_mask_view; 60e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger 61e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger struct pipe_sampler_view *blend_texture_view; 62544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 63544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 648bcd616a3ffd040ef28b61b38b22da2dad9e2242Chia-I Wu struct st_framebuffer_iface *iface; 658bcd616a3ffd040ef28b61b38b22da2dad9e2242Chia-I Wu enum st_attachment_type strb_att; 668bcd616a3ffd040ef28b61b38b22da2dad9e2242Chia-I Wu 67544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin void *privateData; 68ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom int32_t stamp; 69ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom int32_t iface_stamp; 70544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}; 71544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 72544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinenum vg_object_type { 73544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VG_OBJECT_UNKNOWN = 0, 74544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VG_OBJECT_PAINT, 75544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VG_OBJECT_IMAGE, 76544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VG_OBJECT_MASK, 77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VG_OBJECT_FONT, 78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VG_OBJECT_PATH, 79544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 80544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VG_OBJECT_LAST 81544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}; 82544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinenum dirty_state { 83d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu BLEND_DIRTY = 1 << 0, 84d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu FRAMEBUFFER_DIRTY = 1 << 1, 85d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu DEPTH_STENCIL_DIRTY = 1 << 2, 863f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu PAINT_DIRTY = 1 << 3, 87d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu 88d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu ALL_DIRTY = BLEND_DIRTY | 89d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu FRAMEBUFFER_DIRTY | 903f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu DEPTH_STENCIL_DIRTY | 913f0a966807f03a364edea0272ddf45f08ab7ce4fChia-I Wu PAINT_DIRTY 92544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}; 93544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 94544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct vg_context 95544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 968bcd616a3ffd040ef28b61b38b22da2dad9e2242Chia-I Wu struct st_context_iface iface; 9775143ef05576ee9f25ee176bc28c3c4d03705bf5Chia-I Wu struct mapi_table *dispatch; 988bcd616a3ffd040ef28b61b38b22da2dad9e2242Chia-I Wu 99544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_context *pipe; 100982aba97c581bab0ff55dc9cae4164ab30dfbeaeChia-I Wu enum pipe_format ds_format; 101544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 102544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct { 103544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_state vg; 104544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGbitfield dirty; 105544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } state; 106544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 107544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGErrorCode _error; 108544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 109544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct st_framebuffer *draw_buffer; 110544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 111544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct cso_hash *owned_objects[VG_OBJECT_LAST]; 112544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 113544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct { 114287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *cbuf; 115544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_sampler_state sampler; 116544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 117544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_shader *union_fs; 118544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_shader *intersect_fs; 119544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_shader *subtract_fs; 120544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_shader *set_fs; 121544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } mask; 122544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 123544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct cso_context *cso_context; 124544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 125544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct renderer *renderer; 126544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct shaders_cache *sc; 127544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct shader *shader; 128544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 129544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct pipe_sampler_state blend_sampler; 130544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_paint *default_paint; 131544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 132544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct blit_state *blit; 133ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom 134ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom int32_t draw_stamp; 135544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}; 136544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 13799c67f27d35a4bbbbefada8117d5972c7583cf42Brian Paul 13899c67f27d35a4bbbbefada8117d5972c7583cf42Brian Paul/** 13999c67f27d35a4bbbbefada8117d5972c7583cf42Brian Paul * Base class for VG objects like paths, images, fonts. 14099c67f27d35a4bbbbefada8117d5972c7583cf42Brian Paul */ 141544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct vg_object { 142544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin enum vg_object_type type; 14399c67f27d35a4bbbbefada8117d5972c7583cf42Brian Paul VGHandle handle; 144544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *ctx; 145544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}; 14699c67f27d35a4bbbbefada8117d5972c7583cf42Brian Paul 14799c67f27d35a4bbbbefada8117d5972c7583cf42Brian Paul 148544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_init_object(struct vg_object *obj, struct vg_context *ctx, enum vg_object_type type); 14999c67f27d35a4bbbbefada8117d5972c7583cf42Brian Paulvoid vg_free_object(struct vg_object *obj); 15099c67f27d35a4bbbbefada8117d5972c7583cf42Brian Paul 151d41e694cf78ada8c9258f96995115c9da8437894Brian PaulVGboolean vg_object_is_valid(VGHandle object, enum vg_object_type type); 152544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 153544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct vg_context *vg_create_context(struct pipe_context *pipe, 154544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin const void *visual, 155544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin struct vg_context *share); 156544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_destroy_context(struct vg_context *ctx); 157544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct vg_context *vg_current_context(void); 158544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_set_current_context(struct vg_context *ctx); 159544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 160544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack RusinVGboolean vg_context_is_object_valid(struct vg_context *ctx, 161544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin enum vg_object_type type, 162d41e694cf78ada8c9258f96995115c9da8437894Brian Paul VGHandle object); 163544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_context_add_object(struct vg_context *ctx, 164ceb6d34906c7c03c102c7e78dd02f5b0ebab4ca9Chia-I Wu struct vg_object *obj); 165544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_context_remove_object(struct vg_context *ctx, 166ceb6d34906c7c03c102c7e78dd02f5b0ebab4ca9Chia-I Wu struct vg_object *obj); 167544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 168544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_validate_state(struct vg_context *ctx); 169544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 170544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid vg_set_error(struct vg_context *ctx, 171544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGErrorCode code); 172544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 17304f342b4170366e417aa0c414cc536337270d3abChia-I Wustruct pipe_sampler_view *vg_prepare_blend_surface(struct vg_context *ctx); 17404f342b4170366e417aa0c414cc536337270d3abChia-I Wustruct pipe_sampler_view *vg_prepare_blend_surface_from_mask(struct vg_context *ctx); 175544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 176c91c38601234dc67fa356160cbe3bd389cac083aChia-I Wustruct pipe_sampler_view *vg_get_surface_mask(struct vg_context *ctx); 177c91c38601234dc67fa356160cbe3bd389cac083aChia-I Wu 178b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I WuVGboolean vg_get_paint_matrix(struct vg_context *ctx, 179b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu const struct matrix *paint_to_user, 180b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu const struct matrix *user_to_surface, 181b06de80843e7d096bed4ae03ddc5e2842f1876afChia-I Wu struct matrix *mat); 182544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 183544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE VGboolean is_aligned_to(const void *ptr, VGbyte alignment) 184544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 185544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin void *aligned = align_pointer(ptr, alignment); 186544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return (ptr == aligned) ? VG_TRUE : VG_FALSE; 187544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 188544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 189544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE VGboolean is_aligned(const void *ptr) 190544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 191544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return is_aligned_to(ptr, 4); 192544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 193544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 194544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE void vg_shift_rectx(VGfloat coords[4], 195544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin const VGfloat *bounds, 196544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin const VGfloat shift) 197544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 198544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[0] += shift; 199544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[2] -= shift; 200544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (bounds) { 201544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[2] = MIN2(coords[2], bounds[2]); 202544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* bound x/y + width/height */ 203544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) { 204544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[2] = (bounds[0] + bounds[2]) - coords[0]; 205544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 206544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 207544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 208544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 209544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE void vg_shift_recty(VGfloat coords[4], 210544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin const VGfloat *bounds, 211544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin const VGfloat shift) 212544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 213544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[1] += shift; 214544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[3] -= shift; 215544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (bounds) { 216544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[3] = MIN2(coords[3], bounds[3]); 217544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) { 218544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[3] = (bounds[1] + bounds[3]) - coords[1]; 219544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 220544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 221544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 222544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 223544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic INLINE void vg_bound_rect(VGfloat coords[4], 224544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin const VGfloat bounds[4], 225544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin VGfloat shift[4]) 226544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{ 227544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* if outside the bounds */ 228544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (coords[0] > (bounds[0] + bounds[2]) || 229544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[1] > (bounds[1] + bounds[3]) || 230544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin (coords[0] + coords[2]) < bounds[0] || 231544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin (coords[1] + coords[3]) < bounds[1]) { 232544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[0] = 0.f; 233544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[1] = 0.f; 234544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[2] = 0.f; 235544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[3] = 0.f; 236544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shift[0] = 0.f; 237544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shift[1] = 0.f; 238544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 239544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 240544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 241544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* bound x */ 242544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (coords[0] < bounds[0]) { 243544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shift[0] = bounds[0] - coords[0]; 244544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[2] -= shift[0]; 245544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[0] = bounds[0]; 246544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } else 247544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shift[0] = 0.f; 248544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 249544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* bound y */ 250544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if (coords[1] < bounds[1]) { 251544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shift[1] = bounds[1] - coords[1]; 252544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[3] -= shift[1]; 253544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[1] = bounds[1]; 254544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } else 255544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shift[1] = 0.f; 256544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 257544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shift[2] = bounds[2] - coords[2]; 258544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin shift[3] = bounds[3] - coords[3]; 259544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* bound width/height */ 260544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[2] = MIN2(coords[2], bounds[2]); 261544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[3] = MIN2(coords[3], bounds[3]); 262544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 263544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* bound x/y + width/height */ 264544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) { 265544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[2] = (bounds[0] + bounds[2]) - coords[0]; 266544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 267544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) { 268544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[3] = (bounds[1] + bounds[3]) - coords[1]; 269544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 270544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 271544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin /* if outside the bounds */ 272544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin if ((coords[0] + coords[2]) < bounds[0] || 273544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin (coords[1] + coords[3]) < bounds[1]) { 274544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[0] = 0.f; 275544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[1] = 0.f; 276544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[2] = 0.f; 277544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin coords[3] = 0.f; 278544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin return; 279544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin } 280544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin} 281544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin 282544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif 283