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