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