summaryrefslogtreecommitdiff
path: root/src/gallium
diff options
context:
space:
mode:
authorJose Fonseca <jfonseca@vmware.com>2015-03-03 16:58:21 +0000
committerJose Fonseca <jfonseca@vmware.com>2015-03-04 11:01:45 +0000
commit3acd7a34ab05b87521b74f626ec637e7fdcc6595 (patch)
treeec442924dfbd3e1f10786b28b3c2d9bc17c85ffe /src/gallium
parent5564c361b5cc1f5ec4be3622d7f9be601e3c268a (diff)
st/vega: Remove.
OpenVG API seems to have dwindled away. The code would still be interesting if we wanted to implement NV_path_rendering but given the trend of the next gen graphics APIs, it seems unlikely that this becomes ARB or core. v2: Remove a few "openvg" references left, per Emil Velikov. Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com> v3: Update release notes.
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/Makefile.am5
-rw-r--r--src/gallium/SConscript2
-rw-r--r--src/gallium/docs/source/distro.rst13
-rw-r--r--src/gallium/state_trackers/vega/.gitignore1
-rw-r--r--src/gallium/state_trackers/vega/Makefile.am42
-rw-r--r--src/gallium/state_trackers/vega/Makefile.sources56
-rw-r--r--src/gallium/state_trackers/vega/SConscript30
-rw-r--r--src/gallium/state_trackers/vega/api.c74
-rw-r--r--src/gallium/state_trackers/vega/api.h47
-rw-r--r--src/gallium/state_trackers/vega/api_consts.h56
-rw-r--r--src/gallium/state_trackers/vega/api_context.c81
-rw-r--r--src/gallium/state_trackers/vega/api_filters.c705
-rw-r--r--src/gallium/state_trackers/vega/api_images.c492
-rw-r--r--src/gallium/state_trackers/vega/api_masks.c246
-rw-r--r--src/gallium/state_trackers/vega/api_misc.c84
-rw-r--r--src/gallium/state_trackers/vega/api_paint.c172
-rw-r--r--src/gallium/state_trackers/vega/api_params.c1679
-rw-r--r--src/gallium/state_trackers/vega/api_path.c487
-rw-r--r--src/gallium/state_trackers/vega/api_text.c209
-rw-r--r--src/gallium/state_trackers/vega/api_transform.c129
-rw-r--r--src/gallium/state_trackers/vega/arc.c709
-rw-r--r--src/gallium/state_trackers/vega/arc.h80
-rw-r--r--src/gallium/state_trackers/vega/asm_fill.h693
-rw-r--r--src/gallium/state_trackers/vega/asm_filters.h117
-rw-r--r--src/gallium/state_trackers/vega/asm_util.h85
-rw-r--r--src/gallium/state_trackers/vega/bezier.c706
-rw-r--r--src/gallium/state_trackers/vega/bezier.h81
-rw-r--r--src/gallium/state_trackers/vega/handle.c93
-rw-r--r--src/gallium/state_trackers/vega/handle.h172
-rw-r--r--src/gallium/state_trackers/vega/image.c653
-rw-r--r--src/gallium/state_trackers/vega/image.h104
-rw-r--r--src/gallium/state_trackers/vega/mask.c523
-rw-r--r--src/gallium/state_trackers/vega/mask.h68
-rw-r--r--src/gallium/state_trackers/vega/matrix.h462
-rw-r--r--src/gallium/state_trackers/vega/paint.c759
-rw-r--r--src/gallium/state_trackers/vega/paint.h123
-rw-r--r--src/gallium/state_trackers/vega/path.c2077
-rw-r--r--src/gallium/state_trackers/vega/path.h126
-rw-r--r--src/gallium/state_trackers/vega/path_utils.h109
-rw-r--r--src/gallium/state_trackers/vega/polygon.c351
-rw-r--r--src/gallium/state_trackers/vega/polygon.h75
-rw-r--r--src/gallium/state_trackers/vega/renderer.c1558
-rw-r--r--src/gallium/state_trackers/vega/renderer.h159
-rw-r--r--src/gallium/state_trackers/vega/shader.c414
-rw-r--r--src/gallium/state_trackers/vega/shader.h63
-rw-r--r--src/gallium/state_trackers/vega/shaders_cache.c462
-rw-r--r--src/gallium/state_trackers/vega/shaders_cache.h120
-rw-r--r--src/gallium/state_trackers/vega/stroker.c1351
-rw-r--r--src/gallium/state_trackers/vega/stroker.h89
-rw-r--r--src/gallium/state_trackers/vega/text.c250
-rw-r--r--src/gallium/state_trackers/vega/text.h71
-rw-r--r--src/gallium/state_trackers/vega/util_array.h122
-rw-r--r--src/gallium/state_trackers/vega/vg_api.h36
-rw-r--r--src/gallium/state_trackers/vega/vg_context.c537
-rw-r--r--src/gallium/state_trackers/vega/vg_context.h280
-rw-r--r--src/gallium/state_trackers/vega/vg_manager.c399
-rw-r--r--src/gallium/state_trackers/vega/vg_manager.h40
-rw-r--r--src/gallium/state_trackers/vega/vg_state.c124
-rw-r--r--src/gallium/state_trackers/vega/vg_state.h109
-rw-r--r--src/gallium/state_trackers/vega/vg_translate.c1097
-rw-r--r--src/gallium/state_trackers/vega/vg_translate.h49
-rw-r--r--src/gallium/state_trackers/vega/vgu.c441
62 files changed, 0 insertions, 20547 deletions
diff --git a/src/gallium/Makefile.am b/src/gallium/Makefile.am
index 2ac902beaf8..652cb1310b9 100644
--- a/src/gallium/Makefile.am
+++ b/src/gallium/Makefile.am
@@ -136,11 +136,6 @@ if HAVE_DRICOMMON
SUBDIRS += state_trackers/dri targets/dri
endif
-## the egl target depends on vega
-if HAVE_OPENVG
-SUBDIRS += state_trackers/vega
-endif
-
if HAVE_X11_DRIVER
SUBDIRS += state_trackers/glx/xlib targets/libgl-xlib
endif
diff --git a/src/gallium/SConscript b/src/gallium/SConscript
index 3f6a54df357..9b9011f7f01 100644
--- a/src/gallium/SConscript
+++ b/src/gallium/SConscript
@@ -61,8 +61,6 @@ SConscript([
])
if not env['embedded']:
- SConscript('state_trackers/vega/SConscript')
-
if env['x11']:
SConscript([
'state_trackers/glx/xlib/SConscript',
diff --git a/src/gallium/docs/source/distro.rst b/src/gallium/docs/source/distro.rst
index d69c1860345..d8e9d4fc8b1 100644
--- a/src/gallium/docs/source/distro.rst
+++ b/src/gallium/docs/source/distro.rst
@@ -106,14 +106,6 @@ Tracker that implements the client-side DRI protocol, for providing direct
acceleration services to X11 servers with the DRI extension. Supports DRI1
and DRI2. Only GL is supported.
-.. _egl:
-
-EGL
-^^^
-
-Tracker for the Khronos EGL standard, used to set up GL and GLES contexts
-without extra knowledge of the underlying windowing system.
-
GLX
^^^
@@ -124,11 +116,6 @@ Tracker implementing a GL state machine. Not usable as a standalone tracker;
Mesa should be built with another state tracker, such as :ref:`DRI` or
:ref:`EGL`.
-OpenVG
-^^^^^^
-
-Tracker that implements the Khronos OpenVG standard.
-
VDPAU
^^^^^
diff --git a/src/gallium/state_trackers/vega/.gitignore b/src/gallium/state_trackers/vega/.gitignore
deleted file mode 100644
index c452229f7f4..00000000000
--- a/src/gallium/state_trackers/vega/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-api_tmp.h
diff --git a/src/gallium/state_trackers/vega/Makefile.am b/src/gallium/state_trackers/vega/Makefile.am
deleted file mode 100644
index 8985a4e4f4a..00000000000
--- a/src/gallium/state_trackers/vega/Makefile.am
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright © 2012 Intel Corporation
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice (including the next
-# paragraph) shall be included in all copies or substantial portions of the
-# Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# DEALINGS IN THE SOFTWARE.
-
-include Makefile.sources
-include $(top_srcdir)/src/gallium/Automake.inc
-
-AM_CFLAGS = $(GALLIUM_CFLAGS)
-AM_CPPFLAGS = \
- -I$(top_srcdir)/include \
- -I$(top_srcdir)/src/mapi
-
-noinst_LTLIBRARIES = libvega.la
-
-libvega_la_SOURCES = $(C_SOURCES)
-
-BUILT_SOURCES = api_tmp.h
-CLEANFILES = api_tmp.h
-
-api_tmp.h: $(top_srcdir)/src/mapi/vgapi/vgapi.csv $(top_srcdir)/src/mapi/mapi_abi.py
- $(AM_V_GEN) $(PYTHON2) $(PYTHON_FLAGS) $(top_srcdir)/src/mapi/mapi_abi.py \
- --printer vgapi --mode app $< > $@
-
-EXTRA_DIST = SConscript
diff --git a/src/gallium/state_trackers/vega/Makefile.sources b/src/gallium/state_trackers/vega/Makefile.sources
deleted file mode 100644
index 116a771629f..00000000000
--- a/src/gallium/state_trackers/vega/Makefile.sources
+++ /dev/null
@@ -1,56 +0,0 @@
-C_SOURCES := \
- api.c \
- api.h \
- api_consts.h \
- api_context.c \
- api_filters.c \
- api_images.c \
- api_masks.c \
- api_misc.c \
- api_paint.c \
- api_params.c \
- api_path.c \
- api_text.c \
- api_transform.c \
- arc.c \
- arc.h \
- asm_fill.h \
- asm_filters.h \
- asm_util.h \
- bezier.c \
- bezier.h \
- handle.c \
- handle.h \
- image.c \
- image.h \
- mask.c \
- mask.h \
- matrix.h \
- paint.c \
- paint.h \
- path.c \
- path.h \
- path_utils.h \
- polygon.c \
- polygon.h \
- renderer.c \
- renderer.h \
- shader.c \
- shader.h \
- shaders_cache.c \
- shaders_cache.h \
- stroker.c \
- stroker.h \
- text.c \
- text.h \
- util_array.h \
- vg_api.h \
- vg_context.c \
- vg_context.h \
- vg_manager.c \
- vg_manager.h \
- vg_state.c \
- vg_state.h \
- vg_translate.c \
- vg_translate.h \
- vgu.c
diff --git a/src/gallium/state_trackers/vega/SConscript b/src/gallium/state_trackers/vega/SConscript
deleted file mode 100644
index 29d5498c6c4..00000000000
--- a/src/gallium/state_trackers/vega/SConscript
+++ /dev/null
@@ -1,30 +0,0 @@
-#######################################################################
-# SConscript for vega state_tracker
-
-Import('*')
-
-from sys import executable as python_cmd
-
-env = env.Clone()
-
-env.Append(CPPPATH = [
- '#/src/mapi',
- Dir('.'),
-])
-env.Append(CPPDEFINES = [
- 'KHRONOS_DLL_EXPORTS',
-])
-
-api_tmp, = env.CodeGenerate(
- target = 'api_tmp.h',
- script = '#src/mapi/mapi_abi.py',
- source = '#src/mapi/vgapi/vgapi.csv',
- command = python_cmd + ' $SCRIPT --printer vgapi --mode app $SOURCE > $TARGET'
-)
-
-st_vega = env.ConvenienceLibrary(
- target = 'st_vega',
- source = env.ParseSourceList('Makefile.sources', 'C_SOURCES')
-)
-
-Export('st_vega')
diff --git a/src/gallium/state_trackers/vega/api.c b/src/gallium/state_trackers/vega/api.c
deleted file mode 100644
index 06b1e7b95af..00000000000
--- a/src/gallium/state_trackers/vega/api.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Mesa 3-D graphics library
- *
- * Copyright (C) 2010 LunarG Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- * Chia-I Wu <olv@lunarg.com>
- */
-
-#include "mapi.h"
-
-/* define vega_spec and vega_procs for use with mapi */
-#define API_TMP_DEFINE_SPEC
-#include "api.h"
-
-static void api_init(void)
-{
- static boolean initialized = FALSE;
- if (!initialized) {
- mapi_init(vega_spec);
- initialized = TRUE;
- }
-}
-
-struct mapi_table *api_create_dispatch(void)
-{
- struct mapi_table *tbl;
-
- api_init();
-
- tbl = mapi_table_create();
- if (tbl)
- mapi_table_fill(tbl, vega_procs);
-
- return tbl;
-}
-
-void api_destroy_dispatch(struct mapi_table *tbl)
-{
- mapi_table_destroy(tbl);
-}
-
-void api_make_dispatch_current(const struct mapi_table *tbl)
-{
- mapi_table_make_current(tbl);
-}
-
-mapi_proc api_get_proc_address(const char *proc_name)
-{
- if (!proc_name || proc_name[0] != 'v' || proc_name[1] != 'g')
- return NULL;
- proc_name += 2;
-
- api_init();
- return mapi_get_proc_address(proc_name);
-}
diff --git a/src/gallium/state_trackers/vega/api.h b/src/gallium/state_trackers/vega/api.h
deleted file mode 100644
index 3226450ac33..00000000000
--- a/src/gallium/state_trackers/vega/api.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Mesa 3-D graphics library
- *
- * Copyright (C) 2010 LunarG Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- * Chia-I Wu <olv@lunarg.com>
- */
-
-#ifndef API_H
-#define API_H
-
-#include "VG/openvg.h"
-#include "VG/vgext.h"
-#include "vg_manager.h"
-
-#include "api_tmp.h"
-
-struct mapi_table;
-
-struct mapi_table *api_create_dispatch(void);
-
-void api_destroy_dispatch(struct mapi_table *tbl);
-
-void api_make_dispatch_current(const struct mapi_table *tbl);
-
-st_proc_t api_get_proc_address(const char *proc_name);
-
-#endif /* API_H */
diff --git a/src/gallium/state_trackers/vega/api_consts.h b/src/gallium/state_trackers/vega/api_consts.h
deleted file mode 100644
index e1b48d4a46c..00000000000
--- a/src/gallium/state_trackers/vega/api_consts.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef API_CONSTS_H
-#define API_CONSTS_H
-
-/*must be at least 32*/
-#define VEGA_MAX_SCISSOR_RECTS 32
-
-/*must be at least 16*/
-#define VEGA_MAX_DASH_COUNT 32
-
-/*must be at least 7*/
-#define VEGA_MAX_KERNEL_SIZE 7
-
-/*must be at least 15*/
-#define VEGA_MAX_SEPARABLE_KERNEL_SIZE 15
-
-/*must be at least 32*/
-#define VEGA_MAX_COLOR_RAMP_STOPS 256
-
-#define VEGA_MAX_IMAGE_WIDTH 2048
-
-#define VEGA_MAX_IMAGE_HEIGHT 2048
-
-#define VEGA_MAX_IMAGE_PIXELS (2048*2048)
-
-#define VEGA_MAX_IMAGE_BYTES (2048*2048 * 4)
-
-/*must be at least 128*/
-#define VEGA_MAX_GAUSSIAN_STD_DEVIATION 128
-
-#endif
diff --git a/src/gallium/state_trackers/vega/api_context.c b/src/gallium/state_trackers/vega/api_context.c
deleted file mode 100644
index 055277cd76e..00000000000
--- a/src/gallium/state_trackers/vega/api_context.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "vg_manager.h"
-#include "vg_context.h"
-#include "api.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_screen.h"
-
-VGErrorCode vegaGetError(void)
-{
- struct vg_context *ctx = vg_current_context();
- VGErrorCode error = VG_NO_CONTEXT_ERROR;
-
- if (!ctx)
- return error;
-
- error = ctx->_error;
- ctx->_error = VG_NO_ERROR;
-
- return error;
-}
-
-void vegaFlush(void)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_context *pipe;
-
- if (!ctx)
- return;
-
- pipe = ctx->pipe;
- pipe->flush(pipe, NULL, 0);
-
- vg_manager_flush_frontbuffer(ctx);
-}
-
-void vegaFinish(void)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_fence_handle *fence = NULL;
- struct pipe_context *pipe;
-
- if (!ctx)
- return;
-
- pipe = ctx->pipe;
-
- pipe->flush(pipe, &fence, 0);
- if (fence) {
- pipe->screen->fence_finish(pipe->screen, fence,
- PIPE_TIMEOUT_INFINITE);
- pipe->screen->fence_reference(pipe->screen, &fence, NULL);
- }
-}
diff --git a/src/gallium/state_trackers/vega/api_filters.c b/src/gallium/state_trackers/vega/api_filters.c
deleted file mode 100644
index 480ced16c51..00000000000
--- a/src/gallium/state_trackers/vega/api_filters.c
+++ /dev/null
@@ -1,705 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "vg_context.h"
-#include "image.h"
-#include "api.h"
-#include "handle.h"
-#include "renderer.h"
-#include "shaders_cache.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_state.h"
-#include "util/u_inlines.h"
-#include "pipe/p_screen.h"
-
-#include "util/u_format.h"
-#include "util/u_sampler.h"
-#include "util/u_string.h"
-
-#include "asm_filters.h"
-
-
-struct filter_info {
- struct vg_image *dst;
- struct vg_image *src;
- struct vg_shader * (*setup_shader)(struct vg_context *, void *);
- void *user_data;
- const void *const_buffer;
- VGint const_buffer_len;
- VGTilingMode tiling_mode;
- struct pipe_sampler_view *extra_texture_view;
-};
-
-static INLINE struct pipe_resource *create_texture_1d(struct vg_context *ctx,
- const VGuint *color_data,
- const VGint color_data_len)
-{
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_screen *screen = pipe->screen;
- struct pipe_resource *tex = 0;
- struct pipe_resource templ;
-
- memset(&templ, 0, sizeof(templ));
- templ.target = PIPE_TEXTURE_1D;
- templ.format = PIPE_FORMAT_B8G8R8A8_UNORM;
- templ.last_level = 0;
- templ.width0 = color_data_len;
- templ.height0 = 1;
- templ.depth0 = 1;
- templ.array_size = 1;
- templ.bind = PIPE_BIND_SAMPLER_VIEW;
-
- tex = screen->resource_create(screen, &templ);
-
- { /* upload color_data */
- struct pipe_transfer *transfer;
- void *map =
- pipe_transfer_map(pipe, tex,
- 0, 0,
- PIPE_TRANSFER_READ_WRITE ,
- 0, 0, tex->width0, tex->height0,
- &transfer);
- memcpy(map, color_data, sizeof(VGint)*color_data_len);
- pipe->transfer_unmap(pipe, transfer);
- }
-
- return tex;
-}
-
-static INLINE struct pipe_sampler_view *create_texture_1d_view(struct vg_context *ctx,
- const VGuint *color_data,
- const VGint color_data_len)
-{
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_resource *texture;
- struct pipe_sampler_view view_templ;
- struct pipe_sampler_view *view;
-
- texture = create_texture_1d(ctx, color_data, color_data_len);
-
- if (!texture)
- return NULL;
-
- u_sampler_view_default_template(&view_templ, texture, texture->format);
- view = pipe->create_sampler_view(pipe, texture, &view_templ);
- /* want the texture to go away if the view is freed */
- pipe_resource_reference(&texture, NULL);
-
- return view;
-}
-
-static struct vg_shader * setup_color_matrix(struct vg_context *ctx, void *user_data)
-{
- struct vg_shader *shader =
- shader_create_from_text(ctx->pipe, color_matrix_asm, 200,
- PIPE_SHADER_FRAGMENT);
- return shader;
-}
-
-static struct vg_shader * setup_convolution(struct vg_context *ctx, void *user_data)
-{
- char buffer[1024];
- VGint num_consts = (VGint)(long)(user_data);
- struct vg_shader *shader;
-
- util_snprintf(buffer, 1023, convolution_asm, num_consts, num_consts / 2 + 1);
-
- shader = shader_create_from_text(ctx->pipe, buffer, 200,
- PIPE_SHADER_FRAGMENT);
-
- return shader;
-}
-
-static struct vg_shader * setup_lookup(struct vg_context *ctx, void *user_data)
-{
- struct vg_shader *shader =
- shader_create_from_text(ctx->pipe, lookup_asm,
- 200, PIPE_SHADER_FRAGMENT);
-
- return shader;
-}
-
-
-static struct vg_shader * setup_lookup_single(struct vg_context *ctx, void *user_data)
-{
- char buffer[1024];
- VGImageChannel channel = (VGImageChannel)(user_data);
- struct vg_shader *shader;
-
- switch(channel) {
- case VG_RED:
- util_snprintf(buffer, 1023, lookup_single_asm, "xxxx");
- break;
- case VG_GREEN:
- util_snprintf(buffer, 1023, lookup_single_asm, "yyyy");
- break;
- case VG_BLUE:
- util_snprintf(buffer, 1023, lookup_single_asm, "zzzz");
- break;
- case VG_ALPHA:
- util_snprintf(buffer, 1023, lookup_single_asm, "wwww");
- break;
- default:
- debug_assert(!"Unknown color channel");
- }
-
- shader = shader_create_from_text(ctx->pipe, buffer, 200,
- PIPE_SHADER_FRAGMENT);
-
- return shader;
-}
-
-static void execute_filter(struct vg_context *ctx,
- struct filter_info *info)
-{
- struct vg_shader *shader;
- const struct pipe_sampler_state *samplers[2];
- struct pipe_sampler_view *views[2];
- struct pipe_sampler_state sampler;
- uint tex_wrap;
-
- memset(&sampler, 0, sizeof(sampler));
- sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR;
- sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR;
- sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
- sampler.normalized_coords = 1;
-
- switch (info->tiling_mode) {
- case VG_TILE_FILL:
- tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_BORDER;
- /* copy border color */
- memcpy(sampler.border_color.f, ctx->state.vg.tile_fill_color,
- sizeof(sampler.border_color));
- break;
- case VG_TILE_PAD:
- tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_EDGE;;
- break;
- case VG_TILE_REPEAT:
- tex_wrap = PIPE_TEX_WRAP_REPEAT;;
- break;
- case VG_TILE_REFLECT:
- tex_wrap = PIPE_TEX_WRAP_MIRROR_REPEAT;
- break;
- default:
- debug_assert(!"Unknown tiling mode");
- tex_wrap = 0;
- break;
- }
-
- sampler.wrap_s = tex_wrap;
- sampler.wrap_t = tex_wrap;
- sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
-
- samplers[0] = samplers[1] = &sampler;
- views[0] = info->src->sampler_view;
- views[1] = info->extra_texture_view;
-
- shader = info->setup_shader(ctx, info->user_data);
-
- if (renderer_filter_begin(ctx->renderer,
- info->dst->sampler_view->texture, VG_TRUE,
- ctx->state.vg.filter_channel_mask,
- samplers, views, (info->extra_texture_view) ? 2 : 1,
- shader->driver, info->const_buffer, info->const_buffer_len)) {
- renderer_filter(ctx->renderer,
- info->dst->x, info->dst->y, info->dst->width, info->dst->height,
- info->src->x, info->src->y, info->src->width, info->src->height);
- renderer_filter_end(ctx->renderer);
- }
-
- vg_shader_destroy(ctx, shader);
-}
-
-void vegaColorMatrix(VGImage dst, VGImage src,
- const VGfloat * matrix)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *d, *s;
- struct filter_info info;
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!matrix || !is_aligned(matrix)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_color_matrix;
- info.user_data = NULL;
- info.const_buffer = matrix;
- info.const_buffer_len = 20 * sizeof(VGfloat);
- info.tiling_mode = VG_TILE_PAD;
- info.extra_texture_view = NULL;
- execute_filter(ctx, &info);
-}
-
-static VGfloat texture_offset(VGfloat width, VGint kernelSize, VGint current, VGint shift)
-{
- VGfloat diff = (VGfloat) (current - shift);
-
- return diff / width;
-}
-
-void vegaConvolve(VGImage dst, VGImage src,
- VGint kernelWidth, VGint kernelHeight,
- VGint shiftX, VGint shiftY,
- const VGshort * kernel,
- VGfloat scale,
- VGfloat bias,
- VGTilingMode tilingMode)
-{
- struct vg_context *ctx = vg_current_context();
- VGfloat *buffer;
- VGint buffer_len;
- VGint i, j;
- VGint idx = 0;
- struct vg_image *d, *s;
- VGint kernel_size = kernelWidth * kernelHeight;
- struct filter_info info;
- const VGint max_kernel_size = vegaGeti(VG_MAX_KERNEL_SIZE);
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (kernelWidth <= 0 || kernelHeight <= 0 ||
- kernelWidth > max_kernel_size || kernelHeight > max_kernel_size) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (!kernel || !is_aligned_to(kernel, 2)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (tilingMode < VG_TILE_FILL ||
- tilingMode > VG_TILE_REFLECT) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
-
- buffer_len = 8 + 2 * 4 * kernel_size;
- buffer = malloc(buffer_len * sizeof(VGfloat));
-
- buffer[0] = 0.f;
- buffer[1] = 1.f;
- buffer[2] = 2.f; /*unused*/
- buffer[3] = 4.f; /*unused*/
-
- buffer[4] = (VGfloat) (kernelWidth * kernelHeight);
- buffer[5] = scale;
- buffer[6] = bias;
- buffer[7] = 0.f;
-
- idx = 8;
- for (j = 0; j < kernelHeight; ++j) {
- for (i = 0; i < kernelWidth; ++i) {
- VGint index = j * kernelWidth + i;
- VGfloat x, y;
-
- x = (VGfloat) texture_offset(s->width, kernelWidth, i, shiftX);
- y = (VGfloat) texture_offset(s->height, kernelHeight, j, shiftY);
-
- buffer[idx + index*4 + 0] = x;
- buffer[idx + index*4 + 1] = y;
- buffer[idx + index*4 + 2] = 0.f;
- buffer[idx + index*4 + 3] = 0.f;
- }
- }
- idx += kernel_size * 4;
-
- for (j = 0; j < kernelHeight; ++j) {
- for (i = 0; i < kernelWidth; ++i) {
- /* transpose the kernel */
- VGint index = j * kernelWidth + i;
- VGint kindex = (kernelWidth - i - 1) * kernelHeight + (kernelHeight - j - 1);
- buffer[idx + index*4 + 0] = kernel[kindex];
- buffer[idx + index*4 + 1] = kernel[kindex];
- buffer[idx + index*4 + 2] = kernel[kindex];
- buffer[idx + index*4 + 3] = kernel[kindex];
- }
- }
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_convolution;
- info.user_data = (void*)(long)(buffer_len/4);
- info.const_buffer = buffer;
- info.const_buffer_len = buffer_len * sizeof(VGfloat);
- info.tiling_mode = tilingMode;
- info.extra_texture_view = NULL;
- execute_filter(ctx, &info);
-
- free(buffer);
-}
-
-void vegaSeparableConvolve(VGImage dst, VGImage src,
- VGint kernelWidth,
- VGint kernelHeight,
- VGint shiftX, VGint shiftY,
- const VGshort * kernelX,
- const VGshort * kernelY,
- VGfloat scale,
- VGfloat bias,
- VGTilingMode tilingMode)
-{
- struct vg_context *ctx = vg_current_context();
- VGshort *kernel;
- VGint i, j, idx = 0;
- const VGint max_kernel_size = vegaGeti(VG_MAX_SEPARABLE_KERNEL_SIZE);
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (kernelWidth <= 0 || kernelHeight <= 0 ||
- kernelWidth > max_kernel_size || kernelHeight > max_kernel_size) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (!kernelX || !kernelY ||
- !is_aligned_to(kernelX, 2) || !is_aligned_to(kernelY, 2)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (tilingMode < VG_TILE_FILL ||
- tilingMode > VG_TILE_REFLECT) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- kernel = malloc(sizeof(VGshort)*kernelWidth*kernelHeight);
- for (i = 0; i < kernelWidth; ++i) {
- for (j = 0; j < kernelHeight; ++j) {
- kernel[idx] = kernelX[i] * kernelY[j];
- ++idx;
- }
- }
- vegaConvolve(dst, src, kernelWidth, kernelHeight, shiftX, shiftY,
- kernel, scale, bias, tilingMode);
- free(kernel);
-}
-
-static INLINE VGfloat compute_gaussian_componenet(VGfloat x, VGfloat y,
- VGfloat stdDeviationX,
- VGfloat stdDeviationY)
-{
- VGfloat mult = 1 / ( 2 * M_PI * stdDeviationX * stdDeviationY);
- VGfloat e = exp( - ( pow(x, 2)/(2*pow(stdDeviationX, 2)) +
- pow(y, 2)/(2*pow(stdDeviationY, 2)) ) );
- return mult * e;
-}
-
-static INLINE VGint compute_kernel_size(VGfloat deviation)
-{
- VGint size = ceil(2.146 * deviation);
- if (size > 11)
- return 11;
- return size;
-}
-
-static void compute_gaussian_kernel(VGfloat *kernel,
- VGint width, VGint height,
- VGfloat stdDeviationX,
- VGfloat stdDeviationY)
-{
- VGint i, j;
- VGfloat scale = 0.0f;
-
- for (j = 0; j < height; ++j) {
- for (i = 0; i < width; ++i) {
- VGint idx = (height - j -1) * width + (width - i -1);
- kernel[idx] = compute_gaussian_componenet(i-(ceil(width/2))-1,
- j-ceil(height/2)-1,
- stdDeviationX, stdDeviationY);
- scale += kernel[idx];
- }
- }
-
- for (j = 0; j < height; ++j) {
- for (i = 0; i < width; ++i) {
- VGint idx = j * width + i;
- kernel[idx] /= scale;
- }
- }
-}
-
-void vegaGaussianBlur(VGImage dst, VGImage src,
- VGfloat stdDeviationX,
- VGfloat stdDeviationY,
- VGTilingMode tilingMode)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *d, *s;
- VGfloat *buffer, *kernel;
- VGint kernel_width, kernel_height, kernel_size;
- VGint buffer_len;
- VGint idx, i, j;
- struct filter_info info;
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (stdDeviationX <= 0 || stdDeviationY <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (tilingMode < VG_TILE_FILL ||
- tilingMode > VG_TILE_REFLECT) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- kernel_width = compute_kernel_size(stdDeviationX);
- kernel_height = compute_kernel_size(stdDeviationY);
- kernel_size = kernel_width * kernel_height;
- kernel = malloc(sizeof(VGfloat)*kernel_size);
- compute_gaussian_kernel(kernel, kernel_width, kernel_height,
- stdDeviationX, stdDeviationY);
-
- buffer_len = 8 + 2 * 4 * kernel_size;
- buffer = malloc(buffer_len * sizeof(VGfloat));
-
- buffer[0] = 0.f;
- buffer[1] = 1.f;
- buffer[2] = 2.f; /*unused*/
- buffer[3] = 4.f; /*unused*/
-
- buffer[4] = kernel_width * kernel_height;
- buffer[5] = 1.f;/*scale*/
- buffer[6] = 0.f;/*bias*/
- buffer[7] = 0.f;
-
- idx = 8;
- for (j = 0; j < kernel_height; ++j) {
- for (i = 0; i < kernel_width; ++i) {
- VGint index = j * kernel_width + i;
- VGfloat x, y;
-
- x = texture_offset(s->width, kernel_width, i, kernel_width/2);
- y = texture_offset(s->height, kernel_height, j, kernel_height/2);
-
- buffer[idx + index*4 + 0] = x;
- buffer[idx + index*4 + 1] = y;
- buffer[idx + index*4 + 2] = 0.f;
- buffer[idx + index*4 + 3] = 0.f;
- }
- }
- idx += kernel_size * 4;
-
- for (j = 0; j < kernel_height; ++j) {
- for (i = 0; i < kernel_width; ++i) {
- /* transpose the kernel */
- VGint index = j * kernel_width + i;
- VGint kindex = (kernel_width - i - 1) * kernel_height + (kernel_height - j - 1);
- buffer[idx + index*4 + 0] = kernel[kindex];
- buffer[idx + index*4 + 1] = kernel[kindex];
- buffer[idx + index*4 + 2] = kernel[kindex];
- buffer[idx + index*4 + 3] = kernel[kindex];
- }
- }
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_convolution;
- info.user_data = (void*)(long)(buffer_len/4);
- info.const_buffer = buffer;
- info.const_buffer_len = buffer_len * sizeof(VGfloat);
- info.tiling_mode = tilingMode;
- info.extra_texture_view = NULL;
- execute_filter(ctx, &info);
-
- free(buffer);
- free(kernel);
-}
-
-void vegaLookup(VGImage dst, VGImage src,
- const VGubyte * redLUT,
- const VGubyte * greenLUT,
- const VGubyte * blueLUT,
- const VGubyte * alphaLUT,
- VGboolean outputLinear,
- VGboolean outputPremultiplied)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *d, *s;
- VGuint color_data[256];
- VGint i;
- struct pipe_sampler_view *lut_texture_view;
- VGfloat buffer[4];
- struct filter_info info;
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!redLUT || !greenLUT || !blueLUT || !alphaLUT) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- for (i = 0; i < 256; ++i) {
- color_data[i] = blueLUT[i] << 24 | greenLUT[i] << 16 |
- redLUT[i] << 8 | alphaLUT[i];
- }
- lut_texture_view = create_texture_1d_view(ctx, color_data, 255);
-
- buffer[0] = 0.f;
- buffer[1] = 0.f;
- buffer[2] = 1.f;
- buffer[3] = 1.f;
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_lookup;
- info.user_data = NULL;
- info.const_buffer = buffer;
- info.const_buffer_len = 4 * sizeof(VGfloat);
- info.tiling_mode = VG_TILE_PAD;
- info.extra_texture_view = lut_texture_view;
-
- execute_filter(ctx, &info);
-
- pipe_sampler_view_reference(&lut_texture_view, NULL);
-}
-
-void vegaLookupSingle(VGImage dst, VGImage src,
- const VGuint * lookupTable,
- VGImageChannel sourceChannel,
- VGboolean outputLinear,
- VGboolean outputPremultiplied)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *d, *s;
- struct pipe_sampler_view *lut_texture_view;
- VGfloat buffer[4];
- struct filter_info info;
- VGuint color_data[256];
- VGint i;
-
- if (dst == VG_INVALID_HANDLE || src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!lookupTable || !is_aligned(lookupTable)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (sourceChannel != VG_RED && sourceChannel != VG_GREEN &&
- sourceChannel != VG_BLUE && sourceChannel != VG_ALPHA) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- d = handle_to_image(dst);
- s = handle_to_image(src);
-
- if (vg_image_overlaps(d, s)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
-
- for (i = 0; i < 256; ++i) {
- VGuint rgba = lookupTable[i];
- VGubyte blue, green, red, alpha;
- red = (rgba & 0xff000000)>>24;
- green = (rgba & 0x00ff0000)>>16;
- blue = (rgba & 0x0000ff00)>> 8;
- alpha = (rgba & 0x000000ff)>> 0;
- color_data[i] = blue << 24 | green << 16 |
- red << 8 | alpha;
- }
- lut_texture_view = create_texture_1d_view(ctx, color_data, 256);
-
- buffer[0] = 0.f;
- buffer[1] = 0.f;
- buffer[2] = 1.f;
- buffer[3] = 1.f;
-
- info.dst = d;
- info.src = s;
- info.setup_shader = &setup_lookup_single;
- info.user_data = (void*)sourceChannel;
- info.const_buffer = buffer;
- info.const_buffer_len = 4 * sizeof(VGfloat);
- info.tiling_mode = VG_TILE_PAD;
- info.extra_texture_view = lut_texture_view;
-
- execute_filter(ctx, &info);
-
- pipe_sampler_view_reference(&lut_texture_view, NULL);
-}
diff --git a/src/gallium/state_trackers/vega/api_images.c b/src/gallium/state_trackers/vega/api_images.c
deleted file mode 100644
index 300868c252c..00000000000
--- a/src/gallium/state_trackers/vega/api_images.c
+++ /dev/null
@@ -1,492 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "image.h"
-
-#include "VG/openvg.h"
-
-#include "vg_context.h"
-#include "vg_translate.h"
-#include "api_consts.h"
-#include "api.h"
-#include "handle.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_screen.h"
-#include "util/u_inlines.h"
-#include "util/u_tile.h"
-#include "util/u_math.h"
-
-static INLINE VGboolean supported_image_format(VGImageFormat format)
-{
- switch(format) {
- case VG_sRGBX_8888:
- case VG_sRGBA_8888:
- case VG_sRGBA_8888_PRE:
- case VG_sRGB_565:
- case VG_sRGBA_5551:
- case VG_sRGBA_4444:
- case VG_sL_8:
- case VG_lRGBX_8888:
- case VG_lRGBA_8888:
- case VG_lRGBA_8888_PRE:
- case VG_lL_8:
- case VG_A_8:
- case VG_BW_1:
-#ifdef OPENVG_VERSION_1_1
- case VG_A_1:
- case VG_A_4:
-#endif
- case VG_sXRGB_8888:
- case VG_sARGB_8888:
- case VG_sARGB_8888_PRE:
- case VG_sARGB_1555:
- case VG_sARGB_4444:
- case VG_lXRGB_8888:
- case VG_lARGB_8888:
- case VG_lARGB_8888_PRE:
- case VG_sBGRX_8888:
- case VG_sBGRA_8888:
- case VG_sBGRA_8888_PRE:
- case VG_sBGR_565:
- case VG_sBGRA_5551:
- case VG_sBGRA_4444:
- case VG_lBGRX_8888:
- case VG_lBGRA_8888:
- case VG_lBGRA_8888_PRE:
- case VG_sXBGR_8888:
- case VG_sABGR_8888:
- case VG_sABGR_8888_PRE:
- case VG_sABGR_1555:
- case VG_sABGR_4444:
- case VG_lXBGR_8888:
- case VG_lABGR_8888:
- case VG_lABGR_8888_PRE:
- return VG_TRUE;
- default:
- return VG_FALSE;
- }
- return VG_FALSE;
-}
-
-VGImage vegaCreateImage(VGImageFormat format,
- VGint width, VGint height,
- VGbitfield allowedQuality)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (!supported_image_format(format)) {
- vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR);
- return VG_INVALID_HANDLE;
- }
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
- if (width > vegaGeti(VG_MAX_IMAGE_WIDTH) ||
- height > vegaGeti(VG_MAX_IMAGE_HEIGHT)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
- if (width * height > vegaGeti(VG_MAX_IMAGE_PIXELS)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
-
- if (!(allowedQuality & ((VG_IMAGE_QUALITY_NONANTIALIASED |
- VG_IMAGE_QUALITY_FASTER |
- VG_IMAGE_QUALITY_BETTER)))) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
-
- return image_to_handle(image_create(format, width, height));
-}
-
-void vegaDestroyImage(VGImage image)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *img = handle_to_image(image);
-
- if (image == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!vg_object_is_valid(image, VG_OBJECT_IMAGE)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- image_destroy(img);
-}
-
-void vegaClearImage(VGImage image,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *img;
-
- if (image == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- img = handle_to_image(image);
-
- if (x + width < 0 || y + height < 0)
- return;
-
- image_clear(img, x, y, width, height);
-
-}
-
-void vegaImageSubData(VGImage image,
- const void * data,
- VGint dataStride,
- VGImageFormat dataFormat,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *img;
-
- if (image == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!supported_image_format(dataFormat)) {
- vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR);
- return;
- }
- if (width <= 0 || height <= 0 || !data || !is_aligned(data)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- img = handle_to_image(image);
- image_sub_data(img, data, dataStride, dataFormat,
- x, y, width, height);
-}
-
-void vegaGetImageSubData(VGImage image,
- void * data,
- VGint dataStride,
- VGImageFormat dataFormat,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *img;
-
- if (image == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!supported_image_format(dataFormat)) {
- vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR);
- return;
- }
- if (width <= 0 || height <= 0 || !data || !is_aligned(data)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- img = handle_to_image(image);
- image_get_sub_data(img, data, dataStride, dataFormat,
- x, y, width, height);
-}
-
-VGImage vegaChildImage(VGImage parent,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *p;
-
- if (parent == VG_INVALID_HANDLE ||
- !vg_context_is_object_valid(ctx, VG_OBJECT_IMAGE, parent) ||
- !vg_object_is_valid(parent, VG_OBJECT_IMAGE)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return VG_INVALID_HANDLE;
- }
- if (width <= 0 || height <= 0 || x < 0 || y < 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
- p = handle_to_image(parent);
- if (x > p->width || y > p->height) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
- if (x + width > p->width || y + height > p->height) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
-
- return image_to_handle(image_child_image(p, x, y, width, height));
-}
-
-VGImage vegaGetParent(VGImage image)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *img;
-
- if (image == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return VG_INVALID_HANDLE;
- }
-
- img = handle_to_image(image);
- if (img->parent)
- return image_to_handle(img->parent);
- else
- return image;
-}
-
-void vegaCopyImage(VGImage dst, VGint dx, VGint dy,
- VGImage src, VGint sx, VGint sy,
- VGint width, VGint height,
- VGboolean dither)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (src == VG_INVALID_HANDLE || dst == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- vg_validate_state(ctx);
- image_copy(handle_to_image(dst), dx, dy,
- handle_to_image(src), sx, sy,
- width, height, dither);
-}
-
-void vegaDrawImage(VGImage image)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (!ctx)
- return;
-
- if (image == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
- image_draw(handle_to_image(image),
- &ctx->state.vg.image_user_to_surface_matrix);
-}
-
-void vegaSetPixels(VGint dx, VGint dy,
- VGImage src, VGint sx, VGint sy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
-
- vg_validate_state(ctx);
-
- if (src == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- image_set_pixels(dx, dy, handle_to_image(src), sx, sy, width,
- height);
-}
-
-void vegaGetPixels(VGImage dst, VGint dx, VGint dy,
- VGint sx, VGint sy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *img;
-
- if (dst == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- img = handle_to_image(dst);
-
- image_get_pixels(img, dx, dy,
- sx, sy, width, height);
-}
-
-void vegaWritePixels(const void * data, VGint dataStride,
- VGImageFormat dataFormat,
- VGint dx, VGint dy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (!supported_image_format(dataFormat)) {
- vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR);
- return;
- }
- if (!data || !is_aligned(data)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
- {
- struct vg_image *img = image_create(dataFormat, width, height);
- image_sub_data(img, data, dataStride, dataFormat, 0, 0,
- width, height);
-#if 0
- struct matrix *matrix = &ctx->state.vg.image_user_to_surface_matrix;
- matrix_translate(matrix, dx, dy);
- image_draw(img);
- matrix_translate(matrix, -dx, -dy);
-#else
- /* this looks like a better approach */
- image_set_pixels(dx, dy, img, 0, 0, width, height);
-#endif
- image_destroy(img);
- }
-}
-
-void vegaReadPixels(void * data, VGint dataStride,
- VGImageFormat dataFormat,
- VGint sx, VGint sy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_context *pipe = ctx->pipe;
-
- struct st_framebuffer *stfb = ctx->draw_buffer;
- struct st_renderbuffer *strb = stfb->strb;
-
- VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
- VGfloat *df = (VGfloat*)temp;
- VGint i;
- VGubyte *dst = (VGubyte *)data;
- VGint xoffset = 0, yoffset = 0;
-
- if (!supported_image_format(dataFormat)) {
- vg_set_error(ctx, VG_UNSUPPORTED_IMAGE_FORMAT_ERROR);
- return;
- }
- if (!data || !is_aligned(data)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (sx < 0) {
- xoffset = -sx;
- xoffset *= _vega_size_for_format(dataFormat);
- width += sx;
- sx = 0;
- }
- if (sy < 0) {
- yoffset = -sy;
- yoffset *= dataStride;
- height += sy;
- sy = 0;
- }
-
- if (sx + width > stfb->width || sy + height > stfb->height) {
- width = stfb->width - sx;
- height = stfb->height - sy;
- /* nothing to read */
- if (width <= 0 || height <= 0)
- return;
- }
-
- {
- VGint y = (stfb->height - sy) - 1, yStep = -1;
- struct pipe_transfer *transfer;
- void *map;
-
- map = pipe_transfer_map(pipe, strb->texture, 0, 0,
- PIPE_TRANSFER_READ,
- 0, 0, sx + width, stfb->height - sy,
- &transfer);
-
- /* Do a row at a time to flip image data vertically */
- for (i = 0; i < height; i++) {
-#if 0
- debug_printf("%d-%d == %d\n", sy, height, y);
-#endif
- pipe_get_tile_rgba(transfer, map, sx, y, width, 1, df);
- y += yStep;
- _vega_pack_rgba_span_float(ctx, width, temp, dataFormat,
- dst + yoffset + xoffset);
- dst += dataStride;
- }
-
- pipe->transfer_unmap(pipe, transfer);
- }
-}
-
-void vegaCopyPixels(VGint dx, VGint dy,
- VGint sx, VGint sy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct st_framebuffer *stfb = ctx->draw_buffer;
- struct st_renderbuffer *strb = stfb->strb;
-
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- /* do nothing if we copy from outside the fb */
- if (dx >= (VGint)stfb->width || dy >= (VGint)stfb->height ||
- sx >= (VGint)stfb->width || sy >= (VGint)stfb->height)
- return;
-
- vg_validate_state(ctx);
- /* make sure rendering has completed */
- vegaFinish();
-
- vg_copy_surface(ctx, strb->surface, dx, dy,
- strb->surface, sx, sy, width, height);
-}
diff --git a/src/gallium/state_trackers/vega/api_masks.c b/src/gallium/state_trackers/vega/api_masks.c
deleted file mode 100644
index 48dc8445c02..00000000000
--- a/src/gallium/state_trackers/vega/api_masks.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "mask.h"
-#include "api.h"
-#include "handle.h"
-#include "renderer.h"
-
-#include "vg_context.h"
-#include "pipe/p_context.h"
-
-void vegaMask(VGHandle mask, VGMaskOperation operation,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (width <=0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (operation < VG_CLEAR_MASK || operation > VG_SUBTRACT_MASK) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
-
- vg_validate_state(ctx);
-
- if (operation == VG_CLEAR_MASK) {
- mask_fill(x, y, width, height, 0.f);
- } else if (operation == VG_FILL_MASK) {
- mask_fill(x, y, width, height, 1.f);
- } else if (vg_object_is_valid(mask, VG_OBJECT_IMAGE)) {
- struct vg_image *image = handle_to_image(mask);
- mask_using_image(image, operation, x, y, width, height);
- } else if (vg_object_is_valid(mask, VG_OBJECT_MASK)) {
- struct vg_mask_layer *layer = handle_to_masklayer(mask);
- mask_using_layer(layer, operation, x, y, width, height);
- } else {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- }
-}
-
-void vegaClear(VGint x, VGint y,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct st_framebuffer *stfb = ctx->draw_buffer;
-
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
-#if 0
- debug_printf("Clear [%d, %d, %d, %d] with [%f, %f, %f, %f]\n",
- x, y, width, height,
- ctx->state.vg.clear_color[0],
- ctx->state.vg.clear_color[1],
- ctx->state.vg.clear_color[2],
- ctx->state.vg.clear_color[3]);
-#endif
-
- /* check for a whole surface clear */
- if (!ctx->state.vg.scissoring &&
- (x == 0 && y == 0 && width == stfb->width && height == stfb->height)) {
- union pipe_color_union clear_color;
- clear_color.f[0] = ctx->state.vg.clear_color[0];
- clear_color.f[1] = ctx->state.vg.clear_color[1];
- clear_color.f[2] = ctx->state.vg.clear_color[2];
- clear_color.f[3] = ctx->state.vg.clear_color[3];
- ctx->pipe->clear(ctx->pipe, PIPE_CLEAR_COLOR0 | PIPE_CLEAR_DEPTHSTENCIL,
- &clear_color, 1., 0);
- } else if (renderer_clear_begin(ctx->renderer)) {
- /* XXX verify coord round-off */
- renderer_clear(ctx->renderer, x, y, width, height, ctx->state.vg.clear_color);
- renderer_clear_end(ctx->renderer);
- }
-}
-
-
-#ifdef OPENVG_VERSION_1_1
-
-
-void vegaRenderToMask(VGPath path,
- VGbitfield paintModes,
- VGMaskOperation operation)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (path == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!paintModes || (paintModes&(~(VG_STROKE_PATH|VG_FILL_PATH)))) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (operation < VG_CLEAR_MASK ||
- operation > VG_SUBTRACT_MASK) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (!vg_object_is_valid(path, VG_OBJECT_PATH)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
-
- mask_render_to(handle_to_path(path), paintModes, operation);
-}
-
-VGMaskLayer vegaCreateMaskLayer(VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (width <= 0 || height <= 0 ||
- width > vegaGeti(VG_MAX_IMAGE_WIDTH) ||
- height > vegaGeti(VG_MAX_IMAGE_HEIGHT)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
-
- return masklayer_to_handle(mask_layer_create(width, height));
-}
-
-void vegaDestroyMaskLayer(VGMaskLayer maskLayer)
-{
- struct vg_mask_layer *mask = 0;
- struct vg_context *ctx = vg_current_context();
-
- if (maskLayer == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!vg_object_is_valid(maskLayer, VG_OBJECT_MASK)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- mask = handle_to_masklayer(maskLayer);
- mask_layer_destroy(mask);
-}
-
-void vegaFillMaskLayer(VGMaskLayer maskLayer,
- VGint x, VGint y,
- VGint width, VGint height,
- VGfloat value)
-{
- struct vg_mask_layer *mask = 0;
- struct vg_context *ctx = vg_current_context();
-
- if (maskLayer == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (value < 0 || value > 1) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (x < 0 || y < 0 || (x + width) < 0 || (y + height) < 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (!vg_object_is_valid(maskLayer, VG_OBJECT_MASK)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- mask = handle_to_masklayer(maskLayer);
-
- if (x + width > mask_layer_width(mask) ||
- y + height > mask_layer_height(mask)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
-
- mask_layer_fill(mask, x, y, width, height, value);
-}
-
-void vegaCopyMask(VGMaskLayer maskLayer,
- VGint sx, VGint sy,
- VGint dx, VGint dy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_mask_layer *mask = 0;
-
- if (maskLayer == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (!vg_object_is_valid(maskLayer, VG_OBJECT_MASK)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- vg_validate_state(ctx);
-
- mask = handle_to_masklayer(maskLayer);
- mask_copy(mask, sx, sy, dx, dy, width, height);
-}
-
-#endif
diff --git a/src/gallium/state_trackers/vega/api_misc.c b/src/gallium/state_trackers/vega/api_misc.c
deleted file mode 100644
index e274e6a2981..00000000000
--- a/src/gallium/state_trackers/vega/api_misc.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "vg_context.h"
-#include "api.h"
-
-/* Hardware Queries */
-VGHardwareQueryResult vegaHardwareQuery(VGHardwareQueryType key,
- VGint setting)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (key < VG_IMAGE_FORMAT_QUERY ||
- key > VG_PATH_DATATYPE_QUERY) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_HARDWARE_UNACCELERATED;
- }
-
- if (key == VG_IMAGE_FORMAT_QUERY) {
- if (setting < VG_sRGBX_8888 ||
- setting > VG_lABGR_8888_PRE) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_HARDWARE_UNACCELERATED;
- }
- } else if (key == VG_PATH_DATATYPE_QUERY) {
- if (setting < VG_PATH_DATATYPE_S_8 ||
- setting > VG_PATH_DATATYPE_F) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_HARDWARE_UNACCELERATED;
- }
- }
- /* we're supposed to accelerate everything */
- return VG_HARDWARE_ACCELERATED;
-}
-
-/* Renderer and Extension Information */
-const VGubyte *vegaGetString(VGStringID name)
-{
- struct vg_context *ctx = vg_current_context();
- static const VGubyte *vendor = (VGubyte *)"Mesa Project";
- static const VGubyte *renderer = (VGubyte *)"Vega OpenVG 1.1";
- static const VGubyte *version = (VGubyte *)"1.1";
-
- if (!ctx)
- return NULL;
-
- switch(name) {
- case VG_VENDOR:
- return vendor;
- case VG_RENDERER:
- return renderer;
- case VG_VERSION:
- return version;
- case VG_EXTENSIONS:
- return NULL;
- default:
- return NULL;
- }
-}
diff --git a/src/gallium/state_trackers/vega/api_paint.c b/src/gallium/state_trackers/vega/api_paint.c
deleted file mode 100644
index 2610ebe0576..00000000000
--- a/src/gallium/state_trackers/vega/api_paint.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "vg_context.h"
-#include "paint.h"
-#include "api.h"
-#include "handle.h"
-
-
-VGPaint vegaCreatePaint(void)
-{
- return paint_to_handle(paint_create(vg_current_context()));
-}
-
-void vegaDestroyPaint(VGPaint p)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (p == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- paint_destroy(handle_to_paint(p));
-}
-
-void vegaSetPaint(VGPaint paint, VGbitfield paintModes)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (paint == VG_INVALID_HANDLE) {
- /* restore the default */
- paint = paint_to_handle(ctx->default_paint);
- } else if (!vg_object_is_valid(paint, VG_OBJECT_PAINT)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!(paintModes & ((VG_FILL_PATH|VG_STROKE_PATH)))) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (paintModes & VG_FILL_PATH) {
- ctx->state.vg.fill_paint = handle_to_paint(paint);
- }
- if (paintModes & VG_STROKE_PATH) {
- ctx->state.vg.stroke_paint = handle_to_paint(paint);
- }
-
- ctx->state.dirty |= PAINT_DIRTY;
-}
-
-VGPaint vegaGetPaint(VGPaintMode paintMode)
-{
- struct vg_context *ctx = vg_current_context();
- VGPaint paint = VG_INVALID_HANDLE;
-
- if (paintMode < VG_STROKE_PATH || paintMode > VG_FILL_PATH) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
-
- if (paintMode == VG_FILL_PATH)
- paint = paint_to_handle(ctx->state.vg.fill_paint);
- else if (paintMode == VG_STROKE_PATH)
- paint = paint_to_handle(ctx->state.vg.stroke_paint);
-
- if (paint == paint_to_handle(ctx->default_paint))
- paint = VG_INVALID_HANDLE;
-
- return paint;
-}
-
-void vegaSetColor(VGPaint paint, VGuint rgba)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_paint *p;
-
- if (paint == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!vg_object_is_valid(paint, VG_OBJECT_PAINT)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- p = handle_to_paint(paint);
- paint_set_colori(p, rgba);
-
- if (ctx->state.vg.fill_paint == p ||
- ctx->state.vg.stroke_paint == p)
- ctx->state.dirty |= PAINT_DIRTY;
-}
-
-VGuint vegaGetColor(VGPaint paint)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_paint *p;
- VGuint rgba = 0;
-
- if (paint == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return rgba;
- }
-
- if (!vg_object_is_valid(paint, VG_OBJECT_PAINT)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return rgba;
- }
- p = handle_to_paint(paint);
-
- return paint_colori(p);
-}
-
-void vegaPaintPattern(VGPaint paint, VGImage pattern)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (paint == VG_INVALID_HANDLE ||
- !vg_context_is_object_valid(ctx, VG_OBJECT_PAINT, paint)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (pattern == VG_INVALID_HANDLE) {
- paint_set_type(handle_to_paint(paint), VG_PAINT_TYPE_COLOR);
- return;
- }
-
- if (!vg_context_is_object_valid(ctx, VG_OBJECT_IMAGE, pattern)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
-
- if (!vg_object_is_valid(paint, VG_OBJECT_PAINT) ||
- !vg_object_is_valid(pattern, VG_OBJECT_IMAGE)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- paint_set_pattern(handle_to_paint(paint),
- handle_to_image(pattern));
-}
-
diff --git a/src/gallium/state_trackers/vega/api_params.c b/src/gallium/state_trackers/vega/api_params.c
deleted file mode 100644
index aa1e5dd280a..00000000000
--- a/src/gallium/state_trackers/vega/api_params.c
+++ /dev/null
@@ -1,1679 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "vg_context.h"
-#include "paint.h"
-#include "path.h"
-#include "handle.h"
-#include "image.h"
-#include "text.h"
-#include "matrix.h"
-#include "api_consts.h"
-#include "api.h"
-
-#include "pipe/p_compiler.h"
-#include "util/u_pointer.h"
-#include "util/u_math.h"
-
-#include <math.h>
-
-static INLINE struct vg_state *current_state()
-{
- struct vg_context *ctx = vg_current_context();
- if (!ctx)
- return 0;
- else
- return &ctx->state.vg;
-}
-
-static INLINE VGboolean count_in_bounds(VGParamType type, VGint count)
-{
- if (count < 0)
- return VG_FALSE;
-
- if (type == VG_SCISSOR_RECTS)
- return (!(count % 4) && (count >= 0 || count <= VEGA_MAX_SCISSOR_RECTS * 4));
- else if (type == VG_STROKE_DASH_PATTERN) {
- return count <= VEGA_MAX_DASH_COUNT;
- } else {
- VGint real_count = vegaGetVectorSize(type);
- return count == real_count;
- }
-}
-
-void vegaSetf (VGParamType type, VGfloat value)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_state *state = current_state();
- VGErrorCode error = VG_NO_ERROR;
-
- switch(type) {
- case VG_MATRIX_MODE:
- case VG_FILL_RULE:
- case VG_IMAGE_QUALITY:
- case VG_RENDERING_QUALITY:
- case VG_BLEND_MODE:
- case VG_IMAGE_MODE:
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM:
-#endif
- case VG_STROKE_CAP_STYLE:
- case VG_STROKE_JOIN_STYLE:
- case VG_STROKE_DASH_PHASE_RESET:
- case VG_MASKING:
- case VG_SCISSORING:
- case VG_PIXEL_LAYOUT:
- case VG_SCREEN_LAYOUT:
- case VG_FILTER_FORMAT_LINEAR:
- case VG_FILTER_FORMAT_PREMULTIPLIED:
- case VG_FILTER_CHANNEL_MASK:
-
- case VG_MAX_SCISSOR_RECTS:
- case VG_MAX_DASH_COUNT:
- case VG_MAX_KERNEL_SIZE:
- case VG_MAX_SEPARABLE_KERNEL_SIZE:
- case VG_MAX_COLOR_RAMP_STOPS:
- case VG_MAX_IMAGE_WIDTH:
- case VG_MAX_IMAGE_HEIGHT:
- case VG_MAX_IMAGE_PIXELS:
- case VG_MAX_IMAGE_BYTES:
- case VG_MAX_GAUSSIAN_STD_DEVIATION:
- case VG_MAX_FLOAT:
- vegaSeti(type, floor(value));
- return;
- break;
- case VG_STROKE_LINE_WIDTH:
- state->stroke.line_width.f = value;
- state->stroke.line_width.i = float_to_int_floor(*((VGuint*)(&value)));
- break;
- case VG_STROKE_MITER_LIMIT:
- state->stroke.miter_limit.f = value;
- state->stroke.miter_limit.i = float_to_int_floor(*((VGuint*)(&value)));
- break;
- case VG_STROKE_DASH_PHASE:
- state->stroke.dash_phase.f = value;
- state->stroke.dash_phase.i = float_to_int_floor(*((VGuint*)(&value)));
- break;
- default:
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- break;
- }
- vg_set_error(ctx, error);
-}
-
-void vegaSeti (VGParamType type, VGint value)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_state *state = current_state();
- VGErrorCode error = VG_NO_ERROR;
-
- switch(type) {
- case VG_MATRIX_MODE:
- if (value < VG_MATRIX_PATH_USER_TO_SURFACE ||
-#ifdef OPENVG_VERSION_1_1
- value > VG_MATRIX_GLYPH_USER_TO_SURFACE)
-#else
- value > VG_MATRIX_STROKE_PAINT_TO_USER)
-#endif
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- else
- state->matrix_mode = value;
- break;
- case VG_FILL_RULE:
- if (value < VG_EVEN_ODD ||
- value > VG_NON_ZERO)
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- else
- state->fill_rule = value;
- break;
- case VG_IMAGE_QUALITY:
- state->image_quality = value;
- break;
- case VG_RENDERING_QUALITY:
- if (value < VG_RENDERING_QUALITY_NONANTIALIASED ||
- value > VG_RENDERING_QUALITY_BETTER)
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- else
- state->rendering_quality = value;
- break;
- case VG_BLEND_MODE:
- if (value < VG_BLEND_SRC ||
- value > VG_BLEND_ADDITIVE)
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- else {
- ctx->state.dirty |= BLEND_DIRTY;
- state->blend_mode = value;
- }
- break;
- case VG_IMAGE_MODE:
- if (value < VG_DRAW_IMAGE_NORMAL ||
- value > VG_DRAW_IMAGE_STENCIL)
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- else
- state->image_mode = value;
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM:
- state->color_transform = value;
-#endif
- break;
- case VG_STROKE_LINE_WIDTH:
- state->stroke.line_width.f = value;
- state->stroke.line_width.i = value;
- break;
- case VG_STROKE_CAP_STYLE:
- if (value < VG_CAP_BUTT ||
- value > VG_CAP_SQUARE)
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- else
- state->stroke.cap_style = value;
- break;
- case VG_STROKE_JOIN_STYLE:
- if (value < VG_JOIN_MITER ||
- value > VG_JOIN_BEVEL)
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- else
- state->stroke.join_style = value;
- break;
- case VG_STROKE_MITER_LIMIT:
- state->stroke.miter_limit.f = value;
- state->stroke.miter_limit.i = value;
- break;
- case VG_STROKE_DASH_PHASE:
- state->stroke.dash_phase.f = value;
- state->stroke.dash_phase.i = value;
- break;
- case VG_STROKE_DASH_PHASE_RESET:
- state->stroke.dash_phase_reset = value;
- break;
- case VG_MASKING:
- state->masking = value;
- break;
- case VG_SCISSORING:
- state->scissoring = value;
- ctx->state.dirty |= DEPTH_STENCIL_DIRTY;
- break;
- case VG_PIXEL_LAYOUT:
- if (value < VG_PIXEL_LAYOUT_UNKNOWN ||
- value > VG_PIXEL_LAYOUT_BGR_HORIZONTAL)
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- else
- state->pixel_layout = value;
- break;
- case VG_SCREEN_LAYOUT:
- /* read only ignore */
- break;
- case VG_FILTER_FORMAT_LINEAR:
- state->filter_format_linear = value;
- break;
- case VG_FILTER_FORMAT_PREMULTIPLIED:
- state->filter_format_premultiplied = value;
- break;
- case VG_FILTER_CHANNEL_MASK:
- state->filter_channel_mask = value;
- break;
-
- case VG_MAX_SCISSOR_RECTS:
- case VG_MAX_DASH_COUNT:
- case VG_MAX_KERNEL_SIZE:
- case VG_MAX_SEPARABLE_KERNEL_SIZE:
- case VG_MAX_COLOR_RAMP_STOPS:
- case VG_MAX_IMAGE_WIDTH:
- case VG_MAX_IMAGE_HEIGHT:
- case VG_MAX_IMAGE_PIXELS:
- case VG_MAX_IMAGE_BYTES:
- case VG_MAX_GAUSSIAN_STD_DEVIATION:
- case VG_MAX_FLOAT:
- /* read only ignore */
- break;
- default:
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- break;
- }
- vg_set_error(ctx, error);
-}
-
-void vegaSetfv(VGParamType type, VGint count,
- const VGfloat * values)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_state *state = current_state();
- VGErrorCode error = VG_NO_ERROR;
-
- if ((count && !values) || !count_in_bounds(type, count) || !is_aligned(values)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- switch(type) {
- case VG_MATRIX_MODE:
- case VG_FILL_RULE:
- case VG_IMAGE_QUALITY:
- case VG_RENDERING_QUALITY:
- case VG_BLEND_MODE:
- case VG_IMAGE_MODE:
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM:
-#endif
- case VG_STROKE_CAP_STYLE:
- case VG_STROKE_JOIN_STYLE:
- case VG_STROKE_DASH_PHASE_RESET:
- case VG_MASKING:
- case VG_SCISSORING:
- case VG_PIXEL_LAYOUT:
- case VG_SCREEN_LAYOUT:
- case VG_FILTER_FORMAT_LINEAR:
- case VG_FILTER_FORMAT_PREMULTIPLIED:
- case VG_FILTER_CHANNEL_MASK:
- vegaSeti(type, floor(values[0]));
- return;
- break;
- case VG_SCISSOR_RECTS: {
- VGint i;
- VGuint *x = (VGuint*)values;
- for (i = 0; i < count; ++i) {
- state->scissor_rects[i].f = values[i];
- state->scissor_rects[i].i = float_to_int_floor(x[i]);
- }
- state->scissor_rects_num = count / 4;
- ctx->state.dirty |= DEPTH_STENCIL_DIRTY;
- }
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM_VALUES: {
- VGint i;
- for (i = 0; i < count; ++i) {
- state->color_transform_values[i] = values[i];
- }
- }
- break;
-#endif
- case VG_STROKE_LINE_WIDTH:
- state->stroke.line_width.f = values[0];
- state->stroke.line_width.i = float_to_int_floor(*((VGuint*)(values)));
- break;
- case VG_STROKE_MITER_LIMIT:
- state->stroke.miter_limit.f = values[0];
- state->stroke.miter_limit.i = float_to_int_floor(*((VGuint*)(values)));
- break;
- case VG_STROKE_DASH_PATTERN: {
- int i;
- for (i = 0; i < count; ++i) {
- state->stroke.dash_pattern[i].f = values[i];
- state->stroke.dash_pattern[i].i =
- float_to_int_floor(*((VGuint*)(values + i)));
- }
- state->stroke.dash_pattern_num = count;
- }
- break;
- case VG_STROKE_DASH_PHASE:
- state->stroke.dash_phase.f = values[0];
- state->stroke.dash_phase.i = float_to_int_floor(*((VGuint*)(values)));
- break;
- case VG_TILE_FILL_COLOR:
- state->tile_fill_color[0] = values[0];
- state->tile_fill_color[1] = values[1];
- state->tile_fill_color[2] = values[2];
- state->tile_fill_color[3] = values[3];
-
- state->tile_fill_colori[0] = float_to_int_floor(*((VGuint*)(values + 0)));
- state->tile_fill_colori[1] = float_to_int_floor(*((VGuint*)(values + 1)));
- state->tile_fill_colori[2] = float_to_int_floor(*((VGuint*)(values + 2)));
- state->tile_fill_colori[3] = float_to_int_floor(*((VGuint*)(values + 3)));
- break;
- case VG_CLEAR_COLOR:
- state->clear_color[0] = values[0];
- state->clear_color[1] = values[1];
- state->clear_color[2] = values[2];
- state->clear_color[3] = values[3];
-
- state->clear_colori[0] = float_to_int_floor(*((VGuint*)(values + 0)));
- state->clear_colori[1] = float_to_int_floor(*((VGuint*)(values + 1)));
- state->clear_colori[2] = float_to_int_floor(*((VGuint*)(values + 2)));
- state->clear_colori[3] = float_to_int_floor(*((VGuint*)(values + 3)));
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_GLYPH_ORIGIN:
- state->glyph_origin[0].f = values[0];
- state->glyph_origin[1].f = values[1];
-
- state->glyph_origin[0].i = float_to_int_floor(*((VGuint*)(values + 0)));
- state->glyph_origin[1].i = float_to_int_floor(*((VGuint*)(values + 1)));
- break;
-#endif
-
- case VG_MAX_SCISSOR_RECTS:
- case VG_MAX_DASH_COUNT:
- case VG_MAX_KERNEL_SIZE:
- case VG_MAX_SEPARABLE_KERNEL_SIZE:
- case VG_MAX_COLOR_RAMP_STOPS:
- case VG_MAX_IMAGE_WIDTH:
- case VG_MAX_IMAGE_HEIGHT:
- case VG_MAX_IMAGE_PIXELS:
- case VG_MAX_IMAGE_BYTES:
- case VG_MAX_GAUSSIAN_STD_DEVIATION:
- case VG_MAX_FLOAT:
- break;
- default:
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- break;
- }
- vg_set_error(ctx, error);
-}
-
-void vegaSetiv(VGParamType type, VGint count,
- const VGint * values)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_state *state = current_state();
-
- if ((count && !values) || !count_in_bounds(type, count) || !is_aligned(values)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- switch(type) {
- case VG_MATRIX_MODE:
- case VG_FILL_RULE:
- case VG_IMAGE_QUALITY:
- case VG_RENDERING_QUALITY:
- case VG_BLEND_MODE:
- case VG_IMAGE_MODE:
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM:
-#endif
- case VG_STROKE_CAP_STYLE:
- case VG_STROKE_JOIN_STYLE:
- case VG_STROKE_DASH_PHASE_RESET:
- case VG_MASKING:
- case VG_SCISSORING:
- case VG_PIXEL_LAYOUT:
- case VG_SCREEN_LAYOUT:
- case VG_FILTER_FORMAT_LINEAR:
- case VG_FILTER_FORMAT_PREMULTIPLIED:
- case VG_FILTER_CHANNEL_MASK:
- vegaSeti(type, values[0]);
- return;
- break;
- case VG_SCISSOR_RECTS: {
- VGint i;
- for (i = 0; i < count; ++i) {
- state->scissor_rects[i].i = values[i];
- state->scissor_rects[i].f = values[i];
- }
- state->scissor_rects_num = count / 4;
- ctx->state.dirty |= DEPTH_STENCIL_DIRTY;
- }
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM_VALUES: {
- VGint i;
- for (i = 0; i < count; ++i) {
- state->color_transform_values[i] = values[i];
- }
- }
- break;
-#endif
- case VG_STROKE_LINE_WIDTH:
- state->stroke.line_width.f = values[0];
- state->stroke.line_width.i = values[0];
- break;
- case VG_STROKE_MITER_LIMIT:
- state->stroke.miter_limit.f = values[0];
- state->stroke.miter_limit.i = values[0];
- break;
- case VG_STROKE_DASH_PATTERN: {
- int i;
- for (i = 0; i < count; ++i) {
- state->stroke.dash_pattern[i].f = values[i];
- state->stroke.dash_pattern[i].i = values[i];
- }
- state->stroke.dash_pattern_num = count;
- }
- break;
- case VG_STROKE_DASH_PHASE:
- state->stroke.dash_phase.f = values[0];
- state->stroke.dash_phase.i = values[0];
- break;
- case VG_TILE_FILL_COLOR:
- state->tile_fill_color[0] = values[0];
- state->tile_fill_color[1] = values[1];
- state->tile_fill_color[2] = values[2];
- state->tile_fill_color[3] = values[3];
-
- state->tile_fill_colori[0] = values[0];
- state->tile_fill_colori[1] = values[1];
- state->tile_fill_colori[2] = values[2];
- state->tile_fill_colori[3] = values[3];
- break;
- case VG_CLEAR_COLOR:
- state->clear_color[0] = values[0];
- state->clear_color[1] = values[1];
- state->clear_color[2] = values[2];
- state->clear_color[3] = values[3];
-
- state->clear_colori[0] = values[0];
- state->clear_colori[1] = values[1];
- state->clear_colori[2] = values[2];
- state->clear_colori[3] = values[3];
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_GLYPH_ORIGIN:
- state->glyph_origin[0].f = values[0];
- state->glyph_origin[1].f = values[1];
- state->glyph_origin[0].i = values[0];
- state->glyph_origin[1].i = values[1];
- break;
-#endif
-
- case VG_MAX_SCISSOR_RECTS:
- case VG_MAX_DASH_COUNT:
- case VG_MAX_KERNEL_SIZE:
- case VG_MAX_SEPARABLE_KERNEL_SIZE:
- case VG_MAX_COLOR_RAMP_STOPS:
- case VG_MAX_IMAGE_WIDTH:
- case VG_MAX_IMAGE_HEIGHT:
- case VG_MAX_IMAGE_PIXELS:
- case VG_MAX_IMAGE_BYTES:
- case VG_MAX_GAUSSIAN_STD_DEVIATION:
- case VG_MAX_FLOAT:
- break;
-
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- }
-}
-
-VGfloat vegaGetf(VGParamType type)
-{
- struct vg_context *ctx = vg_current_context();
- const struct vg_state *state = current_state();
- VGErrorCode error = VG_NO_ERROR;
- VGfloat value = 0.0f;
-
- switch(type) {
- case VG_MATRIX_MODE:
- case VG_FILL_RULE:
- case VG_IMAGE_QUALITY:
- case VG_RENDERING_QUALITY:
- case VG_BLEND_MODE:
- case VG_IMAGE_MODE:
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM:
-#endif
- case VG_STROKE_CAP_STYLE:
- case VG_STROKE_JOIN_STYLE:
- case VG_STROKE_DASH_PHASE_RESET:
- case VG_MASKING:
- case VG_SCISSORING:
- case VG_PIXEL_LAYOUT:
- case VG_SCREEN_LAYOUT:
- case VG_FILTER_FORMAT_LINEAR:
- case VG_FILTER_FORMAT_PREMULTIPLIED:
- case VG_FILTER_CHANNEL_MASK:
- return vegaGeti(type);
- break;
- case VG_STROKE_LINE_WIDTH:
- value = state->stroke.line_width.f;
- break;
- case VG_STROKE_MITER_LIMIT:
- value = state->stroke.miter_limit.f;
- break;
- case VG_STROKE_DASH_PHASE:
- value = state->stroke.dash_phase.f;
- break;
-
- case VG_MAX_SCISSOR_RECTS:
- case VG_MAX_DASH_COUNT:
- case VG_MAX_KERNEL_SIZE:
- case VG_MAX_SEPARABLE_KERNEL_SIZE:
- case VG_MAX_COLOR_RAMP_STOPS:
- case VG_MAX_IMAGE_WIDTH:
- case VG_MAX_IMAGE_HEIGHT:
- case VG_MAX_IMAGE_PIXELS:
- case VG_MAX_IMAGE_BYTES:
- case VG_MAX_GAUSSIAN_STD_DEVIATION:
- return vegaGeti(type);
- break;
- case VG_MAX_FLOAT:
- value = 1e+10;/*must be at least 1e+10*/
- break;
- default:
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- break;
- }
- vg_set_error(ctx, error);
- return value;
-}
-
-VGint vegaGeti(VGParamType type)
-{
- const struct vg_state *state = current_state();
- struct vg_context *ctx = vg_current_context();
- VGErrorCode error = VG_NO_ERROR;
- VGint value = 0;
-
- switch(type) {
- case VG_MATRIX_MODE:
- value = state->matrix_mode;
- break;
- case VG_FILL_RULE:
- value = state->fill_rule;
- break;
- case VG_IMAGE_QUALITY:
- value = state->image_quality;
- break;
- case VG_RENDERING_QUALITY:
- value = state->rendering_quality;
- break;
- case VG_BLEND_MODE:
- value = state->blend_mode;
- break;
- case VG_IMAGE_MODE:
- value = state->image_mode;
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM:
- value = state->color_transform;
- break;
-#endif
- case VG_STROKE_LINE_WIDTH:
- value = state->stroke.line_width.i;
- break;
- case VG_STROKE_CAP_STYLE:
- value = state->stroke.cap_style;
- break;
- case VG_STROKE_JOIN_STYLE:
- value = state->stroke.join_style;
- break;
- case VG_STROKE_MITER_LIMIT:
- value = state->stroke.miter_limit.i;
- break;
- case VG_STROKE_DASH_PHASE:
- value = state->stroke.dash_phase.i;
- break;
- case VG_STROKE_DASH_PHASE_RESET:
- value = state->stroke.dash_phase_reset;
- break;
- case VG_MASKING:
- value = state->masking;
- break;
- case VG_SCISSORING:
- value = state->scissoring;
- break;
- case VG_PIXEL_LAYOUT:
- value = state->pixel_layout;
- break;
- case VG_SCREEN_LAYOUT:
- value = state->screen_layout;
- break;
- case VG_FILTER_FORMAT_LINEAR:
- value = state->filter_format_linear;
- break;
- case VG_FILTER_FORMAT_PREMULTIPLIED:
- value = state->filter_format_premultiplied;
- break;
- case VG_FILTER_CHANNEL_MASK:
- value = state->filter_channel_mask;
- break;
-
- case VG_MAX_SCISSOR_RECTS:
- value = 32; /*must be at least 32*/
- break;
- case VG_MAX_DASH_COUNT:
- value = 16; /*must be at least 16*/
- break;
- case VG_MAX_KERNEL_SIZE:
- value = 7; /*must be at least 7*/
- break;
- case VG_MAX_SEPARABLE_KERNEL_SIZE:
- value = 15; /*must be at least 15*/
- break;
- case VG_MAX_COLOR_RAMP_STOPS:
- value = 256; /*must be at least 32*/
- break;
- case VG_MAX_IMAGE_WIDTH:
- value = 2048;
- break;
- case VG_MAX_IMAGE_HEIGHT:
- value = 2048;
- break;
- case VG_MAX_IMAGE_PIXELS:
- value = 2048*2048;
- break;
- case VG_MAX_IMAGE_BYTES:
- value = 2048*2048 * 4;
- break;
- case VG_MAX_GAUSSIAN_STD_DEVIATION:
- value = 128; /*must be at least 128*/
- break;
-
- case VG_MAX_FLOAT: {
- VGfloat val = vegaGetf(type);
- value = float_to_int_floor(*((VGuint*)&val));
- }
- break;
- default:
- error = VG_ILLEGAL_ARGUMENT_ERROR;
- break;
- }
- vg_set_error(ctx, error);
- return value;
-}
-
-VGint vegaGetVectorSize(VGParamType type)
-{
- struct vg_context *ctx = vg_current_context();
- const struct vg_state *state = current_state();
- switch(type) {
- case VG_MATRIX_MODE:
- case VG_FILL_RULE:
- case VG_IMAGE_QUALITY:
- case VG_RENDERING_QUALITY:
- case VG_BLEND_MODE:
- case VG_IMAGE_MODE:
- return 1;
- case VG_SCISSOR_RECTS:
- return state->scissor_rects_num * 4;
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM:
- return 1;
- case VG_COLOR_TRANSFORM_VALUES:
- return 8;
-#endif
- case VG_STROKE_LINE_WIDTH:
- case VG_STROKE_CAP_STYLE:
- case VG_STROKE_JOIN_STYLE:
- case VG_STROKE_MITER_LIMIT:
- return 1;
- case VG_STROKE_DASH_PATTERN:
- return state->stroke.dash_pattern_num;
- case VG_STROKE_DASH_PHASE:
- return 1;
- case VG_STROKE_DASH_PHASE_RESET:
- return 1;
- case VG_TILE_FILL_COLOR:
- return 4;
- case VG_CLEAR_COLOR:
- return 4;
-#ifdef OPENVG_VERSION_1_1
- case VG_GLYPH_ORIGIN:
- return 2;
-#endif
- case VG_MASKING:
- return 1;
- case VG_SCISSORING:
- return 1;
- case VG_PIXEL_LAYOUT:
- return 1;
- case VG_SCREEN_LAYOUT:
- return 1;
- case VG_FILTER_FORMAT_LINEAR:
- return 1;
- case VG_FILTER_FORMAT_PREMULTIPLIED:
- return 1;
- case VG_FILTER_CHANNEL_MASK:
- return 1;
-
- case VG_MAX_COLOR_RAMP_STOPS:
- return 1;
- case VG_MAX_SCISSOR_RECTS:
- case VG_MAX_DASH_COUNT:
- case VG_MAX_KERNEL_SIZE:
- case VG_MAX_SEPARABLE_KERNEL_SIZE:
- case VG_MAX_IMAGE_WIDTH:
- case VG_MAX_IMAGE_HEIGHT:
- case VG_MAX_IMAGE_PIXELS:
- case VG_MAX_IMAGE_BYTES:
- case VG_MAX_FLOAT:
- case VG_MAX_GAUSSIAN_STD_DEVIATION:
- return 1;
- default:
- if (ctx)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return 0;
- }
-}
-
-void vegaGetfv(VGParamType type, VGint count,
- VGfloat * values)
-{
- const struct vg_state *state = current_state();
- struct vg_context *ctx = vg_current_context();
- VGint real_count = vegaGetVectorSize(type);
-
- if (!values || count <= 0 || count > real_count || !is_aligned(values)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- switch(type) {
- case VG_MATRIX_MODE:
- case VG_FILL_RULE:
- case VG_IMAGE_QUALITY:
- case VG_RENDERING_QUALITY:
- case VG_BLEND_MODE:
- case VG_IMAGE_MODE:
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM:
-#endif
- case VG_STROKE_CAP_STYLE:
- case VG_STROKE_JOIN_STYLE:
- case VG_STROKE_DASH_PHASE_RESET:
- case VG_MASKING:
- case VG_SCISSORING:
- case VG_PIXEL_LAYOUT:
- case VG_SCREEN_LAYOUT:
- case VG_FILTER_FORMAT_LINEAR:
- case VG_FILTER_FORMAT_PREMULTIPLIED:
- case VG_FILTER_CHANNEL_MASK:
- case VG_MAX_SCISSOR_RECTS:
- case VG_MAX_DASH_COUNT:
- case VG_MAX_KERNEL_SIZE:
- case VG_MAX_SEPARABLE_KERNEL_SIZE:
- case VG_MAX_COLOR_RAMP_STOPS:
- case VG_MAX_IMAGE_WIDTH:
- case VG_MAX_IMAGE_HEIGHT:
- case VG_MAX_IMAGE_PIXELS:
- case VG_MAX_IMAGE_BYTES:
- case VG_MAX_GAUSSIAN_STD_DEVIATION:
- values[0] = vegaGeti(type);
- break;
- case VG_MAX_FLOAT:
- values[0] = vegaGetf(type);
- break;
- case VG_SCISSOR_RECTS: {
- VGint i;
- for (i = 0; i < count; ++i) {
- values[i] = state->scissor_rects[i].f;
- }
- }
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM_VALUES: {
- memcpy(values, state->color_transform_values,
- sizeof(VGfloat) * count);
- }
- break;
-#endif
- case VG_STROKE_LINE_WIDTH:
- values[0] = state->stroke.line_width.f;
- break;
- case VG_STROKE_MITER_LIMIT:
- values[0] = state->stroke.miter_limit.f;
- break;
- case VG_STROKE_DASH_PATTERN: {
- VGint i;
- for (i = 0; i < count; ++i) {
- values[i] = state->stroke.dash_pattern[i].f;
- }
- }
- break;
- case VG_STROKE_DASH_PHASE:
- values[0] = state->stroke.dash_phase.f;
- break;
- case VG_TILE_FILL_COLOR:
- values[0] = state->tile_fill_color[0];
- values[1] = state->tile_fill_color[1];
- values[2] = state->tile_fill_color[2];
- values[3] = state->tile_fill_color[3];
- break;
- case VG_CLEAR_COLOR:
- values[0] = state->clear_color[0];
- values[1] = state->clear_color[1];
- values[2] = state->clear_color[2];
- values[3] = state->clear_color[3];
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_GLYPH_ORIGIN:
- values[0] = state->glyph_origin[0].f;
- values[1] = state->glyph_origin[1].f;
- break;
-#endif
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- }
-}
-
-void vegaGetiv(VGParamType type, VGint count,
- VGint * values)
-{
- const struct vg_state *state = current_state();
- struct vg_context *ctx = vg_current_context();
- VGint real_count = vegaGetVectorSize(type);
-
- if (!values || count <= 0 || count > real_count || !is_aligned(values)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- switch(type) {
- case VG_MATRIX_MODE:
- case VG_FILL_RULE:
- case VG_IMAGE_QUALITY:
- case VG_RENDERING_QUALITY:
- case VG_BLEND_MODE:
- case VG_IMAGE_MODE:
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM:
-#endif
- case VG_STROKE_CAP_STYLE:
- case VG_STROKE_JOIN_STYLE:
- case VG_STROKE_DASH_PHASE_RESET:
- case VG_MASKING:
- case VG_SCISSORING:
- case VG_PIXEL_LAYOUT:
- case VG_SCREEN_LAYOUT:
- case VG_FILTER_FORMAT_LINEAR:
- case VG_FILTER_FORMAT_PREMULTIPLIED:
- case VG_FILTER_CHANNEL_MASK:
- case VG_MAX_SCISSOR_RECTS:
- case VG_MAX_DASH_COUNT:
- case VG_MAX_KERNEL_SIZE:
- case VG_MAX_SEPARABLE_KERNEL_SIZE:
- case VG_MAX_COLOR_RAMP_STOPS:
- case VG_MAX_IMAGE_WIDTH:
- case VG_MAX_IMAGE_HEIGHT:
- case VG_MAX_IMAGE_PIXELS:
- case VG_MAX_IMAGE_BYTES:
- case VG_MAX_GAUSSIAN_STD_DEVIATION:
- values[0] = vegaGeti(type);
- break;
- case VG_MAX_FLOAT: {
- VGfloat val = vegaGetf(type);
- values[0] = float_to_int_floor(*((VGuint*)&val));
- }
- break;
- case VG_SCISSOR_RECTS: {
- VGint i;
- for (i = 0; i < count; ++i) {
- values[i] = state->scissor_rects[i].i;
- }
- }
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_COLOR_TRANSFORM_VALUES: {
- VGint i;
- VGuint *x = (VGuint*)state->color_transform_values;
- for (i = 0; i < count; ++i) {
- values[i] = float_to_int_floor(x[i]);
- }
- }
- break;
-#endif
- case VG_STROKE_LINE_WIDTH:
- values[0] = state->stroke.line_width.i;
- break;
- case VG_STROKE_MITER_LIMIT:
- values[0] = state->stroke.miter_limit.i;
- break;
- case VG_STROKE_DASH_PATTERN: {
- VGint i;
- for (i = 0; i < count; ++i) {
- values[i] = state->stroke.dash_pattern[i].i;
- }
- }
- break;
- case VG_STROKE_DASH_PHASE:
- values[0] = state->stroke.dash_phase.i;
- break;
- case VG_TILE_FILL_COLOR:
- values[0] = state->tile_fill_colori[0];
- values[1] = state->tile_fill_colori[1];
- values[2] = state->tile_fill_colori[2];
- values[3] = state->tile_fill_colori[3];
- break;
- case VG_CLEAR_COLOR:
- values[0] = state->clear_colori[0];
- values[1] = state->clear_colori[1];
- values[2] = state->clear_colori[2];
- values[3] = state->clear_colori[3];
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_GLYPH_ORIGIN:
- values[0] = state->glyph_origin[0].i;
- values[1] = state->glyph_origin[1].i;
- break;
-#endif
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- }
-}
-
-void vegaSetParameterf(VGHandle object,
- VGint paramType,
- VGfloat value)
-{
- struct vg_context *ctx = vg_current_context();
- void *ptr = handle_to_pointer(object);
-
- if (object == VG_INVALID_HANDLE || !is_aligned(ptr)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- switch(paramType) {
- case VG_PAINT_TYPE:
- case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
- case VG_PAINT_PATTERN_TILING_MODE:
- vegaSetParameteri(object, paramType, floor(value));
- return;
- break;
- case VG_PAINT_COLOR:
- case VG_PAINT_COLOR_RAMP_STOPS:
- case VG_PAINT_LINEAR_GRADIENT:
- case VG_PAINT_RADIAL_GRADIENT:
- /* it's an error if paramType refers to a vector parameter */
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- case VG_PAINT_COLOR_RAMP_PREMULTIPLIED: {
- struct vg_paint *p = handle_to_paint(object);
- paint_set_color_ramp_premultiplied(p, value);
- }
- break;
-
- case VG_PATH_DATATYPE:
- case VG_PATH_FORMAT:
- case VG_PATH_SCALE:
- case VG_PATH_BIAS:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
-
- case VG_IMAGE_FORMAT:
- case VG_IMAGE_WIDTH:
- case VG_IMAGE_HEIGHT:
-
-#ifdef OPENVG_VERSION_1_1
- case VG_FONT_NUM_GLYPHS:
- /* read only don't produce an error */
- break;
-#endif
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- }
-}
-
-void vegaSetParameteri(VGHandle object,
- VGint paramType,
- VGint value)
-{
- struct vg_context *ctx = vg_current_context();
- void *ptr = handle_to_pointer(object);
-
- if (object == VG_INVALID_HANDLE || !is_aligned(ptr)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- switch(paramType) {
- case VG_PAINT_TYPE:
- if (value < VG_PAINT_TYPE_COLOR ||
- value > VG_PAINT_TYPE_PATTERN)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- struct vg_paint *paint = handle_to_paint(object);
- paint_set_type(paint, value);
- }
- break;
- case VG_PAINT_COLOR:
- case VG_PAINT_COLOR_RAMP_STOPS:
- case VG_PAINT_LINEAR_GRADIENT:
- case VG_PAINT_RADIAL_GRADIENT:
- /* it's an error if paramType refers to a vector parameter */
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
- if (value < VG_COLOR_RAMP_SPREAD_PAD ||
- value > VG_COLOR_RAMP_SPREAD_REFLECT)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- struct vg_paint *paint = handle_to_paint(object);
- paint_set_spread_mode(paint, value);
- }
- break;
- case VG_PAINT_COLOR_RAMP_PREMULTIPLIED: {
- struct vg_paint *p = handle_to_paint(object);
- paint_set_color_ramp_premultiplied(p, value);
- }
- break;
- case VG_PAINT_PATTERN_TILING_MODE:
- if (value < VG_TILE_FILL ||
- value > VG_TILE_REFLECT)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- struct vg_paint *paint = handle_to_paint(object);
- paint_set_pattern_tiling(paint, value);
- }
- break;
-
- case VG_PATH_DATATYPE:
- case VG_PATH_FORMAT:
- case VG_PATH_SCALE:
- case VG_PATH_BIAS:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
-
- case VG_IMAGE_FORMAT:
- case VG_IMAGE_WIDTH:
- case VG_IMAGE_HEIGHT:
-
-#ifdef OPENVG_VERSION_1_1
- case VG_FONT_NUM_GLYPHS:
- /* read only don't produce an error */
- break;
-#endif
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-}
-
-void vegaSetParameterfv(VGHandle object,
- VGint paramType,
- VGint count,
- const VGfloat * values)
-{
- struct vg_context *ctx = vg_current_context();
- void *ptr = handle_to_pointer(object);
- VGint real_count = vegaGetParameterVectorSize(object, paramType);
-
- if (object == VG_INVALID_HANDLE || !is_aligned(ptr)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (count < 0 || count < real_count ||
- (values == NULL && count != 0) ||
- !is_aligned(values)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- switch(paramType) {
- case VG_PAINT_TYPE:
- case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
- case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
- case VG_PAINT_PATTERN_TILING_MODE:
- if (count != 1)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else
- vegaSetParameterf(object, paramType, values[0]);
- return;
- break;
- case VG_PAINT_COLOR: {
- if (count != 4)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- struct vg_paint *paint = handle_to_paint(object);
- paint_set_color(paint, values);
- if (ctx->state.vg.fill_paint == paint ||
- ctx->state.vg.stroke_paint == paint)
- ctx->state.dirty |= PAINT_DIRTY;
- }
- }
- break;
- case VG_PAINT_COLOR_RAMP_STOPS: {
- if (count && count < 4)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- struct vg_paint *paint = handle_to_paint(object);
- count = MIN2(count, VEGA_MAX_COLOR_RAMP_STOPS);
- paint_set_ramp_stops(paint, values, count);
- {
- VGint stopsi[VEGA_MAX_COLOR_RAMP_STOPS];
- int i = 0;
- for (i = 0; i < count; ++i) {
- stopsi[i] = float_to_int_floor(*((VGuint*)(values + i)));
- }
- paint_set_ramp_stopsi(paint, stopsi, count);
- }
- }
- }
- break;
- case VG_PAINT_LINEAR_GRADIENT: {
- if (count != 4)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- struct vg_paint *paint = handle_to_paint(object);
- paint_set_linear_gradient(paint, values);
- {
- VGint vals[4];
- vals[0] = FLT_TO_INT(values[0]);
- vals[1] = FLT_TO_INT(values[1]);
- vals[2] = FLT_TO_INT(values[2]);
- vals[3] = FLT_TO_INT(values[3]);
- paint_set_linear_gradienti(paint, vals);
- }
- }
- }
- break;
- case VG_PAINT_RADIAL_GRADIENT: {
- if (count != 5)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- struct vg_paint *paint = handle_to_paint(object);
- paint_set_radial_gradient(paint, values);
- {
- VGint vals[5];
- vals[0] = FLT_TO_INT(values[0]);
- vals[1] = FLT_TO_INT(values[1]);
- vals[2] = FLT_TO_INT(values[2]);
- vals[3] = FLT_TO_INT(values[3]);
- vals[4] = FLT_TO_INT(values[4]);
- paint_set_radial_gradienti(paint, vals);
- }
- }
- }
- break;
-
- case VG_PATH_DATATYPE:
- case VG_PATH_FORMAT:
- case VG_PATH_SCALE:
- case VG_PATH_BIAS:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
-
-#ifdef OPENVG_VERSION_1_1
- case VG_FONT_NUM_GLYPHS:
- /* read only don't produce an error */
- break;
-#endif
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-}
-
-void vegaSetParameteriv(VGHandle object,
- VGint paramType,
- VGint count,
- const VGint * values)
-{
- struct vg_context *ctx = vg_current_context();
- void *ptr = handle_to_pointer(object);
- VGint real_count = vegaGetParameterVectorSize(object, paramType);
-
- if (object == VG_INVALID_HANDLE || !is_aligned(ptr)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (count < 0 || count < real_count ||
- (values == NULL && count != 0) ||
- !is_aligned(values)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- switch(paramType) {
- case VG_PAINT_TYPE:
- case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
- case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
- case VG_PAINT_PATTERN_TILING_MODE:
- if (count != 1)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else
- vegaSetParameteri(object, paramType, values[0]);
- return;
- break;
- case VG_PAINT_COLOR: {
- if (count != 4)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- struct vg_paint *paint = handle_to_paint(object);
- paint_set_coloriv(paint, values);
- if (ctx->state.vg.fill_paint == paint ||
- ctx->state.vg.stroke_paint == paint)
- ctx->state.dirty |= PAINT_DIRTY;
- }
- }
- break;
- case VG_PAINT_COLOR_RAMP_STOPS: {
- if ((count % 5))
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- VGfloat *vals = 0;
- int i;
- struct vg_paint *paint = handle_to_paint(object);
- if (count) {
- vals = malloc(sizeof(VGfloat)*count);
- for (i = 0; i < count; ++i)
- vals[i] = values[i];
- }
-
- paint_set_ramp_stopsi(paint, values, count);
- paint_set_ramp_stops(paint, vals, count);
- free(vals);
- }
- }
- break;
- case VG_PAINT_LINEAR_GRADIENT: {
- if (count != 4)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- VGfloat vals[4];
- struct vg_paint *paint = handle_to_paint(object);
- vals[0] = values[0];
- vals[1] = values[1];
- vals[2] = values[2];
- vals[3] = values[3];
- paint_set_linear_gradient(paint, vals);
- paint_set_linear_gradienti(paint, values);
- }
- }
- break;
- case VG_PAINT_RADIAL_GRADIENT: {
- if (count != 5)
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- else {
- VGfloat vals[5];
- struct vg_paint *paint = handle_to_paint(object);
- vals[0] = values[0];
- vals[1] = values[1];
- vals[2] = values[2];
- vals[3] = values[3];
- vals[4] = values[4];
- paint_set_radial_gradient(paint, vals);
- paint_set_radial_gradienti(paint, values);
- }
- }
- break;
- case VG_PATH_DATATYPE:
- case VG_PATH_FORMAT:
- case VG_PATH_SCALE:
- case VG_PATH_BIAS:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
- /* read only don't produce an error */
- break;
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-}
-
-VGint vegaGetParameterVectorSize(VGHandle object,
- VGint paramType)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (object == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return 0;
- }
-
- switch(paramType) {
- case VG_PAINT_TYPE:
- case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
- case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
- case VG_PAINT_PATTERN_TILING_MODE:
- return 1;
- case VG_PAINT_COLOR:
- return 4;
- case VG_PAINT_COLOR_RAMP_STOPS: {
- struct vg_paint *p = handle_to_paint(object);
- return paint_num_ramp_stops(p);
- }
- break;
- case VG_PAINT_LINEAR_GRADIENT:
- return 4;
- case VG_PAINT_RADIAL_GRADIENT:
- return 5;
-
-
- case VG_PATH_FORMAT:
- case VG_PATH_DATATYPE:
- case VG_PATH_SCALE:
- case VG_PATH_BIAS:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
- return 1;
-
- case VG_IMAGE_FORMAT:
- case VG_IMAGE_WIDTH:
- case VG_IMAGE_HEIGHT:
- return 1;
-
-#ifdef OPENVG_VERSION_1_1
- case VG_FONT_NUM_GLYPHS:
- return 1;
-#endif
-
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- }
- return 0;
-}
-
-
-VGfloat vegaGetParameterf(VGHandle object,
- VGint paramType)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (object == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return 0;
- }
-
- switch(paramType) {
- case VG_PAINT_TYPE:
- case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
- case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
- case VG_PAINT_PATTERN_TILING_MODE:
- return vegaGetParameteri(object, paramType);
- break;
- case VG_PAINT_COLOR:
- case VG_PAINT_COLOR_RAMP_STOPS:
- case VG_PAINT_LINEAR_GRADIENT:
- case VG_PAINT_RADIAL_GRADIENT:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
-
- case VG_PATH_FORMAT:
- return VG_PATH_FORMAT_STANDARD;
- case VG_PATH_SCALE: {
- struct path *p = handle_to_path(object);
- return path_scale(p);
- }
- case VG_PATH_BIAS: {
- struct path *p = handle_to_path(object);
- return path_bias(p);
- }
- case VG_PATH_DATATYPE:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
- return vegaGetParameteri(object, paramType);
- break;
-
- case VG_IMAGE_FORMAT:
- case VG_IMAGE_WIDTH:
- case VG_IMAGE_HEIGHT:
-#ifdef OPENVG_VERSION_1_1
- case VG_FONT_NUM_GLYPHS:
- return vegaGetParameteri(object, paramType);
- break;
-#endif
-
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- }
- return 0;
-}
-
-VGint vegaGetParameteri(VGHandle object,
- VGint paramType)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (object == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return 0;
- }
-
- switch(paramType) {
- case VG_PAINT_TYPE: {
- struct vg_paint *paint = handle_to_paint(object);
- return paint_type(paint);
- }
- break;
- case VG_PAINT_COLOR_RAMP_SPREAD_MODE: {
- struct vg_paint *p = handle_to_paint(object);
- return paint_spread_mode(p);
- }
- case VG_PAINT_COLOR_RAMP_PREMULTIPLIED: {
- struct vg_paint *p = handle_to_paint(object);
- return paint_color_ramp_premultiplied(p);
- }
- break;
- case VG_PAINT_PATTERN_TILING_MODE: {
- struct vg_paint *p = handle_to_paint(object);
- return paint_pattern_tiling(p);
- }
- break;
- case VG_PAINT_COLOR:
- case VG_PAINT_COLOR_RAMP_STOPS:
- case VG_PAINT_LINEAR_GRADIENT:
- case VG_PAINT_RADIAL_GRADIENT:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
-
- case VG_PATH_FORMAT:
- return VG_PATH_FORMAT_STANDARD;
- case VG_PATH_SCALE:
- case VG_PATH_BIAS:
- return vegaGetParameterf(object, paramType);
- case VG_PATH_DATATYPE: {
- struct path *p = handle_to_path(object);
- return path_datatype(p);
- }
- case VG_PATH_NUM_SEGMENTS: {
- struct path *p = handle_to_path(object);
- return path_num_segments(p);
- }
- case VG_PATH_NUM_COORDS: {
- struct path *p = handle_to_path(object);
- return path_num_coords(p);
- }
- break;
-
- case VG_IMAGE_FORMAT: {
- struct vg_image *img = handle_to_image(object);
- return img->format;
- }
- break;
- case VG_IMAGE_WIDTH: {
- struct vg_image *img = handle_to_image(object);
- return img->width;
- }
- break;
- case VG_IMAGE_HEIGHT: {
- struct vg_image *img = handle_to_image(object);
- return img->height;
- }
- break;
-
-#ifdef OPENVG_VERSION_1_1
- case VG_FONT_NUM_GLYPHS: {
- struct vg_font *font = handle_to_font(object);
- return font_num_glyphs(font);
- }
- break;
-#endif
-
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- }
- return 0;
-}
-
-void vegaGetParameterfv(VGHandle object,
- VGint paramType,
- VGint count,
- VGfloat * values)
-{
- struct vg_context *ctx = vg_current_context();
- VGint real_count = vegaGetParameterVectorSize(object, paramType);
-
- if (object == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!values || count <= 0 || count > real_count ||
- !is_aligned(values)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- switch(paramType) {
- case VG_PAINT_TYPE: {
- struct vg_paint *p = handle_to_paint(object);
- values[0] = paint_type(p);
- }
- break;
- case VG_PAINT_COLOR_RAMP_SPREAD_MODE: {
- struct vg_paint *p = handle_to_paint(object);
- values[0] = paint_spread_mode(p);
- }
- break;
- case VG_PAINT_COLOR_RAMP_PREMULTIPLIED: {
- struct vg_paint *p = handle_to_paint(object);
- values[0] = paint_color_ramp_premultiplied(p);
- }
- break;
- case VG_PAINT_PATTERN_TILING_MODE: {
- values[0] = vegaGetParameterf(object, paramType);
- }
- break;
- case VG_PAINT_COLOR: {
- struct vg_paint *paint = handle_to_paint(object);
- paint_get_color(paint, values);
- }
- break;
- case VG_PAINT_COLOR_RAMP_STOPS: {
- struct vg_paint *paint = handle_to_paint(object);
- paint_ramp_stops(paint, values, count);
- }
- break;
- case VG_PAINT_LINEAR_GRADIENT: {
- struct vg_paint *paint = handle_to_paint(object);
- paint_linear_gradient(paint, values);
- }
- break;
- case VG_PAINT_RADIAL_GRADIENT: {
- struct vg_paint *paint = handle_to_paint(object);
- paint_radial_gradient(paint, values);
- }
- break;
-
- case VG_PATH_FORMAT:
- case VG_PATH_DATATYPE:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
- values[0] = vegaGetParameteri(object, paramType);
- break;
- case VG_PATH_SCALE:
- case VG_PATH_BIAS:
- values[0] = vegaGetParameterf(object, paramType);
- break;
-
- case VG_IMAGE_FORMAT:
- case VG_IMAGE_WIDTH:
- case VG_IMAGE_HEIGHT:
-#ifdef OPENVG_VERSION_1_1
- case VG_FONT_NUM_GLYPHS:
- values[0] = vegaGetParameteri(object, paramType);
- break;
-#endif
-
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- }
-}
-
-void vegaGetParameteriv(VGHandle object,
- VGint paramType,
- VGint count,
- VGint * values)
-{
- struct vg_context *ctx = vg_current_context();
- VGint real_count = vegaGetParameterVectorSize(object, paramType);
-
- if (object || object == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!values || count <= 0 || count > real_count ||
- !is_aligned(values)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- switch(paramType) {
- case VG_PAINT_TYPE:
- case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
- case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
- case VG_PAINT_PATTERN_TILING_MODE:
-#ifdef OPENVG_VERSION_1_1
- case VG_FONT_NUM_GLYPHS:
- values[0] = vegaGetParameteri(object, paramType);
- break;
-#endif
- case VG_PAINT_COLOR: {
- struct vg_paint *paint = handle_to_paint(object);
- paint_get_coloriv(paint, values);
- }
- break;
- case VG_PAINT_COLOR_RAMP_STOPS: {
- struct vg_paint *paint = handle_to_paint(object);
- paint_ramp_stopsi(paint, values, count);
- }
- break;
- case VG_PAINT_LINEAR_GRADIENT: {
- struct vg_paint *paint = handle_to_paint(object);
- paint_linear_gradienti(paint, values);
- }
- break;
- case VG_PAINT_RADIAL_GRADIENT: {
- struct vg_paint *paint = handle_to_paint(object);
- paint_radial_gradienti(paint, values);
- }
- break;
-
- case VG_PATH_SCALE:
- case VG_PATH_BIAS:
- values[0] = vegaGetParameterf(object, paramType);
- break;
- case VG_PATH_FORMAT:
- case VG_PATH_DATATYPE:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
- values[0] = vegaGetParameteri(object, paramType);
- break;
-
- case VG_IMAGE_FORMAT:
- case VG_IMAGE_WIDTH:
- case VG_IMAGE_HEIGHT:
- values[0] = vegaGetParameteri(object, paramType);
- break;
-
- default:
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- break;
- }
-}
diff --git a/src/gallium/state_trackers/vega/api_path.c b/src/gallium/state_trackers/vega/api_path.c
deleted file mode 100644
index ab6ce958945..00000000000
--- a/src/gallium/state_trackers/vega/api_path.c
+++ /dev/null
@@ -1,487 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "vg_context.h"
-#include "handle.h"
-#include "path.h"
-#include "api.h"
-
-#include "pipe/p_context.h"
-
-VGPath vegaCreatePath(VGint pathFormat,
- VGPathDatatype datatype,
- VGfloat scale, VGfloat bias,
- VGint segmentCapacityHint,
- VGint coordCapacityHint,
- VGbitfield capabilities)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (pathFormat != VG_PATH_FORMAT_STANDARD) {
- vg_set_error(ctx, VG_UNSUPPORTED_PATH_FORMAT_ERROR);
- return VG_INVALID_HANDLE;
- }
- if (datatype < VG_PATH_DATATYPE_S_8 ||
- datatype > VG_PATH_DATATYPE_F) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
- if (!scale) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
-
- return path_to_handle(path_create(datatype, scale, bias,
- segmentCapacityHint, coordCapacityHint,
- capabilities));
-}
-
-void vegaClearPath(VGPath path, VGbitfield capabilities)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *p = 0;
-
- if (path == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- p = handle_to_path(path);
- path_clear(p, capabilities);
-}
-
-void vegaDestroyPath(VGPath p)
-{
- struct path *path = 0;
- struct vg_context *ctx = vg_current_context();
-
- if (p == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- path = handle_to_path(p);
- path_destroy(path);
-}
-
-void vegaRemovePathCapabilities(VGPath path,
- VGbitfield capabilities)
-{
- struct vg_context *ctx = vg_current_context();
- VGbitfield current;
- struct path *p;
-
- if (path == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- p = handle_to_path(path);
- current = path_capabilities(p);
- path_set_capabilities(p, (current &
- (~(capabilities & VG_PATH_CAPABILITY_ALL))));
-}
-
-VGbitfield vegaGetPathCapabilities(VGPath path)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *p = 0;
-
- if (path == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return 0;
- }
- p = handle_to_path(path);
- return path_capabilities(p);
-}
-
-void vegaAppendPath(VGPath dstPath, VGPath srcPath)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *src, *dst;
-
- if (dstPath == VG_INVALID_HANDLE || srcPath == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- src = handle_to_path(srcPath);
- dst = handle_to_path(dstPath);
-
- if (!(path_capabilities(src) & VG_PATH_CAPABILITY_APPEND_FROM) ||
- !(path_capabilities(dst) & VG_PATH_CAPABILITY_APPEND_TO)) {
- vg_set_error(ctx, VG_PATH_CAPABILITY_ERROR);
- return;
- }
- path_append_path(dst, src);
-}
-
-void vegaAppendPathData(VGPath dstPath,
- VGint numSegments,
- const VGubyte * pathSegments,
- const void * pathData)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *p = 0;
- VGint i;
-
- if (dstPath == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!pathSegments) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (numSegments <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- for (i = 0; i < numSegments; ++i) {
- if (pathSegments[i] > VG_LCWARC_TO_REL) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- }
-
- p = handle_to_path(dstPath);
-
- if (!p || !is_aligned_to(p, path_datatype_size(p))) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (!(path_capabilities(p)&VG_PATH_CAPABILITY_APPEND_TO)) {
- vg_set_error(ctx, VG_PATH_CAPABILITY_ERROR);
- return;
- }
-
- path_append_data(p, numSegments, pathSegments, pathData);
-}
-
-void vegaModifyPathCoords(VGPath dstPath,
- VGint startIndex,
- VGint numSegments,
- const void * pathData)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *p = 0;
-
- if (dstPath == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (startIndex < 0 || numSegments <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- p = handle_to_path(dstPath);
-
- if (!pathData || !is_aligned_to(pathData, path_datatype_size(p))) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (startIndex + numSegments > path_num_segments(p)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (!(path_capabilities(p)&VG_PATH_CAPABILITY_MODIFY)) {
- vg_set_error(ctx, VG_PATH_CAPABILITY_ERROR);
- return;
- }
- path_modify_coords(p, startIndex, numSegments, pathData);
-}
-
-void vegaTransformPath(VGPath dstPath, VGPath srcPath)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *src = 0, *dst = 0;
-
- if (dstPath == VG_INVALID_HANDLE || srcPath == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- src = handle_to_path(srcPath);
- dst = handle_to_path(dstPath);
-
- if (!(path_capabilities(src) & VG_PATH_CAPABILITY_TRANSFORM_FROM) ||
- !(path_capabilities(dst) & VG_PATH_CAPABILITY_TRANSFORM_TO)) {
- vg_set_error(ctx, VG_PATH_CAPABILITY_ERROR);
- return;
- }
- path_transform(dst, src);
-}
-
-VGboolean vegaInterpolatePath(VGPath dstPath,
- VGPath startPath,
- VGPath endPath,
- VGfloat amount)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *start = 0, *dst = 0, *end = 0;
-
- if (dstPath == VG_INVALID_HANDLE ||
- startPath == VG_INVALID_HANDLE ||
- endPath == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return VG_FALSE;
- }
- dst = handle_to_path(dstPath);
- start = handle_to_path(startPath);
- end = handle_to_path(endPath);
-
- if (!(path_capabilities(dst) & VG_PATH_CAPABILITY_INTERPOLATE_TO) ||
- !(path_capabilities(start) & VG_PATH_CAPABILITY_INTERPOLATE_FROM) ||
- !(path_capabilities(end) & VG_PATH_CAPABILITY_INTERPOLATE_FROM)) {
- vg_set_error(ctx, VG_PATH_CAPABILITY_ERROR);
- return VG_FALSE;
- }
-
- return path_interpolate(dst,
- start, end, amount);
-}
-
-VGfloat vegaPathLength(VGPath path,
- VGint startSegment,
- VGint numSegments)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *p = 0;
-
- if (path == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return -1;
- }
- if (startSegment < 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return -1;
- }
- if (numSegments <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return -1;
- }
- p = handle_to_path(path);
-
- if (!(path_capabilities(p) & VG_PATH_CAPABILITY_PATH_LENGTH)) {
- vg_set_error(ctx, VG_PATH_CAPABILITY_ERROR);
- return -1;
- }
- if (startSegment + numSegments > path_num_segments(p)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return -1;
- }
-
- return path_length(p, startSegment, numSegments);
-}
-
-void vegaPointAlongPath(VGPath path,
- VGint startSegment,
- VGint numSegments,
- VGfloat distance,
- VGfloat * x, VGfloat * y,
- VGfloat * tangentX,
- VGfloat * tangentY)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *p = 0;
- VGbitfield caps;
-
- if (path == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (startSegment < 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (numSegments <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (!is_aligned(x) || !is_aligned(y) ||
- !is_aligned(tangentX) || !is_aligned(tangentY)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- p = handle_to_path(path);
-
- caps = path_capabilities(p);
- if (!(caps & VG_PATH_CAPABILITY_POINT_ALONG_PATH) ||
- !(caps & VG_PATH_CAPABILITY_TANGENT_ALONG_PATH)) {
- vg_set_error(ctx, VG_PATH_CAPABILITY_ERROR);
- return;
- }
-
- if (startSegment + numSegments > path_num_segments(p)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- {
- VGfloat point[2], normal[2];
- path_point(p, startSegment, numSegments, distance,
- point, normal);
- if (x)
- *x = point[0];
- if (y)
- *y = point[1];
- if (tangentX)
- *tangentX = -normal[1];
- if (tangentY)
- *tangentY = normal[0];
- }
-}
-
-void vegaPathBounds(VGPath path,
- VGfloat * minX,
- VGfloat * minY,
- VGfloat * width,
- VGfloat * height)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *p = 0;
- VGbitfield caps;
-
- if (path == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!minX || !minY || !width || !height) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (!is_aligned(minX) || !is_aligned(minY) ||
- !is_aligned(width) || !is_aligned(height)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- p = handle_to_path(path);
-
- caps = path_capabilities(p);
- if (!(caps & VG_PATH_CAPABILITY_PATH_BOUNDS)) {
- vg_set_error(ctx, VG_PATH_CAPABILITY_ERROR);
- return;
- }
-
- path_bounding_rect(p, minX, minY, width, height);
-}
-
-void vegaPathTransformedBounds(VGPath path,
- VGfloat * minX,
- VGfloat * minY,
- VGfloat * width,
- VGfloat * height)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *p = 0;
- VGbitfield caps;
-
- if (path == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!minX || !minY || !width || !height) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (!is_aligned(minX) || !is_aligned(minY) ||
- !is_aligned(width) || !is_aligned(height)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- p = handle_to_path(path);
-
- caps = path_capabilities(p);
- if (!(caps & VG_PATH_CAPABILITY_PATH_TRANSFORMED_BOUNDS)) {
- vg_set_error(ctx, VG_PATH_CAPABILITY_ERROR);
- return;
- }
-
-#if 0
- /* faster, but seems to have precision problems... */
- path_bounding_rect(p, minX, minY, width, height);
- if (*width > 0 && *height > 0) {
- VGfloat pts[] = {*minX, *minY,
- *minX + *width, *minY,
- *minX + *width, *minY + *height,
- *minX, *minY + *height};
- struct matrix *matrix = &ctx->state.vg.path_user_to_surface_matrix;
- VGfloat maxX, maxY;
- matrix_map_point(matrix, pts[0], pts[1], pts + 0, pts + 1);
- matrix_map_point(matrix, pts[2], pts[3], pts + 2, pts + 3);
- matrix_map_point(matrix, pts[4], pts[5], pts + 4, pts + 5);
- matrix_map_point(matrix, pts[6], pts[7], pts + 6, pts + 7);
- *minX = MIN2(pts[0], MIN2(pts[2], MIN2(pts[4], pts[6])));
- *minY = MIN2(pts[1], MIN2(pts[3], MIN2(pts[5], pts[7])));
- maxX = MAX2(pts[0], MAX2(pts[2], MAX2(pts[4], pts[6])));
- maxY = MAX2(pts[1], MAX2(pts[3], MAX2(pts[5], pts[7])));
- *width = maxX - *minX;
- *height = maxY - *minY;
- }
-#else
- {
- struct path *dst = path_create(VG_PATH_DATATYPE_F, 1.0, 0,
- 0, 0, VG_PATH_CAPABILITY_ALL);
- path_transform(dst, p);
- path_bounding_rect(dst, minX, minY, width, height);
- path_destroy(dst);
- }
-#endif
-}
-
-
-void vegaDrawPath(VGPath path, VGbitfield paintModes)
-{
- struct vg_context *ctx = vg_current_context();
- struct path *p = handle_to_path(path);
-
- if (path == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- if (!(paintModes & (VG_STROKE_PATH | VG_FILL_PATH))) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (path_is_empty(p))
- return;
- path_render(p, paintModes,
- &ctx->state.vg.path_user_to_surface_matrix);
-}
-
diff --git a/src/gallium/state_trackers/vega/api_text.c b/src/gallium/state_trackers/vega/api_text.c
deleted file mode 100644
index 824c7630403..00000000000
--- a/src/gallium/state_trackers/vega/api_text.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "vg_context.h"
-#include "text.h"
-#include "api.h"
-#include "handle.h"
-
-#include "util/u_memory.h"
-
-#ifdef OPENVG_VERSION_1_1
-
-VGFont vegaCreateFont(VGint glyphCapacityHint)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (glyphCapacityHint < 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return VG_INVALID_HANDLE;
- }
-
- return font_to_handle(font_create(glyphCapacityHint));
-}
-
-void vegaDestroyFont(VGFont f)
-{
- struct vg_font *font = handle_to_font(f);
- struct vg_context *ctx = vg_current_context();
-
- if (f == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!vg_object_is_valid(f, VG_OBJECT_FONT)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- font_destroy(font);
-}
-
-void vegaSetGlyphToPath(VGFont font,
- VGuint glyphIndex,
- VGPath path,
- VGboolean isHinted,
- const VGfloat glyphOrigin[2],
- const VGfloat escapement[2])
-{
- struct vg_context *ctx = vg_current_context();
- struct path *pathObj;
- struct vg_font *f;
-
- if (font == VG_INVALID_HANDLE ||
- !vg_context_is_object_valid(ctx, VG_OBJECT_FONT, font)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!glyphOrigin || !escapement ||
- !is_aligned(glyphOrigin) || !is_aligned(escapement)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (path != VG_INVALID_HANDLE &&
- !vg_context_is_object_valid(ctx, VG_OBJECT_PATH, path)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- pathObj = handle_to_path(path);
- f = handle_to_font(font);
-
- font_set_glyph_to_path(f, glyphIndex, pathObj,
- isHinted, glyphOrigin, escapement);
-}
-
-void vegaSetGlyphToImage(VGFont font,
- VGuint glyphIndex,
- VGImage image,
- const VGfloat glyphOrigin[2],
- const VGfloat escapement[2])
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *img_obj;
- struct vg_font *f;
-
- if (font == VG_INVALID_HANDLE ||
- !vg_context_is_object_valid(ctx, VG_OBJECT_FONT, font)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (!glyphOrigin || !escapement ||
- !is_aligned(glyphOrigin) || !is_aligned(escapement)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (image != VG_INVALID_HANDLE &&
- !vg_context_is_object_valid(ctx, VG_OBJECT_IMAGE, image)) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- img_obj = handle_to_image(image);
- f = handle_to_font(font);
-
- font_set_glyph_to_image(f, glyphIndex, img_obj, glyphOrigin, escapement);
-}
-
-void vegaClearGlyph(VGFont font,
- VGuint glyphIndex)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_font *f;
-
- if (font == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
-
- f = handle_to_font(font);
-
- font_clear_glyph(f, glyphIndex);
-}
-
-void vegaDrawGlyph(VGFont font,
- VGuint glyphIndex,
- VGbitfield paintModes,
- VGboolean allowAutoHinting)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_font *f;
-
- if (font == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (paintModes & (~(VG_STROKE_PATH|VG_FILL_PATH))) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- f = handle_to_font(font);
-
- font_draw_glyph(f, glyphIndex, paintModes, allowAutoHinting);
-}
-
-void vegaDrawGlyphs(VGFont font,
- VGint glyphCount,
- const VGuint *glyphIndices,
- const VGfloat *adjustments_x,
- const VGfloat *adjustments_y,
- VGbitfield paintModes,
- VGboolean allowAutoHinting)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_font *f;
-
- if (font == VG_INVALID_HANDLE) {
- vg_set_error(ctx, VG_BAD_HANDLE_ERROR);
- return;
- }
- if (glyphCount <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (!glyphIndices || !is_aligned(glyphIndices)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if ((adjustments_x && !is_aligned(adjustments_x)) ||
- (adjustments_y && !is_aligned(adjustments_y))) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- if (paintModes & (~(VG_STROKE_PATH|VG_FILL_PATH))) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- f = handle_to_font(font);
-
- font_draw_glyphs(f, glyphCount, glyphIndices,
- adjustments_x, adjustments_y, paintModes, allowAutoHinting);
-}
-
-#endif /* OPENVG_VERSION_1_1 */
diff --git a/src/gallium/state_trackers/vega/api_transform.c b/src/gallium/state_trackers/vega/api_transform.c
deleted file mode 100644
index 0a40fc69b95..00000000000
--- a/src/gallium/state_trackers/vega/api_transform.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-
-#include "vg_context.h"
-
-#include "matrix.h"
-#include "api.h"
-
-void vegaLoadIdentity(void)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix *mat = vg_state_matrix(&ctx->state.vg);
- matrix_load_identity(mat);
-}
-
-void vegaLoadMatrix(const VGfloat * m)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix *mat;
-
- if (!ctx)
- return;
-
- if (!m || !is_aligned(m)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- mat = vg_state_matrix(&ctx->state.vg);
- matrix_init(mat, m);
- if (!matrix_is_affine(mat)) {
- if (ctx->state.vg.matrix_mode != VG_MATRIX_IMAGE_USER_TO_SURFACE) {
- matrix_make_affine(mat);
- }
- }
-}
-
-void vegaGetMatrix(VGfloat * m)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix *mat;
-
- if (!ctx)
- return;
-
- if (!m || !is_aligned(m)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- mat = vg_state_matrix(&ctx->state.vg);
- memcpy(m, mat->m, sizeof(VGfloat)*9);
-}
-
-void vegaMultMatrix(const VGfloat * m)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix *dst, src;
-
- if (!ctx)
- return;
-
- if (!m || !is_aligned(m)) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- matrix_init(&src, m);
- dst = vg_state_matrix(&ctx->state.vg);
- if (!matrix_is_affine(&src)) {
- if (ctx->state.vg.matrix_mode != VG_MATRIX_IMAGE_USER_TO_SURFACE) {
- matrix_make_affine(&src);
- }
- }
- matrix_mult(dst, &src);
-
-}
-
-void vegaTranslate(VGfloat tx, VGfloat ty)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix *dst = vg_state_matrix(&ctx->state.vg);
- matrix_translate(dst, tx, ty);
-}
-
-void vegaScale(VGfloat sx, VGfloat sy)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix *dst = vg_state_matrix(&ctx->state.vg);
- matrix_scale(dst, sx, sy);
-}
-
-void vegaShear(VGfloat shx, VGfloat shy)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix *dst = vg_state_matrix(&ctx->state.vg);
- matrix_shear(dst, shx, shy);
-}
-
-void vegaRotate(VGfloat angle)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix *dst = vg_state_matrix(&ctx->state.vg);
- matrix_rotate(dst, angle);
-}
diff --git a/src/gallium/state_trackers/vega/arc.c b/src/gallium/state_trackers/vega/arc.c
deleted file mode 100644
index 65a985fbbbf..00000000000
--- a/src/gallium/state_trackers/vega/arc.c
+++ /dev/null
@@ -1,709 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "arc.h"
-
-#include "matrix.h"
-#include "bezier.h"
-#include "polygon.h"
-#include "stroker.h"
-#include "path.h"
-
-#include "util/u_debug.h"
-#include "util/u_math.h"
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-#define DEBUG_ARCS 0
-
-static const VGfloat two_pi = M_PI * 2;
-
-
-static const double coeffs3Low[2][4][4] = {
- {
- { 3.85268, -21.229, -0.330434, 0.0127842 },
- { -1.61486, 0.706564, 0.225945, 0.263682 },
- { -0.910164, 0.388383, 0.00551445, 0.00671814 },
- { -0.630184, 0.192402, 0.0098871, 0.0102527 }
- },
- {
- { -0.162211, 9.94329, 0.13723, 0.0124084 },
- { -0.253135, 0.00187735, 0.0230286, 0.01264 },
- { -0.0695069, -0.0437594, 0.0120636, 0.0163087 },
- { -0.0328856, -0.00926032, -0.00173573, 0.00527385 }
- }
-};
-
-/* coefficients for error estimation
- while using cubic Bézier curves for approximation
- 1/4 <= b/a <= 1 */
-static const double coeffs3High[2][4][4] = {
- {
- { 0.0899116, -19.2349, -4.11711, 0.183362 },
- { 0.138148, -1.45804, 1.32044, 1.38474 },
- { 0.230903, -0.450262, 0.219963, 0.414038 },
- { 0.0590565, -0.101062, 0.0430592, 0.0204699 }
- },
- {
- { 0.0164649, 9.89394, 0.0919496, 0.00760802 },
- { 0.0191603, -0.0322058, 0.0134667, -0.0825018 },
- { 0.0156192, -0.017535, 0.00326508, -0.228157 },
- { -0.0236752, 0.0405821, -0.0173086, 0.176187 }
- }
-};
-
-/* safety factor to convert the "best" error approximation
- into a "max bound" error */
-static const double safety3[] = {
- 0.001, 4.98, 0.207, 0.0067
-};
-
-/* The code below is from the OpenVG 1.1 Spec
- * Section 18.4 */
-
-/* Given: Points (x0, y0) and (x1, y1)
- * Return: TRUE if a solution exists, FALSE otherwise
- * Circle centers are written to (cx0, cy0) and (cx1, cy1)
- */
-static VGboolean
-find_unit_circles(double x0, double y0, double x1, double y1,
- double *cx0, double *cy0,
- double *cx1, double *cy1)
-{
- /* Compute differences and averages */
- double dx = x0 - x1;
- double dy = y0 - y1;
- double xm = (x0 + x1)/2;
- double ym = (y0 + y1)/2;
- double dsq, disc, s, sdx, sdy;
-
- /* Solve for intersecting unit circles */
- dsq = dx*dx + dy*dy;
- if (dsq == 0.0) return VG_FALSE; /* Points are coincident */
- disc = 1.0/dsq - 1.0/4.0;
-
- /* the precision we care about here is around float so if we're
- * around the float defined zero then make it official to avoid
- * precision problems later on */
- if (floatIsZero(disc))
- disc = 0.0;
-
- if (disc < 0.0) return VG_FALSE; /* Points are too far apart */
- s = sqrt(disc);
- sdx = s*dx;
- sdy = s*dy;
- *cx0 = xm + sdy;
- *cy0 = ym - sdx;
- *cx1 = xm - sdy;
- *cy1 = ym + sdx;
- return VG_TRUE;
-}
-
-
-/* Given: Ellipse parameters rh, rv, rot (in degrees),
- * endpoints (x0, y0) and (x1, y1)
- * Return: TRUE if a solution exists, FALSE otherwise
- * Ellipse centers are written to (cx0, cy0) and (cx1, cy1)
- */
-static VGboolean
-find_ellipses(double rh, double rv, double rot,
- double x0, double y0, double x1, double y1,
- double *cx0, double *cy0, double *cx1, double *cy1)
-{
- double COS, SIN, x0p, y0p, x1p, y1p, pcx0, pcy0, pcx1, pcy1;
- /* Convert rotation angle from degrees to radians */
- rot *= M_PI/180.0;
- /* Pre-compute rotation matrix entries */
- COS = cos(rot); SIN = sin(rot);
- /* Transform (x0, y0) and (x1, y1) into unit space */
- /* using (inverse) rotate, followed by (inverse) scale */
- x0p = (x0*COS + y0*SIN)/rh;
- y0p = (-x0*SIN + y0*COS)/rv;
- x1p = (x1*COS + y1*SIN)/rh;
- y1p = (-x1*SIN + y1*COS)/rv;
- if (!find_unit_circles(x0p, y0p, x1p, y1p,
- &pcx0, &pcy0, &pcx1, &pcy1)) {
- return VG_FALSE;
- }
- /* Transform back to original coordinate space */
- /* using (forward) scale followed by (forward) rotate */
- pcx0 *= rh; pcy0 *= rv;
- pcx1 *= rh; pcy1 *= rv;
- *cx0 = pcx0*COS - pcy0*SIN;
- *cy0 = pcx0*SIN + pcy0*COS;
- *cx1 = pcx1*COS - pcy1*SIN;
- *cy1 = pcx1*SIN + pcy1*COS;
- return VG_TRUE;
-}
-
-static INLINE VGboolean
-try_to_fix_radii(struct arc *arc)
-{
- double COS, SIN, rot, x0p, y0p, x1p, y1p;
- double dx, dy, dsq, scale;
-
- /* Convert rotation angle from degrees to radians */
- rot = DEGREES_TO_RADIANS(arc->theta);
-
- /* Pre-compute rotation matrix entries */
- COS = cos(rot); SIN = sin(rot);
-
- /* Transform (x0, y0) and (x1, y1) into unit space */
- /* using (inverse) rotate, followed by (inverse) scale */
- x0p = (arc->x1*COS + arc->y1*SIN)/arc->a;
- y0p = (-arc->x1*SIN + arc->y1*COS)/arc->b;
- x1p = (arc->x2*COS + arc->y2*SIN)/arc->a;
- y1p = (-arc->x2*SIN + arc->y2*COS)/arc->b;
- /* Compute differences and averages */
- dx = x0p - x1p;
- dy = y0p - y1p;
-
- dsq = dx*dx + dy*dy;
-#if 0
- if (dsq <= 0.001) {
- debug_printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaa\n");
- }
-#endif
- scale = 1/(2/sqrt(dsq));
- arc->a *= scale;
- arc->b *= scale;
- return VG_TRUE;
-}
-
-static INLINE double vector_normalize(double *v)
-{
- double sq = v[0] * v[0] + v[1] * v[1];
- return sqrt(sq);
-}
-static INLINE double vector_orientation(double *v)
-{
- double norm = vector_normalize(v);
- double cosa = v[0] / norm;
- double sina = v[1] / norm;
- return (sina>=0 ? acos(cosa) : 2*M_PI - acos(cosa));
-}
-static INLINE double vector_dot(double *v0,
- double *v1)
-{
- return v0[0] * v1[0] + v0[1] * v1[1];
-}
-
-static INLINE double vector_angles(double *v0,
- double *v1)
-{
- double dot = vector_dot(v0, v1);
- double norm0 = vector_normalize(v0);
- double norm1 = vector_normalize(v1);
-
- return acos(dot / (norm0 * norm1));
-}
-
-static VGboolean find_angles(struct arc *arc)
-{
- double vec0[2], vec1[2];
- double lambda1, lambda2;
- double angle;
- struct matrix matrix;
-
- if (floatIsZero(arc->a) || floatIsZero(arc->b)) {
- return VG_FALSE;
- }
- /* map the points to an identity circle */
- matrix_load_identity(&matrix);
- matrix_scale(&matrix, 1.f, arc->a/arc->b);
- matrix_rotate(&matrix, -arc->theta);
- matrix_map_point(&matrix,
- arc->x1, arc->y1,
- &arc->x1, &arc->y1);
- matrix_map_point(&matrix,
- arc->x2, arc->y2,
- &arc->x2, &arc->y2);
- matrix_map_point(&matrix,
- arc->cx, arc->cy,
- &arc->cx, &arc->cy);
-
-#if DEBUG_ARCS
- debug_printf("Matrix 3 [%f, %f, %f| %f, %f, %f| %f, %f, %f]\n",
- matrix.m[0], matrix.m[1], matrix.m[2],
- matrix.m[3], matrix.m[4], matrix.m[5],
- matrix.m[6], matrix.m[7], matrix.m[8]);
- debug_printf("Endpoints [%f, %f], [%f, %f]\n",
- arc->x1, arc->y1, arc->x2, arc->y2);
-#endif
-
- vec0[0] = arc->x1 - arc->cx;
- vec0[1] = arc->y1 - arc->cy;
- vec1[0] = arc->x2 - arc->cx;
- vec1[1] = arc->y2 - arc->cy;
-
-#if DEBUG_ARCS
- debug_printf("Vec is [%f, %f], [%f, %f], [%f, %f]\n",
- vec0[0], vec0[1], vec1[0], vec1[1], arc->cx, arc->cy);
-#endif
-
- lambda1 = vector_orientation(vec0);
-
- if (isnan(lambda1))
- lambda1 = 0.f;
-
- if (arc->type == VG_SCWARC_TO ||
- arc->type == VG_SCCWARC_TO)
- angle = vector_angles(vec0, vec1);
- else if (arc->type == VG_LCWARC_TO ||
- arc->type == VG_LCCWARC_TO) {
- angle = 2*M_PI - vector_angles(vec0, vec1);
- } else
- abort();
-
- if (isnan(angle))
- angle = M_PI;
-
-
- if (arc->type == VG_SCWARC_TO ||
- arc->type == VG_LCWARC_TO)
- lambda2 = lambda1 - angle;
- else
- lambda2 = lambda1 + angle;
-
-#if DEBUG_ARCS
- debug_printf("Angle is %f and (%f, %f)\n", angle, lambda1, lambda2);
-#endif
-
-#if 0
- arc->eta1 = atan2(sin(lambda1) / arc->b,
- cos(lambda1) / arc->a);
- arc->eta2 = atan2(sin(lambda2) / arc->b,
- cos(lambda2) / arc->a);
-
- /* make sure we have eta1 <= eta2 <= eta1 + 2 PI */
- arc->eta2 -= two_pi * floor((arc->eta2 - arc->eta1) / two_pi);
-
- /* the preceding correction fails if we have exactly et2 - eta1 = 2 PI
- it reduces the interval to zero length */
- if ((lambda2 - lambda1 > M_PI) && (arc->eta2 - arc->eta1 < M_PI)) {
- arc->eta2 += 2 * M_PI;
- }
-#else
- arc->eta1 = lambda1;
- arc->eta2 = lambda2;
-#endif
-
- return VG_TRUE;
-}
-
-#if DEBUG_ARCS
-static void check_endpoints(struct arc *arc)
-{
- double x1, y1, x2, y2;
-
- double a_cos_eta1 = arc->a * cos(arc->eta1);
- double b_sin_eta1 = arc->b * sin(arc->eta1);
- x1 = arc->cx + a_cos_eta1 * arc->cos_theta -
- b_sin_eta1 * arc->sin_theta;
- y1 = arc->cy + a_cos_eta1 * arc->sin_theta +
- b_sin_eta1 * arc->cos_theta;
-
- double a_cos_eta2 = arc->a * cos(arc->eta2);
- double b_sin_eta2 = arc->b * sin(arc->eta2);
- x2 = arc->cx + a_cos_eta2 * arc->cos_theta -
- b_sin_eta2 * arc->sin_theta;
- y2 = arc->cy + a_cos_eta2 * arc->sin_theta +
- b_sin_eta2 * arc->cos_theta;
-
- debug_printf("Computed (%f, %f), (%f, %f)\n",
- x1, y1, x2, y2);
- debug_printf("Real (%f, %f), (%f, %f)\n",
- arc->x1, arc->y1,
- arc->x2, arc->y2);
-}
-#endif
-
-void arc_init(struct arc *arc,
- VGPathSegment type,
- VGfloat x1, VGfloat y1,
- VGfloat x2, VGfloat y2,
- VGfloat rh, VGfloat rv,
- VGfloat rot)
-{
- assert(type == VG_SCCWARC_TO ||
- type == VG_SCWARC_TO ||
- type == VG_LCCWARC_TO ||
- type == VG_LCWARC_TO);
- arc->type = type;
- arc->x1 = x1;
- arc->y1 = y1;
- arc->x2 = x2;
- arc->y2 = y2;
- arc->a = rh;
- arc->b = rv;
- arc->theta = rot;
- arc->cos_theta = cos(arc->theta);
- arc->sin_theta = sin(arc->theta);
- {
- double cx0, cy0, cx1, cy1;
- double cx, cy;
- arc->is_valid = find_ellipses(rh, rv, rot, x1, y1, x2, y2,
- &cx0, &cy0, &cx1, &cy1);
-
- if (!arc->is_valid && try_to_fix_radii(arc)) {
- rh = arc->a;
- rv = arc->b;
- arc->is_valid =
- find_ellipses(rh, rv, rot, x1, y1, x2, y2,
- &cx0, &cy0, &cx1, &cy1);
- }
-
- if (type == VG_SCWARC_TO ||
- type == VG_LCCWARC_TO) {
- cx = cx1;
- cy = cy1;
- } else {
- cx = cx0;
- cy = cy0;
- }
-#if DEBUG_ARCS
- debug_printf("Centers are : (%f, %f) , (%f, %f). Real (%f, %f)\n",
- cx0, cy0, cx1, cy1, cx, cy);
-#endif
- arc->cx = cx;
- arc->cy = cy;
- if (arc->is_valid) {
- arc->is_valid = find_angles(arc);
-#if DEBUG_ARCS
- check_endpoints(arc);
-#endif
- /* remap a few points. find_angles requires
- * rot in angles, the rest of the code
- * will need them in radians. and find_angles
- * modifies the center to match an identity
- * circle so lets reset it */
- arc->theta = DEGREES_TO_RADIANS(rot);
- arc->cos_theta = cos(arc->theta);
- arc->sin_theta = sin(arc->theta);
- arc->cx = cx;
- arc->cy = cy;
- }
- }
-}
-
-static INLINE double rational_function(double x, const double *c)
-{
- return (x * (x * c[0] + c[1]) + c[2]) / (x + c[3]);
-}
-
-static double estimate_error(struct arc *arc,
- double etaA, double etaB)
-{
- double eta = 0.5 * (etaA + etaB);
-
- double x = arc->b / arc->a;
- double dEta = etaB - etaA;
- double cos2 = cos(2 * eta);
- double cos4 = cos(4 * eta);
- double cos6 = cos(6 * eta);
- double c0, c1;
-
- /* select the right coeficients set according to degree and b/a */
- const double (*coeffs)[4][4];
- const double *safety;
- coeffs = (x < 0.25) ? coeffs3Low : coeffs3High;
- safety = safety3;
-
- c0 = rational_function(x, coeffs[0][0])
- + cos2 * rational_function(x, coeffs[0][1])
- + cos4 * rational_function(x, coeffs[0][2])
- + cos6 * rational_function(x, coeffs[0][3]);
-
- c1 = rational_function(x, coeffs[1][0])
- + cos2 * rational_function(x, coeffs[1][1])
- + cos4 * rational_function(x, coeffs[1][2])
- + cos6 * rational_function(x, coeffs[1][3]);
-
- return rational_function(x, safety) * arc->a * exp(c0 + c1 * dEta);
-}
-
-struct arc_cb {
- void (*move)(struct arc_cb *cb, VGfloat x, VGfloat y);
- void (*point)(struct arc_cb *cb, VGfloat x, VGfloat y);
- void (*bezier)(struct arc_cb *cb, struct bezier *bezier);
-
- void *user_data;
-};
-
-static void cb_null_move(struct arc_cb *cb, VGfloat x, VGfloat y)
-{
-}
-
-static void polygon_point(struct arc_cb *cb, VGfloat x, VGfloat y)
-{
- struct polygon *poly = (struct polygon*)cb->user_data;
- polygon_vertex_append(poly, x, y);
-}
-
-static void polygon_bezier(struct arc_cb *cb, struct bezier *bezier)
-{
- struct polygon *poly = (struct polygon*)cb->user_data;
- bezier_add_to_polygon(bezier, poly);
-}
-
-static void stroke_point(struct arc_cb *cb, VGfloat x, VGfloat y)
-{
- struct stroker *stroker = (struct stroker*)cb->user_data;
- stroker_line_to(stroker, x, y);
-}
-
-static void stroke_curve(struct arc_cb *cb, struct bezier *bezier)
-{
- struct stroker *stroker = (struct stroker*)cb->user_data;
- stroker_curve_to(stroker,
- bezier->x2, bezier->y2,
- bezier->x3, bezier->y3,
- bezier->x4, bezier->y4);
-}
-
-static void stroke_emit_point(struct arc_cb *cb, VGfloat x, VGfloat y)
-{
- struct stroker *stroker = (struct stroker*)cb->user_data;
- stroker_emit_line_to(stroker, x, y);
-}
-
-static void stroke_emit_curve(struct arc_cb *cb, struct bezier *bezier)
-{
- struct stroker *stroker = (struct stroker*)cb->user_data;
- stroker_emit_curve_to(stroker,
- bezier->x2, bezier->y2,
- bezier->x3, bezier->y3,
- bezier->x4, bezier->y4);
-}
-
-static void arc_path_move(struct arc_cb *cb, VGfloat x, VGfloat y)
-{
- struct path *path = (struct path*)cb->user_data;
- path_move_to(path, x, y);
-}
-
-static void arc_path_point(struct arc_cb *cb, VGfloat x, VGfloat y)
-{
- struct path *path = (struct path*)cb->user_data;
- path_line_to(path, x, y);
-}
-
-static void arc_path_bezier(struct arc_cb *cb, struct bezier *bezier)
-{
- struct path *path = (struct path*)cb->user_data;
- path_cubic_to(path,
- bezier->x2, bezier->y2,
- bezier->x3, bezier->y3,
- bezier->x4, bezier->y4);
-}
-
-static INLINE int num_beziers_needed(struct arc *arc)
-{
- double threshold = 0.05;
- VGboolean found = VG_FALSE;
- int n = 1;
- double min_eta, max_eta;
-
- min_eta = MIN2(arc->eta1, arc->eta2);
- max_eta = MAX2(arc->eta1, arc->eta2);
-
- while ((! found) && (n < 1024)) {
- double d_eta = (max_eta - min_eta) / n;
- if (d_eta <= 0.5 * M_PI) {
- double eta_b = min_eta;
- int i;
- found = VG_TRUE;
- for (i = 0; found && (i < n); ++i) {
- double etaA = eta_b;
- eta_b += d_eta;
- found = (estimate_error(arc, etaA, eta_b) <= threshold);
- }
- }
- n = n << 1;
- }
-
- return n;
-}
-
-static void arc_to_beziers(struct arc *arc,
- struct arc_cb cb,
- struct matrix *matrix)
-{
- int i;
- int n = 1;
- double d_eta, eta_b, cos_eta_b,
- sin_eta_b, a_cos_eta_b, b_sin_eta_b, a_sin_eta_b,
- b_cos_eta_b, x_b, y_b, x_b_dot, y_b_dot, lx, ly;
- double t, alpha;
-
- { /* always move to the start of the arc */
- VGfloat x = arc->x1;
- VGfloat y = arc->y1;
- matrix_map_point(matrix, x, y, &x, &y);
- cb.move(&cb, x, y);
- }
-
- if (!arc->is_valid) {
- VGfloat x = arc->x2;
- VGfloat y = arc->y2;
- matrix_map_point(matrix, x, y, &x, &y);
- cb.point(&cb, x, y);
- return;
- }
-
- /* find the number of Bézier curves needed */
- n = num_beziers_needed(arc);
-
- d_eta = (arc->eta2 - arc->eta1) / n;
- eta_b = arc->eta1;
-
- cos_eta_b = cos(eta_b);
- sin_eta_b = sin(eta_b);
- a_cos_eta_b = arc->a * cos_eta_b;
- b_sin_eta_b = arc->b * sin_eta_b;
- a_sin_eta_b = arc->a * sin_eta_b;
- b_cos_eta_b = arc->b * cos_eta_b;
- x_b = arc->cx + a_cos_eta_b * arc->cos_theta -
- b_sin_eta_b * arc->sin_theta;
- y_b = arc->cy + a_cos_eta_b * arc->sin_theta +
- b_sin_eta_b * arc->cos_theta;
- x_b_dot = -a_sin_eta_b * arc->cos_theta -
- b_cos_eta_b * arc->sin_theta;
- y_b_dot = -a_sin_eta_b * arc->sin_theta +
- b_cos_eta_b * arc->cos_theta;
-
- {
- VGfloat x = x_b, y = y_b;
- matrix_map_point(matrix, x, y, &x, &y);
- cb.point(&cb, x, y);
- }
- lx = x_b;
- ly = y_b;
-
- t = tan(0.5 * d_eta);
- alpha = sin(d_eta) * (sqrt(4 + 3 * t * t) - 1) / 3;
-
- for (i = 0; i < n; ++i) {
- struct bezier bezier;
- double xA = x_b;
- double yA = y_b;
- double xADot = x_b_dot;
- double yADot = y_b_dot;
-
- eta_b += d_eta;
- cos_eta_b = cos(eta_b);
- sin_eta_b = sin(eta_b);
- a_cos_eta_b = arc->a * cos_eta_b;
- b_sin_eta_b = arc->b * sin_eta_b;
- a_sin_eta_b = arc->a * sin_eta_b;
- b_cos_eta_b = arc->b * cos_eta_b;
- x_b = arc->cx + a_cos_eta_b * arc->cos_theta -
- b_sin_eta_b * arc->sin_theta;
- y_b = arc->cy + a_cos_eta_b * arc->sin_theta +
- b_sin_eta_b * arc->cos_theta;
- x_b_dot = -a_sin_eta_b * arc->cos_theta -
- b_cos_eta_b * arc->sin_theta;
- y_b_dot = -a_sin_eta_b * arc->sin_theta +
- b_cos_eta_b * arc->cos_theta;
-
- bezier_init(&bezier,
- lx, ly,
- (float) (xA + alpha * xADot), (float) (yA + alpha * yADot),
- (float) (x_b - alpha * x_b_dot), (float) (y_b - alpha * y_b_dot),
- (float) x_b, (float) y_b);
-#if 0
- debug_printf("%d) Bezier (%f, %f), (%f, %f), (%f, %f), (%f, %f)\n",
- i,
- bezier.x1, bezier.y1,
- bezier.x2, bezier.y2,
- bezier.x3, bezier.y3,
- bezier.x4, bezier.y4);
-#endif
- bezier_transform(&bezier, matrix);
- cb.bezier(&cb, &bezier);
- lx = x_b;
- ly = y_b;
- }
-}
-
-
-void arc_add_to_polygon(struct arc *arc,
- struct polygon *poly,
- struct matrix *matrix)
-{
- struct arc_cb cb;
-
- cb.move = cb_null_move;
- cb.point = polygon_point;
- cb.bezier = polygon_bezier;
- cb.user_data = poly;
-
- arc_to_beziers(arc, cb, matrix);
-}
-
-void arc_stroke_cb(struct arc *arc,
- struct stroker *stroke,
- struct matrix *matrix)
-{
- struct arc_cb cb;
-
- cb.move = cb_null_move;
- cb.point = stroke_point;
- cb.bezier = stroke_curve;
- cb.user_data = stroke;
-
- arc_to_beziers(arc, cb, matrix);
-}
-
-void arc_stroker_emit(struct arc *arc,
- struct stroker *stroker,
- struct matrix *matrix)
-{
- struct arc_cb cb;
-
- cb.move = cb_null_move;
- cb.point = stroke_emit_point;
- cb.bezier = stroke_emit_curve;
- cb.user_data = stroker;
-
- arc_to_beziers(arc, cb, matrix);
-}
-
-void arc_to_path(struct arc *arc,
- struct path *path,
- struct matrix *matrix)
-{
- struct arc_cb cb;
-
- cb.move = arc_path_move;
- cb.point = arc_path_point;
- cb.bezier = arc_path_bezier;
- cb.user_data = path;
-
- arc_to_beziers(arc, cb, matrix);
-}
diff --git a/src/gallium/state_trackers/vega/arc.h b/src/gallium/state_trackers/vega/arc.h
deleted file mode 100644
index 3205cd5021d..00000000000
--- a/src/gallium/state_trackers/vega/arc.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef ARC_H
-#define ARC_H
-
-#include "VG/openvg.h"
-
-struct polygon;
-struct matrix;
-struct stroker;
-struct path;
-
-struct arc {
- VGPathSegment type;
-
- VGfloat cx, cy;
-
- VGfloat a, b;
-
- VGfloat theta;
- VGfloat cos_theta, sin_theta;
-
- VGfloat eta1;
- VGfloat eta2;
-
- VGfloat x1, y1, x2, y2;
-
- VGboolean is_valid;
-};
-
-void arc_init(struct arc *arc,
- VGPathSegment type,
- VGfloat x1, VGfloat y1,
- VGfloat x2, VGfloat y2,
- VGfloat rh, VGfloat rv,
- VGfloat rot);
-
-void arc_add_to_polygon(struct arc *arc,
- struct polygon *poly,
- struct matrix *matrix);
-
-
-void arc_to_path(struct arc *arc,
- struct path *p,
- struct matrix *matrix);
-
-void arc_stroke_cb(struct arc *arc,
- struct stroker *stroke,
- struct matrix *matrix);
-
-void arc_stroker_emit(struct arc *arc,
- struct stroker *stroke,
- struct matrix *matrix);
-
-
-#endif
diff --git a/src/gallium/state_trackers/vega/asm_fill.h b/src/gallium/state_trackers/vega/asm_fill.h
deleted file mode 100644
index 77e6a14fe99..00000000000
--- a/src/gallium/state_trackers/vega/asm_fill.h
+++ /dev/null
@@ -1,693 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef ASM_FILL_H
-#define ASM_FILL_H
-
-#include "tgsi/tgsi_ureg.h"
-
-typedef void (* ureg_func)( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant);
-
-static INLINE void
-solid_fill( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- ureg_MOV(ureg, *out, constant[2]);
-}
-
-/**
- * Perform frag-coord-to-paint-coord transform. The transformation is in
- * CONST[4..6].
- */
-#define PAINT_TRANSFORM \
- ureg_MOV(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_XY), in[0]); \
- ureg_MOV(ureg, \
- ureg_writemask(temp[0], TGSI_WRITEMASK_Z), \
- ureg_scalar(constant[3], TGSI_SWIZZLE_Y)); \
- ureg_DP3(ureg, temp[1], constant[4], ureg_src(temp[0])); \
- ureg_DP3(ureg, temp[2], constant[5], ureg_src(temp[0])); \
- ureg_DP3(ureg, temp[3], constant[6], ureg_src(temp[0])); \
- ureg_RCP(ureg, temp[3], ureg_src(temp[3])); \
- ureg_MUL(ureg, temp[1], ureg_src(temp[1]), ureg_src(temp[3])); \
- ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[3])); \
- ureg_MOV(ureg, \
- ureg_writemask(temp[4], TGSI_WRITEMASK_X), \
- ureg_src(temp[1])); \
- ureg_MOV(ureg, \
- ureg_writemask(temp[4], TGSI_WRITEMASK_Y), \
- ureg_src(temp[2]));
-
-static INLINE void
-linear_grad( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- PAINT_TRANSFORM
-
- /* grad = DP2((x, y), CONST[2].xy) * CONST[2].z */
- ureg_MUL(ureg, temp[0],
- ureg_scalar(constant[2], TGSI_SWIZZLE_Y),
- ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_Y));
- ureg_MAD(ureg, temp[1],
- ureg_scalar(constant[2], TGSI_SWIZZLE_X),
- ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_X),
- ureg_src(temp[0]));
- ureg_MUL(ureg, temp[2], ureg_src(temp[1]),
- ureg_scalar(constant[2], TGSI_SWIZZLE_Z));
-
- ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[2]), sampler[0]);
-}
-
-static INLINE void
-radial_grad( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- PAINT_TRANSFORM
-
- /*
- * Calculate (sqrt(B^2 + AC) - B) / A, where
- *
- * A is CONST[2].z,
- * B is DP2((x, y), CONST[2].xy), and
- * C is DP2((x, y), (x, y)).
- */
-
- /* B and C */
- ureg_DP2(ureg, temp[0], ureg_src(temp[4]), constant[2]);
- ureg_DP2(ureg, temp[1], ureg_src(temp[4]), ureg_src(temp[4]));
-
- /* the square root */
- ureg_MUL(ureg, temp[2], ureg_src(temp[0]), ureg_src(temp[0]));
- ureg_MAD(ureg, temp[3], ureg_src(temp[1]),
- ureg_scalar(constant[2], TGSI_SWIZZLE_Z), ureg_src(temp[2]));
- ureg_RSQ(ureg, temp[3], ureg_src(temp[3]));
- ureg_RCP(ureg, temp[3], ureg_src(temp[3]));
-
- ureg_SUB(ureg, temp[3], ureg_src(temp[3]), ureg_src(temp[0]));
- ureg_RCP(ureg, temp[0], ureg_scalar(constant[2], TGSI_SWIZZLE_Z));
- ureg_MUL(ureg, temp[0], ureg_src(temp[0]), ureg_src(temp[3]));
-
- ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[0]), sampler[0]);
-}
-
-
-static INLINE void
-pattern( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- PAINT_TRANSFORM
-
- /* (s, t) = (x / tex_width, y / tex_height) */
- ureg_RCP(ureg, temp[0],
- ureg_swizzle(constant[3],
- TGSI_SWIZZLE_Z,
- TGSI_SWIZZLE_W,
- TGSI_SWIZZLE_Z,
- TGSI_SWIZZLE_W));
- ureg_MOV(ureg, temp[1], ureg_src(temp[4]));
- ureg_MUL(ureg,
- ureg_writemask(temp[1], TGSI_WRITEMASK_X),
- ureg_src(temp[1]),
- ureg_src(temp[0]));
- ureg_MUL(ureg,
- ureg_writemask(temp[1], TGSI_WRITEMASK_Y),
- ureg_src(temp[1]),
- ureg_src(temp[0]));
-
- ureg_TEX(ureg, *out, TGSI_TEXTURE_2D, ureg_src(temp[1]), sampler[0]);
-}
-
-static INLINE void
-paint_degenerate( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- /* CONST[3].y is 1.0f */
- ureg_MOV(ureg, temp[1], ureg_scalar(constant[3], TGSI_SWIZZLE_Y));
- ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[1]), sampler[0]);
-}
-
-static INLINE void
-image_normal( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- /* store and pass image color in TEMP[1] */
- ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]);
- ureg_MOV(ureg, *out, ureg_src(temp[1]));
-}
-
-
-static INLINE void
-image_multiply( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- /* store and pass image color in TEMP[1] */
- ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]);
- ureg_MUL(ureg, *out, ureg_src(temp[0]), ureg_src(temp[1]));
-}
-
-
-static INLINE void
-image_stencil( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- /* store and pass image color in TEMP[1] */
- ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]);
- ureg_MOV(ureg, *out, ureg_src(temp[0]));
-}
-
-static INLINE void
-color_transform( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- /* note that TEMP[1] may already be used for image color */
-
- ureg_MAD(ureg, temp[2], ureg_src(temp[0]), constant[0], constant[1]);
- /* clamp to [0.0f, 1.0f] */
- ureg_CLAMP(ureg, temp[2],
- ureg_src(temp[2]),
- ureg_scalar(constant[3], TGSI_SWIZZLE_X),
- ureg_scalar(constant[3], TGSI_SWIZZLE_Y));
- ureg_MOV(ureg, *out, ureg_src(temp[2]));
-}
-
-static INLINE void
-alpha_normal( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- /* save per-channel alpha in TEMP[1] */
- ureg_MOV(ureg, temp[1], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
-
- ureg_MOV(ureg, *out, ureg_src(temp[0]));
-}
-
-static INLINE void
-alpha_per_channel( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- /* save per-channel alpha in TEMP[1] */
- ureg_MUL(ureg,
- ureg_writemask(temp[1], TGSI_WRITEMASK_W),
- ureg_src(temp[0]),
- ureg_src(temp[1]));
- ureg_MUL(ureg,
- ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
- ureg_src(temp[1]),
- ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
-
- /* update alpha */
- ureg_MOV(ureg,
- ureg_writemask(temp[0], TGSI_WRITEMASK_W),
- ureg_src(temp[1]));
- ureg_MOV(ureg, *out, ureg_src(temp[0]));
-}
-
-/**
- * Premultiply src and dst.
- */
-static INLINE void
-blend_premultiply( struct ureg_program *ureg,
- struct ureg_src src,
- struct ureg_src src_channel_alpha,
- struct ureg_src dst)
-{
- /* premultiply src */
- ureg_MUL(ureg,
- ureg_writemask(ureg_dst(src), TGSI_WRITEMASK_XYZ),
- src,
- src_channel_alpha);
- /* premultiply dst */
- ureg_MUL(ureg,
- ureg_writemask(ureg_dst(dst), TGSI_WRITEMASK_XYZ),
- dst,
- ureg_scalar(dst, TGSI_SWIZZLE_W));
-}
-
-/**
- * Unpremultiply src.
- */
-static INLINE void
-blend_unpremultiply( struct ureg_program *ureg,
- struct ureg_src src,
- struct ureg_src one,
- struct ureg_dst temp[1])
-{
- /* replace 0.0f by 1.0f before calculating reciprocal */
- ureg_CMP(ureg,
- temp[0],
- ureg_negate(ureg_scalar(src, TGSI_SWIZZLE_W)),
- ureg_scalar(src, TGSI_SWIZZLE_W),
- one);
- ureg_RCP(ureg, temp[0], ureg_src(temp[0]));
-
- ureg_MUL(ureg,
- ureg_writemask(ureg_dst(src), TGSI_WRITEMASK_XYZ),
- src,
- ureg_src(temp[0]));
-}
-
-/**
- * Emit instructions for the specified blend mode. Colors will be
- * unpremultiplied. Two temporary registers are required.
- *
- * The output is written back to src.
- */
-static INLINE void
-blend_generic(struct ureg_program *ureg,
- VGBlendMode mode,
- struct ureg_src src,
- struct ureg_src src_channel_alpha,
- struct ureg_src dst,
- struct ureg_src one,
- struct ureg_dst temp[2])
-{
- struct ureg_dst out;
-
- blend_premultiply(ureg, src, src_channel_alpha, dst);
-
- /* blend in-place */
- out = ureg_dst(src);
-
- switch (mode) {
- case VG_BLEND_SRC:
- ureg_MOV(ureg, out, src);
- break;
- case VG_BLEND_SRC_OVER:
- /* RGBA_out = RGBA_src + (1 - A_src) * RGBA_dst */
- ureg_SUB(ureg, temp[0], one, src_channel_alpha);
- ureg_MAD(ureg, out, ureg_src(temp[0]), dst, src);
- break;
- case VG_BLEND_DST_OVER:
- /* RGBA_out = RGBA_dst + (1 - A_dst) * RGBA_src */
- ureg_SUB(ureg, temp[0], one, ureg_scalar(dst, TGSI_SWIZZLE_W));
- ureg_MAD(ureg, out, ureg_src(temp[0]), src, dst);
- break;
- case VG_BLEND_SRC_IN:
- ureg_MUL(ureg, out, src, ureg_scalar(dst, TGSI_SWIZZLE_W));
- break;
- case VG_BLEND_DST_IN:
- ureg_MUL(ureg, out, dst, src_channel_alpha);
- break;
- case VG_BLEND_MULTIPLY:
- /*
- * RGB_out = (1 - A_dst) * RGB_src + (1 - A_src) * RGB_dst +
- * RGB_src * RGB_dst
- */
- ureg_MAD(ureg, temp[0],
- ureg_scalar(dst, TGSI_SWIZZLE_W), ureg_negate(src), src);
- ureg_MAD(ureg, temp[1],
- src_channel_alpha, ureg_negate(dst), dst);
- ureg_MAD(ureg, temp[0], src, dst, ureg_src(temp[0]));
- ureg_ADD(ureg, out, ureg_src(temp[0]), ureg_src(temp[1]));
- /* alpha is src over */
- ureg_ADD(ureg, ureg_writemask(out, TGSI_WRITEMASK_W),
- src, ureg_src(temp[1]));
- break;
- case VG_BLEND_SCREEN:
- /* RGBA_out = RGBA_src + (1 - RGBA_src) * RGBA_dst */
- ureg_SUB(ureg, temp[0], one, src);
- ureg_MAD(ureg, out, ureg_src(temp[0]), dst, src);
- break;
- case VG_BLEND_DARKEN:
- case VG_BLEND_LIGHTEN:
- /* src over */
- ureg_SUB(ureg, temp[0], one, src_channel_alpha);
- ureg_MAD(ureg, temp[0], ureg_src(temp[0]), dst, src);
- /* dst over */
- ureg_SUB(ureg, temp[1], one, ureg_scalar(dst, TGSI_SWIZZLE_W));
- ureg_MAD(ureg, temp[1], ureg_src(temp[1]), src, dst);
- /* take min/max for colors */
- if (mode == VG_BLEND_DARKEN) {
- ureg_MIN(ureg, ureg_writemask(out, TGSI_WRITEMASK_XYZ),
- ureg_src(temp[0]), ureg_src(temp[1]));
- }
- else {
- ureg_MAX(ureg, ureg_writemask(out, TGSI_WRITEMASK_XYZ),
- ureg_src(temp[0]), ureg_src(temp[1]));
- }
- break;
- case VG_BLEND_ADDITIVE:
- /* RGBA_out = RGBA_src + RGBA_dst */
- ureg_ADD(ureg, temp[0], src, dst);
- ureg_MIN(ureg, out, ureg_src(temp[0]), one);
- break;
- default:
- assert(0);
- break;
- }
-
- blend_unpremultiply(ureg, src, one, temp);
-}
-
-#define BLEND_GENERIC(mode) \
- do { \
- ureg_TEX(ureg, temp[2], TGSI_TEXTURE_2D, in[0], sampler[2]); \
- blend_generic(ureg, (mode), ureg_src(temp[0]), ureg_src(temp[1]), \
- ureg_src(temp[2]), \
- ureg_scalar(constant[3], TGSI_SWIZZLE_Y), temp + 3); \
- ureg_MOV(ureg, *out, ureg_src(temp[0])); \
- } while (0)
-
-static INLINE void
-blend_src( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_SRC);
-}
-
-static INLINE void
-blend_src_over( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_SRC_OVER);
-}
-
-static INLINE void
-blend_dst_over( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_DST_OVER);
-}
-
-static INLINE void
-blend_src_in( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_SRC_IN);
-}
-
-static INLINE void
-blend_dst_in( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_DST_IN);
-}
-
-static INLINE void
-blend_multiply( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_MULTIPLY);
-}
-
-static INLINE void
-blend_screen( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_SCREEN);
-}
-
-static INLINE void
-blend_darken( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_DARKEN);
-}
-
-static INLINE void
-blend_lighten( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_LIGHTEN);
-}
-
-static INLINE void
-blend_additive( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- BLEND_GENERIC(VG_BLEND_ADDITIVE);
-}
-
-static INLINE void
-mask( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[1]);
- ureg_MUL(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_W),
- ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
- ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
- ureg_MOV(ureg, *out, ureg_src(temp[0]));
-}
-
-static INLINE void
-premultiply( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- ureg_MUL(ureg,
- ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ),
- ureg_src(temp[0]),
- ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
-}
-
-static INLINE void
-unpremultiply( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- ureg_TEX(ureg, temp[0], TGSI_TEXTURE_2D, in[0], sampler[1]);
-}
-
-
-static INLINE void
-color_bw( struct ureg_program *ureg,
- struct ureg_dst *out,
- struct ureg_src *in,
- struct ureg_src *sampler,
- struct ureg_dst *temp,
- struct ureg_src *constant)
-{
- ureg_ADD(ureg, temp[1],
- ureg_scalar(constant[3], TGSI_SWIZZLE_Y),
- ureg_scalar(constant[3], TGSI_SWIZZLE_Y));
- ureg_RCP(ureg, temp[2], ureg_src(temp[1]));
- ureg_ADD(ureg, temp[1],
- ureg_scalar(constant[3], TGSI_SWIZZLE_Y),
- ureg_src(temp[2]));
- ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X),
- ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X),
- ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Y));
- ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X),
- ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Z),
- ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X));
- ureg_SGE(ureg,
- ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ),
- ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_X),
- ureg_src(temp[1]));
- ureg_SGE(ureg,
- ureg_writemask(temp[0], TGSI_WRITEMASK_W),
- ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
- ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_Y));
- ureg_MOV(ureg, *out, ureg_src(temp[0]));
-}
-
-
-struct shader_asm_info {
- VGint id;
- ureg_func func;
-
- VGboolean needs_position;
-
- VGint start_const;
- VGint num_consts;
-
- VGint start_sampler;
- VGint num_samplers;
-
- VGint start_temp;
- VGint num_temps;
-};
-
-
-/* paint types */
-static const struct shader_asm_info shaders_paint_asm[] = {
- {VEGA_SOLID_FILL_SHADER, solid_fill,
- VG_FALSE, 2, 1, 0, 0, 0, 0},
- {VEGA_LINEAR_GRADIENT_SHADER, linear_grad,
- VG_TRUE, 2, 5, 0, 1, 0, 5},
- {VEGA_RADIAL_GRADIENT_SHADER, radial_grad,
- VG_TRUE, 2, 5, 0, 1, 0, 5},
- {VEGA_PATTERN_SHADER, pattern,
- VG_TRUE, 3, 4, 0, 1, 0, 5},
- {VEGA_PAINT_DEGENERATE_SHADER, paint_degenerate,
- VG_FALSE, 3, 1, 0, 1, 0, 2}
-};
-
-/* image draw modes */
-static const struct shader_asm_info shaders_image_asm[] = {
- {VEGA_IMAGE_NORMAL_SHADER, image_normal,
- VG_TRUE, 0, 0, 3, 1, 0, 2},
- {VEGA_IMAGE_MULTIPLY_SHADER, image_multiply,
- VG_TRUE, 0, 0, 3, 1, 0, 2},
- {VEGA_IMAGE_STENCIL_SHADER, image_stencil,
- VG_TRUE, 0, 0, 3, 1, 0, 2}
-};
-
-static const struct shader_asm_info shaders_color_transform_asm[] = {
- {VEGA_COLOR_TRANSFORM_SHADER, color_transform,
- VG_FALSE, 0, 4, 0, 0, 0, 3}
-};
-
-static const struct shader_asm_info shaders_alpha_asm[] = {
- {VEGA_ALPHA_NORMAL_SHADER, alpha_normal,
- VG_FALSE, 0, 0, 0, 0, 0, 2},
- {VEGA_ALPHA_PER_CHANNEL_SHADER, alpha_per_channel,
- VG_FALSE, 0, 0, 0, 0, 0, 2}
-};
-
-/* extra blend modes */
-static const struct shader_asm_info shaders_blend_asm[] = {
-#define BLEND_ASM_INFO(id, func) { (id), (func), VG_TRUE, 3, 1, 2, 1, 0, 5 }
- BLEND_ASM_INFO(VEGA_BLEND_SRC_SHADER, blend_src),
- BLEND_ASM_INFO(VEGA_BLEND_SRC_OVER_SHADER, blend_src_over),
- BLEND_ASM_INFO(VEGA_BLEND_DST_OVER_SHADER, blend_dst_over),
- BLEND_ASM_INFO(VEGA_BLEND_SRC_IN_SHADER, blend_src_in),
- BLEND_ASM_INFO(VEGA_BLEND_DST_IN_SHADER, blend_dst_in),
- BLEND_ASM_INFO(VEGA_BLEND_MULTIPLY_SHADER, blend_multiply),
- BLEND_ASM_INFO(VEGA_BLEND_SCREEN_SHADER, blend_screen),
- BLEND_ASM_INFO(VEGA_BLEND_DARKEN_SHADER, blend_darken),
- BLEND_ASM_INFO(VEGA_BLEND_LIGHTEN_SHADER, blend_lighten),
- BLEND_ASM_INFO(VEGA_BLEND_ADDITIVE_SHADER, blend_additive)
-#undef BLEND_ASM_INFO
-};
-
-static const struct shader_asm_info shaders_mask_asm[] = {
- {VEGA_MASK_SHADER, mask,
- VG_TRUE, 0, 0, 1, 1, 0, 2}
-};
-
-/* premultiply */
-static const struct shader_asm_info shaders_premultiply_asm[] = {
- {VEGA_PREMULTIPLY_SHADER, premultiply,
- VG_FALSE, 0, 0, 0, 0, 0, 1},
- {VEGA_UNPREMULTIPLY_SHADER, unpremultiply,
- VG_FALSE, 0, 0, 0, 0, 0, 1},
-};
-
-/* color transform to black and white */
-static const struct shader_asm_info shaders_bw_asm[] = {
- {VEGA_BW_SHADER, color_bw,
- VG_FALSE, 3, 1, 0, 0, 0, 3},
-};
-
-#endif
diff --git a/src/gallium/state_trackers/vega/asm_filters.h b/src/gallium/state_trackers/vega/asm_filters.h
deleted file mode 100644
index 60bed197e28..00000000000
--- a/src/gallium/state_trackers/vega/asm_filters.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef ASM_FILTERS_H
-#define ASM_FILTERS_H
-
-static const char color_matrix_asm[] =
- "FRAG\n"
- "DCL IN[0], GENERIC[0], PERSPECTIVE\n"
- "DCL OUT[0], COLOR, CONSTANT\n"
- "DCL CONST[0..4], CONSTANT\n"
- "DCL TEMP[0..4], CONSTANT\n"
- "DCL SAMP[0], CONSTANT\n"
- "TEX TEMP[0], IN[0], SAMP[0], 2D\n"
- "MOV TEMP[1], TEMP[0].xxxx\n"
- "MOV TEMP[2], TEMP[0].yyyy\n"
- "MOV TEMP[3], TEMP[0].zzzz\n"
- "MOV TEMP[4], TEMP[0].wwww\n"
- "MUL TEMP[1], TEMP[1], CONST[0]\n"
- "MUL TEMP[2], TEMP[2], CONST[1]\n"
- "MUL TEMP[3], TEMP[3], CONST[2]\n"
- "MUL TEMP[4], TEMP[4], CONST[3]\n"
- "ADD TEMP[0], TEMP[1], CONST[4]\n"
- "ADD TEMP[0], TEMP[0], TEMP[2]\n"
- "ADD TEMP[0], TEMP[0], TEMP[3]\n"
- "ADD TEMP[0], TEMP[0], TEMP[4]\n"
- "MOV OUT[0], TEMP[0]\n"
- "END\n";
-
-static const char convolution_asm[] =
- "FRAG\n"
- "DCL IN[0], GENERIC[0], PERSPECTIVE\n"
- "DCL OUT[0], COLOR, CONSTANT\n"
- "DCL TEMP[0..4], CONSTANT\n"
- "DCL ADDR[0], CONSTANT\n"
- "DCL CONST[0..%d], CONSTANT\n"
- "DCL SAMP[0], CONSTANT\n"
- "0: MOV TEMP[0], CONST[0].xxxx\n"
- "1: MOV TEMP[1], CONST[0].xxxx\n"
- "2: BGNLOOP :14\n"
- "3: SGE TEMP[0].z, TEMP[0].yyyy, CONST[1].xxxx\n"
- "4: IF TEMP[0].zzzz :7\n"
- "5: BRK\n"
- "6: ENDIF\n"
- "7: ARL ADDR[0].x, TEMP[0].yyyy\n"
- "8: MOV TEMP[3], CONST[ADDR[0]+2]\n"
- "9: ADD TEMP[4].xy, IN[0], TEMP[3]\n"
- "10: TEX TEMP[2], TEMP[4], SAMP[0], 2D\n"
- "11: MOV TEMP[3], CONST[ADDR[0]+%d]\n"
- "12: MAD TEMP[1], TEMP[2], TEMP[3], TEMP[1]\n"
- "13: ADD TEMP[0].y, TEMP[0].yyyy, CONST[0].yyyy\n"
- "14: ENDLOOP :2\n"
- "15: MAD OUT[0], TEMP[1], CONST[1].yyyy, CONST[1].zzzz\n"
- "16: END\n";
-
-
-static const char lookup_asm[] =
- "FRAG\n"
- "DCL IN[0], GENERIC[0], PERSPECTIVE\n"
- "DCL OUT[0], COLOR, CONSTANT\n"
- "DCL TEMP[0..2], CONSTANT\n"
- "DCL CONST[0], CONSTANT\n"
- "DCL SAMP[0..1], CONSTANT\n"
- "TEX TEMP[0], IN[0], SAMP[0], 2D\n"
- "MOV TEMP[1], TEMP[0]\n"
- /* do red */
- "TEX TEMP[2], TEMP[1].xxxx, SAMP[1], 1D\n"
- "MOV TEMP[0].x, TEMP[2].xxxx\n"
- /* do blue */
- "TEX TEMP[2], TEMP[1].yyyy, SAMP[1], 1D\n"
- "MOV TEMP[0].y, TEMP[2].yyyy\n"
- /* do green */
- "TEX TEMP[2], TEMP[1].zzzz, SAMP[1], 1D\n"
- "MOV TEMP[0].z, TEMP[2].zzzz\n"
- /* do alpha */
- "TEX TEMP[2], TEMP[1].wwww, SAMP[1], 1D\n"
- "MOV TEMP[0].w, TEMP[2].wwww\n"
- "MOV OUT[0], TEMP[0]\n"
- "END\n";
-
-
-static const char lookup_single_asm[] =
- "FRAG\n"
- "DCL IN[0], GENERIC[0], PERSPECTIVE\n"
- "DCL OUT[0], COLOR, CONSTANT\n"
- "DCL TEMP[0..2], CONSTANT\n"
- "DCL CONST[0], CONSTANT\n"
- "DCL SAMP[0..1], CONSTANT\n"
- "TEX TEMP[0], IN[0], SAMP[0], 2D\n"
- "TEX TEMP[1], TEMP[0].%s, SAMP[1], 1D\n"
- "MOV OUT[0], TEMP[1]\n"
- "END\n";
-
-#endif
diff --git a/src/gallium/state_trackers/vega/asm_util.h b/src/gallium/state_trackers/vega/asm_util.h
deleted file mode 100644
index ae1842a62cd..00000000000
--- a/src/gallium/state_trackers/vega/asm_util.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef ASM_UTIL_H
-#define ASM_UTIL_H
-
-/* μnew = μmask */
-static const char set_mask_asm[] =
- "FRAG\n"
- "DCL IN[0], GENERIC[0], PERSPECTIVE\n"
- "DCL SAMP[0], CONSTANT\n"
- "DCL OUT[0], COLOR, CONSTANT\n"
- "0: TEX OUT[0], IN[0], SAMP[0], 2D\n"/*umask*/
- "1: END\n";
-
-/* μnew = 1 – (1 – μmask)*(1 – μprev) */
-static const char union_mask_asm[] =
- "FRAG\n"
- "DCL IN[0], GENERIC[0], PERSPECTIVE\n"
- "DCL IN[1], POSITION, LINEAR\n"
- "DCL CONST[0], CONSTANT\n"
- "DCL SAMP[0..1], CONSTANT\n"
- "DCL TEMP[0..3], CONSTANT\n"
- "DCL OUT[0], COLOR, CONSTANT\n"
- "0: TEX TEMP[1], IN[0], SAMP[0], 2D\n"/*umask*/
- "1: TEX TEMP[0], IN[1], SAMP[1], 2D\n"/*uprev*/
- "2: SUB TEMP[2], CONST[0], TEMP[0]\n"
- "3: SUB TEMP[3], CONST[0], TEMP[1]\n"
- "4: MUL TEMP[0].w, TEMP[2].wwww, TEMP[3].wwww\n"
- "5: SUB OUT[0], CONST[0], TEMP[0]\n"
- "6: END\n";
-
-/* μnew = μmask *μprev */
-static const char intersect_mask_asm[] =
- "FRAG\n"
- "DCL IN[0], GENERIC[0], PERSPECTIVE\n"
- "DCL IN[1], POSITION, LINEAR\n"
- "DCL CONST[0], CONSTANT\n"
- "DCL SAMP[0..1], CONSTANT\n"
- "DCL TEMP[0..1], CONSTANT\n"
- "DCL OUT[0], COLOR, CONSTANT\n"
- "0: TEX TEMP[0], IN[1], SAMP[1], 2D\n"/*uprev*/
- "1: TEX TEMP[1], IN[0], SAMP[0], 2D\n"/*umask*/
- "2: MUL OUT[0], TEMP[0].wwww, TEMP[1].wwww\n"
- "3: END\n";
-
-/* μnew = μprev*(1 – μmask) */
-static const char subtract_mask_asm[] =
- "FRAG\n"
- "DCL IN[0], GENERIC[0], PERSPECTIVE\n"
- "DCL IN[1], POSITION, LINEAR\n"
- "DCL CONST[0], CONSTANT\n"
- "DCL SAMP[0..1], CONSTANT\n"
- "DCL TEMP[0..2], CONSTANT\n"
- "DCL OUT[0], COLOR, CONSTANT\n"
- "0: TEX TEMP[1], IN[0], SAMP[0], 2D\n"/*umask*/
- "1: TEX TEMP[0], IN[1], SAMP[1], 2D\n"/*uprev*/
- "2: SUB TEMP[2], CONST[0], TEMP[1]\n"
- "3: MUL OUT[0], TEMP[2].wwww, TEMP[0].wwww\n"
- "4: END\n";
-
-#endif
diff --git a/src/gallium/state_trackers/vega/bezier.c b/src/gallium/state_trackers/vega/bezier.c
deleted file mode 100644
index 5769e8ea868..00000000000
--- a/src/gallium/state_trackers/vega/bezier.c
+++ /dev/null
@@ -1,706 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "bezier.h"
-
-#include "matrix.h"
-#include "polygon.h"
-
-#include "pipe/p_compiler.h"
-#include "util/u_debug.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <assert.h>
-#include <math.h>
-
-static const float flatness = 0.5;
-
-
-static INLINE void split_left(struct bezier *bez, VGfloat t, struct bezier* left)
-{
- left->x1 = bez->x1;
- left->y1 = bez->y1;
-
- left->x2 = bez->x1 + t * (bez->x2 - bez->x1);
- left->y2 = bez->y1 + t * (bez->y2 - bez->y1);
-
- left->x3 = bez->x2 + t * (bez->x3 - bez->x2);
- left->y3 = bez->y2 + t * (bez->y3 - bez->y2);
-
- bez->x3 = bez->x3 + t * (bez->x4 - bez->x3);
- bez->y3 = bez->y3 + t * (bez->y4 - bez->y3);
-
- bez->x2 = left->x3 + t * (bez->x3 - left->x3);
- bez->y2 = left->y3 + t * (bez->y3 - left->y3);
-
- left->x3 = left->x2 + t * (left->x3 - left->x2);
- left->y3 = left->y2 + t * (left->y3 - left->y2);
-
- left->x4 = bez->x1 = left->x3 + t * (bez->x2 - left->x3);
- left->y4 = bez->y1 = left->y3 + t * (bez->y2 - left->y3);
-}
-
-static INLINE void split(struct bezier *bez,
- struct bezier *first_half,
- struct bezier *second_half)
-{
- double c = (bez->x2 + bez->x3) * 0.5;
- first_half->x2 = (bez->x1 + bez->x2) * 0.5;
- second_half->x3 = (bez->x3 + bez->x4) * 0.5;
- first_half->x1 = bez->x1;
- second_half->x4 = bez->x4;
- first_half->x3 = (first_half->x2 + c) * 0.5;
- second_half->x2 = (second_half->x3 + c) * 0.5;
- first_half->x4 = second_half->x1 =
- (first_half->x3 + second_half->x2) * 0.5;
-
- c = (bez->y2 + bez->y3) / 2;
- first_half->y2 = (bez->y1 + bez->y2) * 0.5;
- second_half->y3 = (bez->y3 + bez->y4) * 0.5;
- first_half->y1 = bez->y1;
- second_half->y4 = bez->y4;
- first_half->y3 = (first_half->y2 + c) * 0.5;
- second_half->y2 = (second_half->y3 + c) * 0.5;
- first_half->y4 = second_half->y1 =
- (first_half->y3 + second_half->y2) * 0.5;
-}
-
-struct polygon * bezier_to_polygon(struct bezier *bez)
-{
- struct polygon *poly = polygon_create(64);
- polygon_vertex_append(poly, bez->x1, bez->y1);
- bezier_add_to_polygon(bez, poly);
- return poly;
-}
-
-void bezier_add_to_polygon(const struct bezier *bez,
- struct polygon *poly)
-{
- struct bezier beziers[32];
- struct bezier *b;
-
- beziers[0] = *bez;
- b = beziers;
-
- while (b >= beziers) {
- double y4y1 = b->y4 - b->y1;
- double x4x1 = b->x4 - b->x1;
- double l = ABS(x4x1) + ABS(y4y1);
- double d;
- if (l > 1.f) {
- d = ABS((x4x1)*(b->y1 - b->y2) - (y4y1)*(b->x1 - b->x2))
- + ABS((x4x1)*(b->y1 - b->y3) - (y4y1)*(b->x1 - b->x3));
- } else {
- d = ABS(b->x1 - b->x2) + ABS(b->y1 - b->y2) +
- ABS(b->x1 - b->x3) + ABS(b->y1 - b->y3);
- l = 1.;
- }
- if (d < flatness*l || b == beziers + 31) {
- /* good enough, we pop it off and add the endpoint */
- polygon_vertex_append(poly, b->x4, b->y4);
- --b;
- } else {
- /* split, second half of the bezier goes lower into the stack */
- split(b, b+1, b);
- ++b;
- }
- }
-}
-
-static void add_if_close(struct bezier *bez, VGfloat *length, VGfloat error)
-{
- struct bezier left, right; /* bez poly splits */
- VGfloat len = 0.0; /* arc length */
- VGfloat chord; /* chord length */
-
- len = len + line_length(bez->x1, bez->y1, bez->x2, bez->y2);
- len = len + line_length(bez->x2, bez->y2, bez->x3, bez->y3);
- len = len + line_length(bez->x3, bez->y3, bez->x4, bez->y4);
-
- chord = line_length(bez->x1, bez->y1, bez->x4, bez->y4);
-
- if ((len-chord) > error) {
- split(bez, &left, &right); /* split in two */
- add_if_close(&left, length, error); /* try left side */
- add_if_close(&right, length, error); /* try right side */
- return;
- }
-
- *length = *length + len;
-
- return;
-}
-
-float bezier_length(struct bezier *bez, float error)
-{
- VGfloat length = 0.f;
-
- add_if_close(bez, &length, error);
- return length;
-}
-
-void bezier_init(struct bezier *bez,
- float x1, float y1,
- float x2, float y2,
- float x3, float y3,
- float x4, float y4)
-{
- bez->x1 = x1;
- bez->y1 = y1;
- bez->x2 = x2;
- bez->y2 = y2;
- bez->x3 = x3;
- bez->y3 = y3;
- bez->x4 = x4;
- bez->y4 = y4;
-#if 0
- debug_printf("bezier in [%f, %f, %f, %f, %f, %f]\n",
- x1, y1, x2, y2, x3, y3, x4, y4);
-#endif
-}
-
-
-static INLINE void bezier_init2v(struct bezier *bez,
- float *pt1,
- float *pt2,
- float *pt3,
- float *pt4)
-{
- bez->x1 = pt1[0];
- bez->y1 = pt1[1];
-
- bez->x2 = pt2[0];
- bez->y2 = pt2[1];
-
- bez->x3 = pt3[0];
- bez->y3 = pt3[1];
-
- bez->x4 = pt4[0];
- bez->y4 = pt4[1];
-}
-
-
-void bezier_transform(struct bezier *bez,
- struct matrix *matrix)
-{
- assert(matrix_is_affine(matrix));
- matrix_map_point(matrix, bez->x1, bez->y1, &bez->x1, &bez->y1);
- matrix_map_point(matrix, bez->x2, bez->y2, &bez->x2, &bez->y2);
- matrix_map_point(matrix, bez->x3, bez->y3, &bez->x3, &bez->y3);
- matrix_map_point(matrix, bez->x4, bez->y4, &bez->x4, &bez->y4);
-}
-
-static INLINE void bezier_point_at(const struct bezier *bez, float t, float *pt)
-{
- float a, b, c, d;
- float m_t;
- m_t = 1. - t;
- b = m_t * m_t;
- c = t * t;
- d = c * t;
- a = b * m_t;
- b *= 3. * t;
- c *= 3. * m_t;
- pt[0] = a*bez->x1 + b*bez->x2 + c*bez->x3 + d*bez->x4;
- pt[1] = a*bez->y1 + b*bez->y2 + c*bez->y3 + d*bez->y4;
-}
-
-static INLINE void bezier_normal_at(const struct bezier *bez, float t, float *norm)
-{
- float m_t = 1. - t;
- float a = m_t * m_t;
- float b = t * m_t;
- float c = t * t;
-
- norm[0] = (bez->y2-bez->y1) * a + (bez->y3-bez->y2) * b + (bez->y4-bez->y3) * c;
- norm[1] = -(bez->x2-bez->x1) * a - (bez->x3-bez->x2) * b - (bez->x4-bez->x3) * c;
-}
-
-enum shift_result {
- Ok,
- Discard,
- Split,
- Circle
-};
-
-static enum shift_result good_offset(const struct bezier *b1,
- const struct bezier *b2,
- float offset, float threshold)
-{
- const float o2 = offset*offset;
- const float max_dist_line = threshold*offset*offset;
- const float max_dist_normal = threshold*offset;
- const float spacing = 0.25;
- float i;
- for (i = spacing; i < 0.99; i += spacing) {
- float p1[2],p2[2], d, l;
- float normal[2];
- bezier_point_at(b1, i, p1);
- bezier_point_at(b2, i, p2);
- d = (p1[0] - p2[0])*(p1[0] - p2[0]) + (p1[1] - p2[1])*(p1[1] - p2[1]);
- if (ABS(d - o2) > max_dist_line)
- return Split;
-
- bezier_normal_at(b1, i, normal);
- l = ABS(normal[0]) + ABS(normal[1]);
- if (l != 0.) {
- d = ABS(normal[0]*(p1[1] - p2[1]) - normal[1]*(p1[0] - p2[0]) ) / l;
- if (d > max_dist_normal)
- return Split;
- }
- }
- return Ok;
-}
-
-static INLINE void shift_line_by_normal(float *l, float offset)
-{
- float norm[4];
- float tx, ty;
-
- line_normal(l, norm);
- line_normalize(norm);
-
- tx = (norm[2] - norm[0]) * offset;
- ty = (norm[3] - norm[1]) * offset;
- l[0] += tx; l[1] += ty;
- l[2] += tx; l[3] += ty;
-}
-
-static INLINE VGboolean is_bezier_line(float (*points)[2], int count)
-{
- float dx13 = points[2][0] - points[0][0];
- float dy13 = points[2][1] - points[0][1];
-
- float dx12 = points[1][0] - points[0][0];
- float dy12 = points[1][1] - points[0][1];
-
- debug_assert(count > 2);
-
- if (count == 3) {
- return floatsEqual(dx12 * dy13, dx13 * dy12);
- } else if (count == 4) {
- float dx14 = points[3][0] - points[0][0];
- float dy14 = points[3][1] - points[0][1];
-
- return (floatsEqual(dx12 * dy13, dx13 * dy12) &&
- floatsEqual(dx12 * dy14, dx14 * dy12));
- }
-
- return VG_FALSE;
-}
-
-static INLINE void compute_pt_normal(float *pt1, float *pt2, float *res)
-{
- float line[4];
- float normal[4];
- line[0] = 0.f; line[1] = 0.f;
- line[2] = pt2[0] - pt1[0];
- line[3] = pt2[1] - pt1[1];
- line_normal(line, normal);
- line_normalize(normal);
-
- res[0] = normal[2];
- res[1] = normal[3];
-}
-
-static enum shift_result shift(const struct bezier *orig,
- struct bezier *shifted,
- float offset, float threshold)
-{
- int i;
- int map[4];
- VGboolean p1_p2_equal = (orig->x1 == orig->x2 && orig->y1 == orig->y2);
- VGboolean p2_p3_equal = (orig->x2 == orig->x3 && orig->y2 == orig->y3);
- VGboolean p3_p4_equal = (orig->x3 == orig->x4 && orig->y3 == orig->y4);
-
- float points[4][2];
- int np = 0;
- float bounds[4];
- float points_shifted[4][2];
- float prev_normal[2];
-
- points[np][0] = orig->x1;
- points[np][1] = orig->y1;
- map[0] = 0;
- ++np;
- if (!p1_p2_equal) {
- points[np][0] = orig->x2;
- points[np][1] = orig->y2;
- ++np;
- }
- map[1] = np - 1;
- if (!p2_p3_equal) {
- points[np][0] = orig->x3;
- points[np][1] = orig->y3;
- ++np;
- }
- map[2] = np - 1;
- if (!p3_p4_equal) {
- points[np][0] = orig->x4;
- points[np][1] = orig->y4;
- ++np;
- }
- map[3] = np - 1;
- if (np == 1)
- return Discard;
-
- /* We need to specialcase lines of 3 or 4 points due to numerical
- instability in intersection code below */
- if (np > 2 && is_bezier_line(points, np)) {
- float l[4] = { points[0][0], points[0][1],
- points[np-1][0], points[np-1][1] };
- float ctrl1[2], ctrl2[2];
- if (floatsEqual(points[0][0], points[np-1][0]) &&
- floatsEqual(points[0][1], points[np-1][1]))
- return Discard;
-
- shift_line_by_normal(l, offset);
- line_point_at(l, 0.33, ctrl1);
- line_point_at(l, 0.66, ctrl2);
- bezier_init(shifted, l[0], l[1],
- ctrl1[0], ctrl1[1], ctrl2[0], ctrl2[1],
- l[2], l[3]);
- return Ok;
- }
-
- bezier_bounds(orig, bounds);
- if (np == 4 && bounds[2] < .1*offset && bounds[3] < .1*offset) {
- float l = (orig->x1 - orig->x2)*(orig->x1 - orig->x2) +
- (orig->y1 - orig->y2)*(orig->y1 - orig->y1) *
- (orig->x3 - orig->x4)*(orig->x3 - orig->x4) +
- (orig->y3 - orig->y4)*(orig->y3 - orig->y4);
- float dot = (orig->x1 - orig->x2)*(orig->x3 - orig->x4) +
- (orig->y1 - orig->y2)*(orig->y3 - orig->y4);
- if (dot < 0 && dot*dot < 0.8*l)
- /* the points are close and reverse dirction. Approximate the whole
- thing by a semi circle */
- return Circle;
- }
-
- compute_pt_normal(points[0], points[1], prev_normal);
-
- points_shifted[0][0] = points[0][0] + offset * prev_normal[0];
- points_shifted[0][1] = points[0][1] + offset * prev_normal[1];
-
- for (i = 1; i < np - 1; ++i) {
- float normal_sum[2], r;
- float next_normal[2];
- compute_pt_normal(points[i], points[i + 1], next_normal);
-
- normal_sum[0] = prev_normal[0] + next_normal[0];
- normal_sum[1] = prev_normal[1] + next_normal[1];
-
- r = 1.0 + prev_normal[0] * next_normal[0]
- + prev_normal[1] * next_normal[1];
-
- if (floatsEqual(r + 1, 1)) {
- points_shifted[i][0] = points[i][0] + offset * prev_normal[0];
- points_shifted[i][1] = points[i][1] + offset * prev_normal[1];
- } else {
- float k = offset / r;
- points_shifted[i][0] = points[i][0] + k * normal_sum[0];
- points_shifted[i][1] = points[i][1] + k * normal_sum[1];
- }
-
- prev_normal[0] = next_normal[0];
- prev_normal[1] = next_normal[1];
- }
-
- points_shifted[np - 1][0] = points[np - 1][0] + offset * prev_normal[0];
- points_shifted[np - 1][1] = points[np - 1][1] + offset * prev_normal[1];
-
- bezier_init2v(shifted,
- points_shifted[map[0]], points_shifted[map[1]],
- points_shifted[map[2]], points_shifted[map[3]]);
-
- return good_offset(orig, shifted, offset, threshold);
-}
-
-static VGboolean make_circle(const struct bezier *b, float offset, struct bezier *o)
-{
- float normals[3][2];
- float dist;
- float angles[2];
- float sign = 1.f;
- int i;
- float circle[3][2];
-
- normals[0][0] = b->y2 - b->y1;
- normals[0][1] = b->x1 - b->x2;
- dist = sqrt(normals[0][0]*normals[0][0] + normals[0][1]*normals[0][1]);
- if (floatsEqual(dist + 1, 1.f))
- return VG_FALSE;
- normals[0][0] /= dist;
- normals[0][1] /= dist;
-
- normals[2][0] = b->y4 - b->y3;
- normals[2][1] = b->x3 - b->x4;
- dist = sqrt(normals[2][0]*normals[2][0] + normals[2][1]*normals[2][1]);
- if (floatsEqual(dist + 1, 1.f))
- return VG_FALSE;
- normals[2][0] /= dist;
- normals[2][1] /= dist;
-
- normals[1][0] = b->x1 - b->x2 - b->x3 + b->x4;
- normals[1][1] = b->y1 - b->y2 - b->y3 + b->y4;
- dist = -1*sqrt(normals[1][0]*normals[1][0] + normals[1][1]*normals[1][1]);
- normals[1][0] /= dist;
- normals[1][1] /= dist;
-
- for (i = 0; i < 2; ++i) {
- float cos_a = normals[i][0]*normals[i+1][0] + normals[i][1]*normals[i+1][1];
- if (cos_a > 1.)
- cos_a = 1.;
- if (cos_a < -1.)
- cos_a = -1;
- angles[i] = acos(cos_a)/M_PI;
- }
-
- if (angles[0] + angles[1] > 1.) {
- /* more than 180 degrees */
- normals[1][0] = -normals[1][0];
- normals[1][1] = -normals[1][1];
- angles[0] = 1. - angles[0];
- angles[1] = 1. - angles[1];
- sign = -1.;
- }
-
- circle[0][0] = b->x1 + normals[0][0]*offset;
- circle[0][1] = b->y1 + normals[0][1]*offset;
-
- circle[1][0] = 0.5*(b->x1 + b->x4) + normals[1][0]*offset;
- circle[1][1] = 0.5*(b->y1 + b->y4) + normals[1][1]*offset;
-
- circle[2][0] = b->x4 + normals[2][0]*offset;
- circle[2][1] = b->y4 + normals[2][1]*offset;
-
- for (i = 0; i < 2; ++i) {
- float kappa = 2.*KAPPA * sign * offset * angles[i];
-
- o->x1 = circle[i][0];
- o->y1 = circle[i][1];
- o->x2 = circle[i][0] - normals[i][1]*kappa;
- o->y2 = circle[i][1] + normals[i][0]*kappa;
- o->x3 = circle[i+1][0] + normals[i+1][1]*kappa;
- o->y3 = circle[i+1][1] - normals[i+1][0]*kappa;
- o->x4 = circle[i+1][0];
- o->y4 = circle[i+1][1];
-
- ++o;
- }
- return VG_TRUE;
-}
-
-int bezier_translate_by_normal(struct bezier *bez,
- struct bezier *curves,
- int max_curves,
- float normal_len,
- float threshold)
-{
- struct bezier beziers[10];
- struct bezier *b, *o;
-
- /* fixme: this should really be floatsEqual */
- if (bez->x1 == bez->x2 && bez->x1 == bez->x3 && bez->x1 == bez->x4 &&
- bez->y1 == bez->y2 && bez->y1 == bez->y3 && bez->y1 == bez->y4)
- return 0;
-
- --max_curves;
-redo:
- beziers[0] = *bez;
- b = beziers;
- o = curves;
-
- while (b >= beziers) {
- int stack_segments = b - beziers + 1;
- enum shift_result res;
- if ((stack_segments == 10) || (o - curves == max_curves - stack_segments)) {
- threshold *= 1.5;
- if (threshold > 2.)
- goto give_up;
- goto redo;
- }
- res = shift(b, o, normal_len, threshold);
- if (res == Discard) {
- --b;
- } else if (res == Ok) {
- ++o;
- --b;
- continue;
- } else if (res == Circle && max_curves - (o - curves) >= 2) {
- /* add semi circle */
- if (make_circle(b, normal_len, o))
- o += 2;
- --b;
- } else {
- split(b, b+1, b);
- ++b;
- }
- }
-
-give_up:
- while (b >= beziers) {
- enum shift_result res = shift(b, o, normal_len, threshold);
-
- /* if res isn't Ok or Split then *o is undefined */
- if (res == Ok || res == Split)
- ++o;
-
- --b;
- }
-
- debug_assert(o - curves <= max_curves);
- return o - curves;
-}
-
-void bezier_bounds(const struct bezier *bez,
- float *bounds/*x/y/width/height*/)
-{
- float xmin = bez->x1;
- float xmax = bez->x1;
- float ymin = bez->y1;
- float ymax = bez->y1;
-
- if (bez->x2 < xmin)
- xmin = bez->x2;
- else if (bez->x2 > xmax)
- xmax = bez->x2;
- if (bez->x3 < xmin)
- xmin = bez->x3;
- else if (bez->x3 > xmax)
- xmax = bez->x3;
- if (bez->x4 < xmin)
- xmin = bez->x4;
- else if (bez->x4 > xmax)
- xmax = bez->x4;
-
- if (bez->y2 < ymin)
- ymin = bez->y2;
- else if (bez->y2 > ymax)
- ymax = bez->y2;
- if (bez->y3 < ymin)
- ymin = bez->y3;
- else if (bez->y3 > ymax)
- ymax = bez->y3;
- if (bez->y4 < ymin)
- ymin = bez->y4;
- else if (bez->y4 > ymax)
- ymax = bez->y4;
-
- bounds[0] = xmin; /* x */
- bounds[1] = ymin; /* y */
- bounds[2] = xmax - xmin; /* width */
- bounds[3] = ymax - ymin; /* height */
-}
-
-void bezier_start_tangent(const struct bezier *bez,
- float *tangent)
-{
- tangent[0] = bez->x1;
- tangent[1] = bez->y1;
- tangent[2] = bez->x2;
- tangent[3] = bez->y2;
-
- if (null_line(tangent)) {
- tangent[0] = bez->x1;
- tangent[1] = bez->y1;
- tangent[2] = bez->x3;
- tangent[3] = bez->y3;
- }
- if (null_line(tangent)) {
- tangent[0] = bez->x1;
- tangent[1] = bez->y1;
- tangent[2] = bez->x4;
- tangent[3] = bez->y4;
- }
-}
-
-
-static INLINE VGfloat bezier_t_at_length(struct bezier *bez,
- VGfloat at_length,
- VGfloat error)
-{
- VGfloat len = bezier_length(bez, error);
- VGfloat t = 1.0;
- VGfloat last_bigger = 1.;
-
- if (at_length > len || floatsEqual(at_length, len))
- return t;
-
- if (floatIsZero(at_length))
- return 0.f;
-
- t *= 0.5;
- while (1) {
- struct bezier right = *bez;
- struct bezier left;
- VGfloat tmp_len;
- split_left(&right, t, &left);
- tmp_len = bezier_length(&left, error);
- if (ABS(tmp_len - at_length) < error)
- break;
-
- if (tmp_len < at_length) {
- t += (last_bigger - t)*.5;
- } else {
- last_bigger = t;
- t -= t*.5;
- }
- }
- return t;
-}
-
-void bezier_point_at_length(struct bezier *bez,
- float length,
- float *point,
- float *normal)
-{
- /* ~0.000001 seems to be required to pass G2080x tests */
- VGfloat t = bezier_t_at_length(bez, length, 0.000001);
- bezier_point_at(bez, t, point);
- bezier_normal_at(bez, t, normal);
- vector_unit(normal);
-}
-
-void bezier_point_at_t(struct bezier *bez, float t,
- float *point, float *normal)
-{
- bezier_point_at(bez, t, point);
- bezier_normal_at(bez, t, normal);
- vector_unit(normal);
-}
-
-void bezier_exact_bounds(const struct bezier *bez,
- float *bounds/*x/y/width/height*/)
-{
- struct polygon *poly = polygon_create(64);
- polygon_vertex_append(poly, bez->x1, bez->y1);
- bezier_add_to_polygon(bez, poly);
- polygon_bounding_rect(poly, bounds);
- polygon_destroy(poly);
-}
-
diff --git a/src/gallium/state_trackers/vega/bezier.h b/src/gallium/state_trackers/vega/bezier.h
deleted file mode 100644
index e06666051ca..00000000000
--- a/src/gallium/state_trackers/vega/bezier.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef BEZIER_H
-#define BEZIER_H
-
-struct polygon;
-struct matrix;
-
-struct bezier {
- float x1, y1;
- float x2, y2;
- float x3, y3;
- float x4, y4;
-};
-
-
-#define BEZIER_DEFAULT_ERROR 0.01
-
-/* kappa as being l of a circle with r = 1, we can emulate any
- * circle of radius r by using the formula
- * l = r . kappa
- * More at:
- * http://www.whizkidtech.redprince.net/bezier/circle/ */
-#define KAPPA 0.5522847498
-
-void bezier_init(struct bezier *bez,
- float x1, float y1,
- float x2, float y2,
- float x3, float y3,
- float x4, float y4);
-
-struct polygon *bezier_to_polygon(struct bezier *bez);
-void bezier_add_to_polygon(const struct bezier *bez,
- struct polygon *poly);
-float bezier_length(struct bezier *bez, float error);
-void bezier_transform(struct bezier *bez,
- struct matrix *mat);
-
-int bezier_translate_by_normal(struct bezier *b,
- struct bezier *curves,
- int max_curves,
- float normal_len,
- float threshold);
-void bezier_bounds(const struct bezier *bez,
- float *bounds/*x/y/width/height*/);
-void bezier_exact_bounds(const struct bezier *bez,
- float *bounds/*x/y/width/height*/);
-
-void bezier_start_tangent(const struct bezier *bez,
- float *tangent);
-
-void bezier_point_at_length(struct bezier *bez, float length,
- float *point, float *normal);
-void bezier_point_at_t(struct bezier *bez, float t,
- float *point, float *normal);
-
-#endif
diff --git a/src/gallium/state_trackers/vega/handle.c b/src/gallium/state_trackers/vega/handle.c
deleted file mode 100644
index 11eedd923ed..00000000000
--- a/src/gallium/state_trackers/vega/handle.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2010 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-
-#include "handle.h"
-#include "util/u_hash.h"
-#include "util/u_hash_table.h"
-
-
-/**
- * Hash keys are 32-bit VGHandles
- */
-
-struct util_hash_table *handle_hash = NULL;
-
-
-static unsigned next_handle = 1;
-
-
-static unsigned
-hash_func(void *key)
-{
- /* XXX this kind of ugly */
- intptr_t ip = pointer_to_intptr(key);
- return (unsigned) (ip & 0xffffffff);
-}
-
-
-static int
-compare(void *key1, void *key2)
-{
- if (key1 < key2)
- return -1;
- else if (key1 > key2)
- return +1;
- else
- return 0;
-}
-
-
-void
-init_handles(void)
-{
- if (!handle_hash)
- handle_hash = util_hash_table_create(hash_func, compare);
-}
-
-
-void
-free_handles(void)
-{
- /* XXX destroy */
-}
-
-
-VGHandle
-create_handle(void *object)
-{
- VGHandle h = next_handle++;
- util_hash_table_set(handle_hash, intptr_to_pointer(h), object);
- return h;
-}
-
-
-void
-destroy_handle(VGHandle h)
-{
- util_hash_table_remove(handle_hash, intptr_to_pointer(h));
-}
-
diff --git a/src/gallium/state_trackers/vega/handle.h b/src/gallium/state_trackers/vega/handle.h
deleted file mode 100644
index 75f2ee875b7..00000000000
--- a/src/gallium/state_trackers/vega/handle.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2010 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-
-/**
- * Convert opaque VG object handles into pointers and vice versa.
- * XXX This is not yet 64-bit safe! All VG handles are 32 bits in size.
- */
-
-
-#ifndef HANDLE_H
-#define HANDLE_H
-
-#include "pipe/p_compiler.h"
-#include "util/u_debug.h"
-#include "util/u_hash_table.h"
-#include "util/u_pointer.h"
-
-#include "VG/openvg.h"
-#include "vg_context.h"
-
-
-extern struct util_hash_table *handle_hash;
-
-
-struct vg_mask_layer;
-struct vg_font;
-struct vg_image;
-struct vg_paint;
-struct path;
-
-
-extern void
-init_handles(void);
-
-
-extern void
-free_handles(void);
-
-
-extern VGHandle
-create_handle(void *object);
-
-
-extern void
-destroy_handle(VGHandle h);
-
-
-static INLINE VGHandle
-object_to_handle(struct vg_object *obj)
-{
- return obj ? obj->handle : VG_INVALID_HANDLE;
-}
-
-
-static INLINE VGHandle
-image_to_handle(struct vg_image *img)
-{
- /* vg_image is derived from vg_object */
- return object_to_handle((struct vg_object *) img);
-}
-
-
-static INLINE VGHandle
-masklayer_to_handle(struct vg_mask_layer *mask)
-{
- /* vg_object is derived from vg_object */
- return object_to_handle((struct vg_object *) mask);
-}
-
-
-static INLINE VGHandle
-font_to_handle(struct vg_font *font)
-{
- return object_to_handle((struct vg_object *) font);
-}
-
-
-static INLINE VGHandle
-paint_to_handle(struct vg_paint *paint)
-{
- return object_to_handle((struct vg_object *) paint);
-}
-
-
-static INLINE VGHandle
-path_to_handle(struct path *path)
-{
- return object_to_handle((struct vg_object *) path);
-}
-
-
-static INLINE void *
-handle_to_pointer(VGHandle h)
-{
- void *v = util_hash_table_get(handle_hash, intptr_to_pointer(h));
-#ifdef DEBUG
- if (v) {
- struct vg_object *obj = (struct vg_object *) v;
- assert(obj->handle == h);
- }
-#endif
- return v;
-}
-
-
-static INLINE struct vg_font *
-handle_to_font(VGHandle h)
-{
- return (struct vg_font *) handle_to_pointer(h);
-}
-
-
-static INLINE struct vg_image *
-handle_to_image(VGHandle h)
-{
- return (struct vg_image *) handle_to_pointer(h);
-}
-
-
-static INLINE struct vg_mask_layer *
-handle_to_masklayer(VGHandle h)
-{
- return (struct vg_mask_layer *) handle_to_pointer(h);
-}
-
-
-static INLINE struct vg_object *
-handle_to_object(VGHandle h)
-{
- return (struct vg_object *) handle_to_pointer(h);
-}
-
-
-static INLINE struct vg_paint *
-handle_to_paint(VGHandle h)
-{
- return (struct vg_paint *) handle_to_pointer(h);
-}
-
-
-static INLINE struct path *
-handle_to_path(VGHandle h)
-{
- return (struct path *) handle_to_pointer(h);
-}
-
-
-#endif /* HANDLE_H */
diff --git a/src/gallium/state_trackers/vega/image.c b/src/gallium/state_trackers/vega/image.c
deleted file mode 100644
index 4434550c629..00000000000
--- a/src/gallium/state_trackers/vega/image.c
+++ /dev/null
@@ -1,653 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "image.h"
-
-#include "vg_translate.h"
-#include "vg_context.h"
-#include "matrix.h"
-#include "renderer.h"
-#include "util_array.h"
-#include "api_consts.h"
-#include "shader.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_screen.h"
-#include "util/u_inlines.h"
-#include "util/u_format.h"
-#include "util/u_tile.h"
-#include "util/u_memory.h"
-#include "util/u_math.h"
-#include "util/u_sampler.h"
-#include "util/u_surface.h"
-
-static enum pipe_format vg_format_to_pipe(VGImageFormat format)
-{
- switch(format) {
- case VG_sRGB_565:
- return PIPE_FORMAT_B5G6R5_UNORM;
- case VG_sRGBA_5551:
- return PIPE_FORMAT_B5G5R5A1_UNORM;
- case VG_sRGBA_4444:
- return PIPE_FORMAT_B4G4R4A4_UNORM;
- case VG_sL_8:
- case VG_lL_8:
- return PIPE_FORMAT_L8_UNORM;
- case VG_BW_1:
- return PIPE_FORMAT_B8G8R8A8_UNORM;
- case VG_A_8:
- return PIPE_FORMAT_A8_UNORM;
-#ifdef OPENVG_VERSION_1_1
- case VG_A_1:
- case VG_A_4:
- return PIPE_FORMAT_A8_UNORM;
-#endif
- default:
- return PIPE_FORMAT_B8G8R8A8_UNORM;
- }
-}
-
-static INLINE void vg_sync_size(VGfloat *src_loc, VGfloat *dst_loc)
-{
- src_loc[2] = MIN2(src_loc[2], dst_loc[2]);
- src_loc[3] = MIN2(src_loc[3], dst_loc[3]);
- dst_loc[2] = src_loc[2];
- dst_loc[3] = src_loc[3];
-}
-
-static void vg_get_copy_coords(VGfloat *src_loc,
- VGfloat src_width, VGfloat src_height,
- VGfloat *dst_loc,
- VGfloat dst_width, VGfloat dst_height)
-{
- VGfloat dst_bounds[4], src_bounds[4];
- VGfloat src_shift[4], dst_shift[4], shift[4];
-
- dst_bounds[0] = 0.f;
- dst_bounds[1] = 0.f;
- dst_bounds[2] = dst_width;
- dst_bounds[3] = dst_height;
-
- src_bounds[0] = 0.f;
- src_bounds[1] = 0.f;
- src_bounds[2] = src_width;
- src_bounds[3] = src_height;
-
- vg_bound_rect(src_loc, src_bounds, src_shift);
- vg_bound_rect(dst_loc, dst_bounds, dst_shift);
- shift[0] = src_shift[0] - dst_shift[0];
- shift[1] = src_shift[1] - dst_shift[1];
-
- if (shift[0] < 0)
- vg_shift_rectx(src_loc, src_bounds, -shift[0]);
- else
- vg_shift_rectx(dst_loc, dst_bounds, shift[0]);
-
- if (shift[1] < 0)
- vg_shift_recty(src_loc, src_bounds, -shift[1]);
- else
- vg_shift_recty(dst_loc, dst_bounds, shift[1]);
-
- vg_sync_size(src_loc, dst_loc);
-}
-
-static void vg_copy_texture(struct vg_context *ctx,
- struct pipe_resource *dst, VGint dx, VGint dy,
- struct pipe_sampler_view *src, VGint sx, VGint sy,
- VGint width, VGint height)
-{
- VGfloat dst_loc[4], src_loc[4];
-
- dst_loc[0] = dx;
- dst_loc[1] = dy;
- dst_loc[2] = width;
- dst_loc[3] = height;
-
- src_loc[0] = sx;
- src_loc[1] = sy;
- src_loc[2] = width;
- src_loc[3] = height;
-
- vg_get_copy_coords(src_loc, src->texture->width0, src->texture->height0,
- dst_loc, dst->width0, dst->height0);
-
- if (src_loc[2] >= 0 && src_loc[3] >= 0 &&
- dst_loc[2] >= 0 && dst_loc[3] >= 0) {
- struct pipe_surface *surf, surf_tmpl;
-
- /* get the destination surface */
- u_surface_default_template(&surf_tmpl, dst);
- surf = ctx->pipe->create_surface(ctx->pipe, dst, &surf_tmpl);
- if (surf && renderer_copy_begin(ctx->renderer, surf, VG_TRUE, src)) {
- renderer_copy(ctx->renderer,
- dst_loc[0], dst_loc[1], dst_loc[2], dst_loc[3],
- src_loc[0], src_loc[1], src_loc[2], src_loc[3]);
- renderer_copy_end(ctx->renderer);
- }
-
- pipe_surface_reference(&surf, NULL);
- }
-}
-
-void vg_copy_surface(struct vg_context *ctx,
- struct pipe_surface *dst, VGint dx, VGint dy,
- struct pipe_surface *src, VGint sx, VGint sy,
- VGint width, VGint height)
-{
- VGfloat dst_loc[4], src_loc[4];
-
- dst_loc[0] = dx;
- dst_loc[1] = dy;
- dst_loc[2] = width;
- dst_loc[3] = height;
-
- src_loc[0] = sx;
- src_loc[1] = sy;
- src_loc[2] = width;
- src_loc[3] = height;
-
- vg_get_copy_coords(src_loc, src->width, src->height,
- dst_loc, dst->width, dst->height);
-
- if (src_loc[2] > 0 && src_loc[3] > 0 &&
- dst_loc[2] > 0 && dst_loc[3] > 0) {
- if (src == dst)
- renderer_copy_surface(ctx->renderer,
- src,
- src_loc[0],
- src->height - (src_loc[1] + src_loc[3]),
- src_loc[0] + src_loc[2],
- src->height - src_loc[1],
- dst,
- dst_loc[0],
- dst->height - (dst_loc[1] + dst_loc[3]),
- dst_loc[0] + dst_loc[2],
- dst->height - dst_loc[1],
- 0, 0);
- else
- renderer_copy_surface(ctx->renderer,
- src,
- src_loc[0],
- src->height - src_loc[1],
- src_loc[0] + src_loc[2],
- src->height - (src_loc[1] + src_loc[3]),
- dst,
- dst_loc[0],
- dst->height - (dst_loc[1] + dst_loc[3]),
- dst_loc[0] + dst_loc[2],
- dst->height - dst_loc[1],
- 0, 0);
- }
-
-}
-
-static struct pipe_resource *image_texture(struct vg_image *img)
-{
- struct pipe_resource *tex = img->sampler_view->texture;
- return tex;
-}
-
-
-static void image_cleari(struct vg_image *img, VGint clear_colori,
- VGint x, VGint y, VGint width, VGint height)
-{
- VGint *clearbuf;
- VGint i;
- VGfloat dwidth, dheight;
-
- clearbuf = malloc(sizeof(VGint)*width*height);
- for (i = 0; i < width*height; ++i)
- clearbuf[i] = clear_colori;
-
- dwidth = MIN2(width, img->width);
- dheight = MIN2(height, img->height);
-
- image_sub_data(img, clearbuf, width * sizeof(VGint),
- VG_sRGBA_8888,
- x, y, dwidth, dheight);
- free(clearbuf);
-}
-
-struct vg_image * image_create(VGImageFormat format,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_context *pipe = ctx->pipe;
- struct vg_image *image = CALLOC_STRUCT(vg_image);
- enum pipe_format pformat = vg_format_to_pipe(format);
- struct pipe_resource pt, *newtex;
- struct pipe_sampler_view view_templ;
- struct pipe_sampler_view *view;
- struct pipe_screen *screen = ctx->pipe->screen;
-
- vg_init_object(&image->base, ctx, VG_OBJECT_IMAGE);
-
- image->format = format;
- image->width = width;
- image->height = height;
-
- image->sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- image->sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- image->sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- image->sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
- image->sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
- image->sampler.normalized_coords = 1;
-
- assert(screen->is_format_supported(screen, pformat, PIPE_TEXTURE_2D,
- 0, PIPE_BIND_SAMPLER_VIEW));
-
- memset(&pt, 0, sizeof(pt));
- pt.target = PIPE_TEXTURE_2D;
- pt.format = pformat;
- pt.last_level = 0;
- pt.width0 = width;
- pt.height0 = height;
- pt.depth0 = 1;
- pt.array_size = 1;
- pt.bind = PIPE_BIND_SAMPLER_VIEW;
-
- newtex = screen->resource_create(screen, &pt);
-
- debug_assert(newtex);
-
- u_sampler_view_default_template(&view_templ, newtex, newtex->format);
- /* R, G, and B are treated as 1.0 for alpha-only formats in OpenVG */
- if (newtex->format == PIPE_FORMAT_A8_UNORM) {
- view_templ.swizzle_r = PIPE_SWIZZLE_ONE;
- view_templ.swizzle_g = PIPE_SWIZZLE_ONE;
- view_templ.swizzle_b = PIPE_SWIZZLE_ONE;
- }
-
- view = pipe->create_sampler_view(pipe, newtex, &view_templ);
- /* want the texture to go away if the view is freed */
- pipe_resource_reference(&newtex, NULL);
-
- image->sampler_view = view;
-
- vg_context_add_object(ctx, &image->base);
-
- image_cleari(image, 0, 0, 0, image->width, image->height);
- return image;
-}
-
-void image_destroy(struct vg_image *img)
-{
- struct vg_context *ctx = vg_current_context();
- vg_context_remove_object(ctx, &img->base);
-
-
- if (img->parent) {
- /* remove img from the parent child array */
- int idx;
- struct vg_image **array =
- (struct vg_image **)img->parent->children_array->data;
-
- for (idx = 0; idx < img->parent->children_array->num_elements; ++idx) {
- struct vg_image *child = array[idx];
- if (child == img) {
- break;
- }
- }
- debug_assert(idx < img->parent->children_array->num_elements);
- array_remove_element(img->parent->children_array, idx);
- }
-
- if (img->children_array && img->children_array->num_elements) {
- /* reparent the children */
- VGint i;
- struct vg_image *parent = img->parent;
- struct vg_image **children =
- (struct vg_image **)img->children_array->data;
- if (!parent) {
- VGint min_x = children[0]->x;
- parent = children[0];
-
- for (i = 1; i < img->children_array->num_elements; ++i) {
- struct vg_image *child = children[i];
- if (child->x < min_x) {
- parent = child;
- }
- }
- }
-
- for (i = 0; i < img->children_array->num_elements; ++i) {
- struct vg_image *child = children[i];
- if (child != parent) {
- child->parent = parent;
- if (!parent->children_array) {
- parent->children_array = array_create(
- sizeof(struct vg_image*));
- }
- array_append_data(parent->children_array,
- &child, 1);
- } else
- child->parent = NULL;
- }
- array_destroy(img->children_array);
- }
-
- vg_free_object(&img->base);
-
- pipe_sampler_view_reference(&img->sampler_view, NULL);
- FREE(img);
-}
-
-void image_clear(struct vg_image *img,
- VGint x, VGint y, VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- VGfloat *clear_colorf = ctx->state.vg.clear_color;
- VGubyte r, g, b ,a;
- VGint clear_colori;
- /* FIXME: this is very nasty */
- r = float_to_ubyte(clear_colorf[0]);
- g = float_to_ubyte(clear_colorf[1]);
- b = float_to_ubyte(clear_colorf[2]);
- a = float_to_ubyte(clear_colorf[3]);
- clear_colori = r << 24 | g << 16 | b << 8 | a;
- image_cleari(img, clear_colori, x, y, width, height);
-}
-
-void image_sub_data(struct vg_image *image,
- const void * data,
- VGint dataStride,
- VGImageFormat dataFormat,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- const VGint yStep = 1;
- VGubyte *src = (VGubyte *)data;
- VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
- VGfloat *df = (VGfloat*)temp;
- VGint i;
- struct vg_context *ctx = vg_current_context();
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_resource *texture = image_texture(image);
- VGint xoffset = 0, yoffset = 0;
-
- if (x < 0) {
- xoffset -= x;
- width += x;
- x = 0;
- }
- if (y < 0) {
- yoffset -= y;
- height += y;
- y = 0;
- }
-
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (x > image->width || y > image->width) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- if (x + width > image->width) {
- width = image->width - x;
- }
-
- if (y + height > image->height) {
- height = image->height - y;
- }
-
- { /* upload color_data */
- struct pipe_transfer *transfer;
- void *map = pipe_transfer_map(pipe, texture, 0, 0,
- PIPE_TRANSFER_WRITE, 0, 0,
- texture->width0, texture->height0,
- &transfer);
- src += (dataStride * yoffset);
- for (i = 0; i < height; i++) {
- _vega_unpack_float_span_rgba(ctx, width, xoffset, src, dataFormat, temp);
- pipe_put_tile_rgba(transfer, map, x+image->x, y+image->y, width, 1, df);
- y += yStep;
- src += dataStride;
- }
- pipe->transfer_unmap(pipe, transfer);
- }
-}
-
-void image_get_sub_data(struct vg_image * image,
- void * data,
- VGint dataStride,
- VGImageFormat dataFormat,
- VGint sx, VGint sy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_context *pipe = ctx->pipe;
- VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
- VGfloat *df = (VGfloat*)temp;
- VGint y = 0, yStep = 1;
- VGint i;
- VGubyte *dst = (VGubyte *)data;
-
- {
- struct pipe_transfer *transfer;
- void *map =
- pipe_transfer_map(pipe,
- image->sampler_view->texture, 0, 0,
- PIPE_TRANSFER_READ,
- 0, 0,
- image->x + image->width,
- image->y + image->height, &transfer);
- /* Do a row at a time to flip image data vertically */
- for (i = 0; i < height; i++) {
-#if 0
- debug_printf("%d-%d == %d\n", sy, height, y);
-#endif
- pipe_get_tile_rgba(transfer, map, sx+image->x, y, width, 1, df);
- y += yStep;
- _vega_pack_rgba_span_float(ctx, width, temp, dataFormat, dst);
- dst += dataStride;
- }
-
- pipe->transfer_unmap(pipe, transfer);
- }
-}
-
-struct vg_image * image_child_image(struct vg_image *parent,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_image *image = CALLOC_STRUCT(vg_image);
-
- vg_init_object(&image->base, ctx, VG_OBJECT_IMAGE);
-
- image->x = parent->x + x;
- image->y = parent->y + y;
- image->width = width;
- image->height = height;
- image->parent = parent;
- image->sampler_view = NULL;
- pipe_sampler_view_reference(&image->sampler_view,
- parent->sampler_view);
-
- image->sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- image->sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- image->sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- image->sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
- image->sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
- image->sampler.normalized_coords = 1;
-
- if (!parent->children_array)
- parent->children_array = array_create(
- sizeof(struct vg_image*));
-
- array_append_data(parent->children_array,
- &image, 1);
-
- vg_context_add_object(ctx, &image->base);
-
- return image;
-}
-
-void image_copy(struct vg_image *dst, VGint dx, VGint dy,
- struct vg_image *src, VGint sx, VGint sy,
- VGint width, VGint height,
- VGboolean dither)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (width <= 0 || height <= 0) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- vg_copy_texture(ctx, dst->sampler_view->texture, dst->x + dx, dst->y + dy,
- src->sampler_view, src->x + sx, src->y + sy, width, height);
-}
-
-void image_draw(struct vg_image *img, struct matrix *matrix)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix paint_matrix;
- VGfloat x1, y1;
- VGfloat x2, y2;
- VGfloat x3, y3;
- VGfloat x4, y4;
-
- if (!vg_get_paint_matrix(ctx,
- &ctx->state.vg.fill_paint_to_user_matrix,
- matrix,
- &paint_matrix))
- return;
-
- x1 = 0;
- y1 = 0;
- x2 = img->width;
- y2 = 0;
- x3 = img->width;
- y3 = img->height;
- x4 = 0;
- y4 = img->height;
-
- shader_set_surface_matrix(ctx->shader, matrix);
- shader_set_drawing_image(ctx->shader, VG_TRUE);
- shader_set_paint(ctx->shader, ctx->state.vg.fill_paint);
- shader_set_paint_matrix(ctx->shader, &paint_matrix);
- shader_set_image(ctx->shader, img);
- shader_bind(ctx->shader);
-
- renderer_texture_quad(ctx->renderer, image_texture(img),
- img->x, img->y, img->x + img->width, img->y + img->height,
- x1, y1, x2, y2, x3, y3, x4, y4);
-}
-
-void image_set_pixels(VGint dx, VGint dy,
- struct vg_image *src, VGint sx, VGint sy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_surface *surf, surf_tmpl;
- struct st_renderbuffer *strb = ctx->draw_buffer->strb;
-
- u_surface_default_template(&surf_tmpl, image_texture(src));
- surf = pipe->create_surface(pipe, image_texture(src), &surf_tmpl);
-
- vg_copy_surface(ctx, strb->surface, dx, dy,
- surf, sx+src->x, sy+src->y, width, height);
-
- pipe->surface_destroy(pipe, surf);
-}
-
-void image_get_pixels(struct vg_image *dst, VGint dx, VGint dy,
- VGint sx, VGint sy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_surface *surf, surf_tmpl;
- struct st_renderbuffer *strb = ctx->draw_buffer->strb;
-
- /* flip the y coordinates */
- /*dy = dst->height - dy - height;*/
-
- u_surface_default_template(&surf_tmpl, image_texture(dst));
- surf = pipe->create_surface(pipe, image_texture(dst), &surf_tmpl);
-
- vg_copy_surface(ctx, surf, dst->x + dx, dst->y + dy,
- strb->surface, sx, sy, width, height);
-
- pipe_surface_reference(&surf, NULL);
-}
-
-
-VGboolean vg_image_overlaps(struct vg_image *dst,
- struct vg_image *src)
-{
- if (dst == src || dst->parent == src ||
- dst == src->parent)
- return VG_TRUE;
- if (dst->parent && dst->parent == src->parent) {
- VGfloat left1 = dst->x;
- VGfloat left2 = src->x;
- VGfloat right1 = dst->x + dst->width;
- VGfloat right2 = src->x + src->width;
- VGfloat bottom1 = dst->y;
- VGfloat bottom2 = src->y;
- VGfloat top1 = dst->y + dst->height;
- VGfloat top2 = src->y + src->height;
-
- return !(left2 > right1 || right2 < left1 ||
- top2 > bottom1 || bottom2 < top1);
- }
- return VG_FALSE;
-}
-
-VGint image_bind_samplers(struct vg_image *img, struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **sampler_views)
-{
- img->sampler.min_img_filter = image_sampler_filter(img->base.ctx);
- img->sampler.mag_img_filter = image_sampler_filter(img->base.ctx);
- samplers[3] = &img->sampler;
- sampler_views[3] = img->sampler_view;
- return 1;
-}
-
-VGint image_sampler_filter(struct vg_context *ctx)
-{
- switch(ctx->state.vg.image_quality) {
- case VG_IMAGE_QUALITY_NONANTIALIASED:
- return PIPE_TEX_FILTER_NEAREST;
- break;
- case VG_IMAGE_QUALITY_FASTER:
- return PIPE_TEX_FILTER_NEAREST;
- break;
- case VG_IMAGE_QUALITY_BETTER:
- /* possibly use anisotropic filtering */
- return PIPE_TEX_FILTER_LINEAR;
- break;
- default:
- debug_printf("Unknown image quality");
- }
- return PIPE_TEX_FILTER_NEAREST;
-}
diff --git a/src/gallium/state_trackers/vega/image.h b/src/gallium/state_trackers/vega/image.h
deleted file mode 100644
index 391c0485948..00000000000
--- a/src/gallium/state_trackers/vega/image.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef IMAGES_H
-#define IMAGES_H
-
-#include "vg_context.h"
-#include "pipe/p_state.h"
-
-struct pipe_resource;
-struct array;
-struct vg_context;
-struct pipe_surface;
-
-struct vg_image {
- struct vg_object base;
- VGImageFormat format;
- VGint x, y;
- VGint width, height;
-
- struct vg_image *parent;
-
- struct pipe_sampler_view *sampler_view;
- struct pipe_sampler_state sampler;
-
- struct array *children_array;
-};
-
-struct vg_image *image_create(VGImageFormat format,
- VGint width, VGint height);
-void image_destroy(struct vg_image *img);
-
-void image_clear(struct vg_image *img,
- VGint x, VGint y, VGint width, VGint height);
-
-void image_sub_data(struct vg_image *image,
- const void * data,
- VGint dataStride,
- VGImageFormat dataFormat,
- VGint x, VGint y,
- VGint width, VGint height);
-
-void image_get_sub_data(struct vg_image * image,
- void * data,
- VGint dataStride,
- VGImageFormat dataFormat,
- VGint x, VGint y,
- VGint width, VGint height);
-
-struct vg_image *image_child_image(struct vg_image *parent,
- VGint x, VGint y,
- VGint width, VGint height);
-
-void image_copy(struct vg_image *dst, VGint dx, VGint dy,
- struct vg_image *src, VGint sx, VGint sy,
- VGint width, VGint height,
- VGboolean dither);
-
-void image_draw(struct vg_image *img, struct matrix *matrix);
-
-void image_set_pixels(VGint dx, VGint dy,
- struct vg_image *src, VGint sx, VGint sy,
- VGint width, VGint height);
-void image_get_pixels(struct vg_image *dst, VGint dx, VGint dy,
- VGint sx, VGint sy,
- VGint width, VGint height);
-
-VGint image_bind_samplers(struct vg_image *dst, struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **sampler_views);
-
-VGboolean vg_image_overlaps(struct vg_image *dst,
- struct vg_image *src);
-
-VGint image_sampler_filter(struct vg_context *ctx);
-
-void vg_copy_surface(struct vg_context *ctx,
- struct pipe_surface *dst, VGint dx, VGint dy,
- struct pipe_surface *src, VGint sx, VGint sy,
- VGint width, VGint height);
-
-#endif
diff --git a/src/gallium/state_trackers/vega/mask.c b/src/gallium/state_trackers/vega/mask.c
deleted file mode 100644
index ca8edd01686..00000000000
--- a/src/gallium/state_trackers/vega/mask.c
+++ /dev/null
@@ -1,523 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "mask.h"
-
-#include "path.h"
-#include "image.h"
-#include "shaders_cache.h"
-#include "renderer.h"
-#include "asm_util.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_screen.h"
-#include "util/u_inlines.h"
-#include "util/u_format.h"
-#include "util/u_memory.h"
-#include "util/u_surface.h"
-#include "util/u_sampler.h"
-
-struct vg_mask_layer {
- struct vg_object base;
-
- VGint width;
- VGint height;
-
- struct pipe_sampler_view *sampler_view;
-};
-
-static INLINE VGboolean
-intersect_rectangles(VGint dwidth, VGint dheight,
- VGint swidth, VGint sheight,
- VGint tx, VGint ty,
- VGint twidth, VGint theight,
- VGint *offsets,
- VGint *location)
-{
- if (tx + twidth <= 0 || tx >= dwidth)
- return VG_FALSE;
- if (ty + theight <= 0 || ty >= dheight)
- return VG_FALSE;
-
- offsets[0] = 0;
- offsets[1] = 0;
- location[0] = tx;
- location[1] = ty;
-
- if (tx < 0) {
- offsets[0] -= tx;
- location[0] = 0;
-
- location[2] = MIN2(tx + swidth, MIN2(dwidth, tx + twidth));
- offsets[2] = location[2];
- } else {
- offsets[2] = MIN2(twidth, MIN2(dwidth - tx, swidth ));
- location[2] = offsets[2];
- }
-
- if (ty < 0) {
- offsets[1] -= ty;
- location[1] = 0;
-
- location[3] = MIN2(ty + sheight, MIN2(dheight, ty + theight));
- offsets[3] = location[3];
- } else {
- offsets[3] = MIN2(theight, MIN2(dheight - ty, sheight));
- location[3] = offsets[3];
- }
-
- return VG_TRUE;
-}
-
-#if DEBUG_MASKS
-static void read_alpha_mask(void * data, VGint dataStride,
- VGImageFormat dataFormat,
- VGint sx, VGint sy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_context *pipe = ctx->pipe;
-
- struct st_framebuffer *stfb = ctx->draw_buffer;
- struct st_renderbuffer *strb = stfb->alpha_mask;
-
- VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
- VGfloat *df = (VGfloat*)temp;
- VGint y = (stfb->height - sy) - 1, yStep = -1;
- VGint i;
- VGubyte *dst = (VGubyte *)data;
- VGint xoffset = 0, yoffset = 0;
-
- if (sx < 0) {
- xoffset = -sx;
- xoffset *= _vega_size_for_format(dataFormat);
- width += sx;
- sx = 0;
- }
- if (sy < 0) {
- yoffset = -sy;
- height += sy;
- sy = 0;
- y = (stfb->height - sy) - 1;
- yoffset *= dataStride;
- }
-
- {
- struct pipe_surface *surf;
-
- surf = pipe->create_surface(pipe, strb->texture, 0, 0, 0,
- PIPE_BIND_TRANSFER_READ);
-
- /* Do a row at a time to flip image data vertically */
- for (i = 0; i < height; i++) {
-#if 0
- debug_printf("%d-%d == %d\n", sy, height, y);
-#endif
- pipe_get_tile_rgba(surf, sx, y, width, 1, df);
- y += yStep;
- _vega_pack_rgba_span_float(ctx, width, temp, dataFormat,
- dst + yoffset + xoffset);
- dst += dataStride;
- }
-
- pipe_surface_reference(&surf, NULL);
- }
-}
-
-void save_alpha_to_file(const char *filename)
-{
- struct vg_context *ctx = vg_current_context();
- struct st_framebuffer *stfb = ctx->draw_buffer;
- VGint *data;
- int i, j;
-
- data = malloc(sizeof(int) * stfb->width * stfb->height);
- read_alpha_mask(data, stfb->width * sizeof(int),
- VG_sRGBA_8888,
- 0, 0, stfb->width, stfb->height);
- fprintf(stderr, "/*---------- start */\n");
- fprintf(stderr, "const int image_width = %d;\n",
- stfb->width);
- fprintf(stderr, "const int image_height = %d;\n",
- stfb->height);
- fprintf(stderr, "const int image_data = {\n");
- for (i = 0; i < stfb->height; ++i) {
- for (j = 0; j < stfb->width; ++j) {
- int rgba = data[i * stfb->height + j];
- int argb = 0;
- argb = (rgba >> 8);
- argb |= ((rgba & 0xff) << 24);
- fprintf(stderr, "0x%x, ", argb);
- }
- fprintf(stderr, "\n");
- }
- fprintf(stderr, "};\n");
- fprintf(stderr, "/*---------- end */\n");
-}
-#endif
-
-/* setup mask shader */
-static void *setup_mask_operation(VGMaskOperation operation)
-{
- struct vg_context *ctx = vg_current_context();
- void *shader = 0;
-
- switch (operation) {
- case VG_UNION_MASK: {
- if (!ctx->mask.union_fs) {
- ctx->mask.union_fs = shader_create_from_text(ctx->pipe,
- union_mask_asm,
- 200,
- PIPE_SHADER_FRAGMENT);
- }
- shader = ctx->mask.union_fs->driver;
- }
- break;
- case VG_INTERSECT_MASK: {
- if (!ctx->mask.intersect_fs) {
- ctx->mask.intersect_fs = shader_create_from_text(ctx->pipe,
- intersect_mask_asm,
- 200,
- PIPE_SHADER_FRAGMENT);
- }
- shader = ctx->mask.intersect_fs->driver;
- }
- break;
- case VG_SUBTRACT_MASK: {
- if (!ctx->mask.subtract_fs) {
- ctx->mask.subtract_fs = shader_create_from_text(ctx->pipe,
- subtract_mask_asm,
- 200,
- PIPE_SHADER_FRAGMENT);
- }
- shader = ctx->mask.subtract_fs->driver;
- }
- break;
- case VG_SET_MASK: {
- if (!ctx->mask.set_fs) {
- ctx->mask.set_fs = shader_create_from_text(ctx->pipe,
- set_mask_asm,
- 200,
- PIPE_SHADER_FRAGMENT);
- }
- shader = ctx->mask.set_fs->driver;
- }
- break;
- default:
- assert(0);
- break;
- }
-
- return shader;
-}
-
-static void mask_resource_fill(struct pipe_resource *dst,
- int x, int y, int width, int height,
- VGfloat coverage)
-{
- struct vg_context *ctx = vg_current_context();
- VGfloat fs_consts[12] = {
- 0.0f, 0.0f, 0.0f, 0.0f, /* not used */
- 0.0f, 0.0f, 0.0f, 0.0f, /* not used */
- 0.0f, 0.0f, 0.0f, coverage /* color */
- };
- void *fs;
-
- if (x < 0) {
- width += x;
- x = 0;
- }
- if (y < 0) {
- height += y;
- y = 0;
- }
-
- fs = shaders_cache_fill(ctx->sc, VEGA_SOLID_FILL_SHADER);
-
- if (renderer_filter_begin(ctx->renderer, dst, VG_FALSE, ~0,
- NULL, NULL, 0, fs, (const void *) fs_consts, sizeof(fs_consts))) {
- renderer_filter(ctx->renderer, x, y, width, height, 0, 0, 0, 0);
- renderer_filter_end(ctx->renderer);
- }
-
-#if DEBUG_MASKS
- save_alpha_to_file(0);
-#endif
-}
-
-
-static void mask_using_texture(struct pipe_sampler_view *sampler_view,
- VGboolean is_layer,
- VGMaskOperation operation,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_sampler_view *dst_view = vg_get_surface_mask(ctx);
- struct pipe_resource *dst = dst_view->texture;
- struct pipe_resource *texture = sampler_view->texture;
- const struct pipe_sampler_state *samplers[2];
- struct pipe_sampler_view *views[2];
- struct pipe_sampler_state sampler;
- VGint offsets[4], loc[4];
- const VGfloat ones[4] = {1.f, 1.f, 1.f, 1.f};
- void *fs;
-
- if (!intersect_rectangles(dst->width0, dst->height0,
- texture->width0, texture->height0,
- x, y, width, height,
- offsets, loc))
- return;
-#if 0
- debug_printf("Offset = [%d, %d, %d, %d]\n", offsets[0],
- offsets[1], offsets[2], offsets[3]);
- debug_printf("Locati = [%d, %d, %d, %d]\n", loc[0],
- loc[1], loc[2], loc[3]);
-#endif
-
-
- sampler = ctx->mask.sampler;
- sampler.normalized_coords = 1;
- samplers[0] = &sampler;
- views[0] = sampler_view;
-
- /* prepare our blend surface */
- samplers[1] = &ctx->mask.sampler;
- views[1] = vg_prepare_blend_surface_from_mask(ctx);
-
- fs = setup_mask_operation(operation);
-
- if (renderer_filter_begin(ctx->renderer, dst, VG_FALSE,
- ~0, samplers, views, 2, fs, (const void *) ones, sizeof(ones))) {
- /* layer should be flipped when used as a texture */
- if (is_layer) {
- offsets[1] += offsets[3];
- offsets[3] = -offsets[3];
- }
- renderer_filter(ctx->renderer,
- loc[0], loc[1], loc[2], loc[3],
- offsets[0], offsets[1], offsets[2], offsets[3]);
- renderer_filter_end(ctx->renderer);
- }
-}
-
-
-#ifdef OPENVG_VERSION_1_1
-
-struct vg_mask_layer * mask_layer_create(VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_mask_layer *mask = 0;
-
- mask = CALLOC_STRUCT(vg_mask_layer);
- vg_init_object(&mask->base, ctx, VG_OBJECT_MASK);
- mask->width = width;
- mask->height = height;
-
- {
- struct pipe_resource pt;
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_screen *screen = ctx->pipe->screen;
- struct pipe_sampler_view view_templ;
- struct pipe_sampler_view *view = NULL;
- struct pipe_resource *texture;
-
- memset(&pt, 0, sizeof(pt));
- pt.target = PIPE_TEXTURE_2D;
- pt.format = PIPE_FORMAT_B8G8R8A8_UNORM;
- pt.last_level = 0;
- pt.width0 = width;
- pt.height0 = height;
- pt.depth0 = 1;
- pt.array_size = 1;
- pt.bind = PIPE_BIND_SAMPLER_VIEW;
-
- texture = screen->resource_create(screen, &pt);
-
- if (texture) {
- u_sampler_view_default_template(&view_templ, texture, texture->format);
- view = pipe->create_sampler_view(pipe, texture, &view_templ);
- }
- pipe_resource_reference(&texture, NULL);
- mask->sampler_view = view;
- }
-
- vg_context_add_object(ctx, &mask->base);
-
- return mask;
-}
-
-void mask_layer_destroy(struct vg_mask_layer *layer)
-{
- struct vg_context *ctx = vg_current_context();
-
- vg_context_remove_object(ctx, &layer->base);
- pipe_sampler_view_reference(&layer->sampler_view, NULL);
- vg_free_object(&layer->base);
- FREE(layer);
-}
-
-void mask_layer_fill(struct vg_mask_layer *layer,
- VGint x, VGint y,
- VGint width, VGint height,
- VGfloat value)
-{
- mask_resource_fill(layer->sampler_view->texture,
- x, y, width, height, value);
-}
-
-void mask_copy(struct vg_mask_layer *layer,
- VGint sx, VGint sy,
- VGint dx, VGint dy,
- VGint width, VGint height)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_sampler_view *src = vg_get_surface_mask(ctx);
- struct pipe_surface *surf, surf_tmpl;
-
- /* get the destination surface */
- u_surface_default_template(&surf_tmpl, layer->sampler_view->texture);
- surf = ctx->pipe->create_surface(ctx->pipe, layer->sampler_view->texture,
- &surf_tmpl);
- if (surf && renderer_copy_begin(ctx->renderer, surf, VG_FALSE, src)) {
- /* layer should be flipped when used as a texture */
- sy += height;
- height = -height;
-
- renderer_copy(ctx->renderer,
- dx, dy, width, height,
- sx, sy, width, height);
- renderer_copy_end(ctx->renderer);
- }
-
- pipe_surface_reference(&surf, NULL);
-}
-
-static void mask_layer_render_to(struct vg_mask_layer *layer,
- struct path *path,
- VGbitfield paint_modes)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_sampler_view *view = vg_get_surface_mask(ctx);
- struct matrix *mat = &ctx->state.vg.path_user_to_surface_matrix;
- struct pipe_surface *surf, surf_tmpl;
- u_surface_default_template(&surf_tmpl, view->texture);
- surf = pipe->create_surface(pipe, view->texture, &surf_tmpl);
-
- renderer_validate_for_mask_rendering(ctx->renderer, surf, mat);
-
- if (paint_modes & VG_FILL_PATH) {
- path_fill(path);
- }
-
- if (paint_modes & VG_STROKE_PATH){
- path_stroke(path);
- }
-
- pipe_surface_reference(&surf, NULL);
-}
-
-void mask_render_to(struct path *path,
- VGbitfield paint_modes,
- VGMaskOperation operation)
-{
- struct vg_context *ctx = vg_current_context();
- struct st_framebuffer *stfb = ctx->draw_buffer;
- struct vg_mask_layer *temp_layer;
- VGint width, height;
-
- width = stfb->width;
- height = stfb->height;
-
- temp_layer = mask_layer_create(width, height);
- mask_layer_fill(temp_layer, 0, 0, width, height, 0.0f);
-
- mask_layer_render_to(temp_layer, path, paint_modes);
-
- mask_using_layer(temp_layer, operation, 0, 0, width, height);
-
- mask_layer_destroy(temp_layer);
-}
-
-void mask_using_layer(struct vg_mask_layer *layer,
- VGMaskOperation operation,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- mask_using_texture(layer->sampler_view, VG_TRUE, operation,
- x, y, width, height);
-}
-
-VGint mask_layer_width(struct vg_mask_layer *layer)
-{
- return layer->width;
-}
-
-VGint mask_layer_height(struct vg_mask_layer *layer)
-{
- return layer->height;
-}
-
-
-#endif
-
-void mask_using_image(struct vg_image *image,
- VGMaskOperation operation,
- VGint x, VGint y,
- VGint width, VGint height)
-{
- mask_using_texture(image->sampler_view, VG_FALSE, operation,
- x, y, width, height);
-}
-
-void mask_fill(VGint x, VGint y, VGint width, VGint height,
- VGfloat value)
-{
- struct vg_context *ctx = vg_current_context();
- struct pipe_sampler_view *view = vg_get_surface_mask(ctx);
-
-#if DEBUG_MASKS
- debug_printf("mask_fill(%d, %d, %d, %d) with rgba(%f, %f, %f, %f)\n",
- x, y, width, height,
- 0.0f, 0.0f, 0.0f, value);
-#endif
-
- mask_resource_fill(view->texture, x, y, width, height, value);
-}
-
-VGint mask_bind_samplers(struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **sampler_views)
-{
- struct vg_context *ctx = vg_current_context();
-
- if (ctx->state.vg.masking) {
- samplers[1] = &ctx->mask.sampler;
- sampler_views[1] = vg_get_surface_mask(ctx);
- return 1;
- } else
- return 0;
-}
diff --git a/src/gallium/state_trackers/vega/mask.h b/src/gallium/state_trackers/vega/mask.h
deleted file mode 100644
index c626402c864..00000000000
--- a/src/gallium/state_trackers/vega/mask.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef MASK_H
-#define MASK_H
-
-#include "vg_context.h"
-
-struct path;
-struct vg_image;
-struct pipe_resource;
-
-struct vg_mask_layer *mask_layer_create(VGint width, VGint height);
-void mask_layer_destroy(struct vg_mask_layer *layer);
-void mask_layer_fill(struct vg_mask_layer *layer,
- VGint x, VGint y,
- VGint width, VGint height,
- VGfloat value);
-VGint mask_layer_width(struct vg_mask_layer *layer);
-VGint mask_layer_height(struct vg_mask_layer *layer);
-void mask_copy(struct vg_mask_layer *layer,
- VGint sx, VGint sy,
- VGint dx, VGint dy,
- VGint width, VGint height);
-
-void mask_render_to(struct path *path,
- VGbitfield paint_modes,
- VGMaskOperation operation);
-
-void mask_using_layer(struct vg_mask_layer *layer,
- VGMaskOperation operation,
- VGint x, VGint y,
- VGint width, VGint height);
-void mask_using_image(struct vg_image *image,
- VGMaskOperation operation,
- VGint x, VGint y,
- VGint width, VGint height);
-void mask_fill(VGint x, VGint y,
- VGint width, VGint height,
- VGfloat value);
-
-VGint mask_bind_samplers(struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **sampler_views);
-
-#endif
diff --git a/src/gallium/state_trackers/vega/matrix.h b/src/gallium/state_trackers/vega/matrix.h
deleted file mode 100644
index 794c7e7a4ce..00000000000
--- a/src/gallium/state_trackers/vega/matrix.h
+++ /dev/null
@@ -1,462 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef MATRIX_H
-#define MATRIX_H
-
-#include "VG/openvg.h"
-
-#include "pipe/p_compiler.h"
-#include "util/u_math.h"
-
-#include <stdio.h>
-#include <math.h>
-
-#define floatsEqual(x, y) (fabs(x - y) <= 0.00001f * MIN2(fabs(x), fabs(y)))
-#define floatIsZero(x) (floatsEqual((x) + 1, 1))
-#define ABS(x) (fabsf(x))
-
-#define DEGREES_TO_RADIANS(d) (0.0174532925199 * (d))
-#define FLT_TO_INT(flt) float_to_int_floor(((VGuint*)&(flt))[0])
-
-static INLINE VGint float_to_int_floor(VGuint bits)
-{
- int sign = (bits >> 31) ? -1 : 1;
- int exp = ((bits >> 23) & 255) - 127;
- int mant = bits & 0x007fffff;
- int sh = 23 - exp;
-
- /* abs(value) >= 2^31 -> clamp. */
-
- if (exp >= 31)
- return (VGint)((sign < 0) ? 0x80000000u : 0x7fffffffu);
-
- /* abs(value) < 1 -> return -1 or 0. */
-
- if (exp < 0)
- return (sign < 0 && (exp > -127 || mant != 0)) ? -1 : 0;
-
- /* abs(value) >= 2^23 -> shift left. */
-
- mant |= 0x00800000;
- if (sh <= 0)
- return sign * (mant << -sh);
-
- /* Negative -> add a rounding term. */
-
- if (sign < 0)
- mant += (1 << sh) - 1;
-
- /* Shift right to obtain the result. */
-
- return sign * (mant >> sh);
-}
-
-
-struct matrix {
- VGfloat m[9];
-};
-
-static INLINE void matrix_init(struct matrix *mat,
- const VGfloat *val)
-{
- memcpy(mat->m, val, sizeof(VGfloat) * 9);
-}
-
-static INLINE void matrix_inits(struct matrix *mat,
- VGfloat m11, VGfloat m12, VGfloat m13,
- VGfloat m21, VGfloat m22, VGfloat m23,
- VGfloat m31, VGfloat m32, VGfloat m33)
-{
- mat->m[0] = m11; mat->m[1] = m12; mat->m[2] = m13;
- mat->m[3] = m21; mat->m[4] = m22; mat->m[5] = m23;
- mat->m[6] = m31; mat->m[7] = m32; mat->m[8] = m33;
-}
-
-static INLINE void matrix_load_identity(struct matrix *matrix)
-{
- static const VGfloat identity[9] = {1.f, 0.f, 0.f,
- 0.f, 1.f, 0.f,
- 0.f, 0.f, 1.f};
- memcpy(matrix->m, identity, sizeof(identity));
-}
-
-static INLINE VGboolean matrix_is_identity(struct matrix *matrix)
-{
- return floatsEqual(matrix->m[0], 1) && floatIsZero(matrix->m[1]) &&
- floatIsZero(matrix->m[2]) &&
- floatIsZero(matrix->m[3]) && floatsEqual(matrix->m[4], 1) &&
- floatIsZero(matrix->m[5]) &&
- floatIsZero(matrix->m[6]) && floatIsZero(matrix->m[7]) &&
- floatIsZero(matrix->m[8]);
-}
-
-static INLINE VGboolean matrix_is_affine(struct matrix *matrix)
-{
- return floatIsZero(matrix->m[2]) && floatIsZero(matrix->m[5])
- && floatsEqual(matrix->m[8], 1);
-}
-
-
-static INLINE void matrix_make_affine(struct matrix *matrix)
-{
- matrix->m[2] = 0.f;
- matrix->m[5] = 0.f;
- matrix->m[8] = 1.f;
-}
-
-static INLINE void matrix_mult(struct matrix *dst,
- const struct matrix *src)
-{
- VGfloat m11 = dst->m[0]*src->m[0] + dst->m[3]*src->m[1] + dst->m[6]*src->m[2];
- VGfloat m12 = dst->m[0]*src->m[3] + dst->m[3]*src->m[4] + dst->m[6]*src->m[5];
- VGfloat m13 = dst->m[0]*src->m[6] + dst->m[3]*src->m[7] + dst->m[6]*src->m[8];
-
- VGfloat m21 = dst->m[1]*src->m[0] + dst->m[4]*src->m[1] + dst->m[7]*src->m[2];
- VGfloat m22 = dst->m[1]*src->m[3] + dst->m[4]*src->m[4] + dst->m[7]*src->m[5];
- VGfloat m23 = dst->m[1]*src->m[6] + dst->m[4]*src->m[7] + dst->m[7]*src->m[8];
-
- VGfloat m31 = dst->m[2]*src->m[0] + dst->m[5]*src->m[1] + dst->m[8]*src->m[2];
- VGfloat m32 = dst->m[2]*src->m[3] + dst->m[5]*src->m[4] + dst->m[8]*src->m[5];
- VGfloat m33 = dst->m[2]*src->m[6] + dst->m[5]*src->m[7] + dst->m[8]*src->m[8];
-
- dst->m[0] = m11; dst->m[1] = m21; dst->m[2] = m31;
- dst->m[3] = m12; dst->m[4] = m22; dst->m[5] = m32;
- dst->m[6] = m13; dst->m[7] = m23; dst->m[8] = m33;
-}
-
-
-static INLINE void matrix_map_point(struct matrix *mat,
- VGfloat x, VGfloat y,
- VGfloat *out_x, VGfloat *out_y)
-{
- /* to be able to do matrix_map_point(m, x, y, &x, &y) use
- * temporaries */
- VGfloat tmp_x = x, tmp_y = y;
-
- *out_x = mat->m[0]*tmp_x + mat->m[3]*tmp_y + mat->m[6];
- *out_y = mat->m[1]*tmp_x + mat->m[4]*tmp_y + mat->m[7];
- if (!matrix_is_affine(mat)) {
- VGfloat w = 1/(mat->m[2]*tmp_x + mat->m[5]*tmp_y + mat->m[8]);
- *out_x *= w;
- *out_y *= w;
- }
-}
-
-static INLINE void matrix_translate(struct matrix *dst,
- VGfloat tx, VGfloat ty)
-{
- if (!matrix_is_affine(dst)) {
- struct matrix trans_matrix;
- matrix_load_identity(&trans_matrix);
- trans_matrix.m[6] = tx;
- trans_matrix.m[7] = ty;
- matrix_mult(dst, &trans_matrix);
- } else {
- dst->m[6] += tx*dst->m[0] + ty*dst->m[3];
- dst->m[7] += ty*dst->m[4] + tx*dst->m[1];
- }
-}
-
-static INLINE void matrix_scale(struct matrix *dst,
- VGfloat sx, VGfloat sy)
-{
- if (!matrix_is_affine(dst)) {
- struct matrix scale_matrix;
- matrix_load_identity(&scale_matrix);
- scale_matrix.m[0] = sx;
- scale_matrix.m[4] = sy;
- matrix_mult(dst, &scale_matrix);
- } else {
- dst->m[0] *= sx; dst->m[1] *= sx;
- dst->m[3] *= sy; dst->m[4] *= sy;
- }
-}
-
-static INLINE void matrix_shear(struct matrix *dst,
- VGfloat shx, VGfloat shy)
-{
- struct matrix shear_matrix;
- matrix_load_identity(&shear_matrix);
- shear_matrix.m[1] = shy;
- shear_matrix.m[3] = shx;
- matrix_mult(dst, &shear_matrix);
-}
-
-static INLINE void matrix_rotate(struct matrix *dst,
- VGfloat angle)
-{
- struct matrix mat;
- float sin_val = 0;
- float cos_val = 0;
-
-
- if (floatsEqual(angle, 90) || floatsEqual(angle, -270))
- sin_val = 1.f;
- else if (floatsEqual(angle, 270) || floatsEqual(angle, -90))
- sin_val = -1.f;
- else if (floatsEqual(angle, 180))
- cos_val = -1.f;
- else {
- double radians = DEGREES_TO_RADIANS(angle);
- sin_val = (float) sin(radians);
- cos_val = (float) cos(radians);
- }
-
- if (!matrix_is_affine(dst)) {
- matrix_load_identity(&mat);
- mat.m[0] = cos_val; mat.m[1] = sin_val;
- mat.m[3] = -sin_val; mat.m[4] = cos_val;
-
- matrix_mult(dst, &mat);
- } else {
- VGfloat m11 = cos_val*dst->m[0] + sin_val*dst->m[3];
- VGfloat m12 = cos_val*dst->m[1] + sin_val*dst->m[4];
- VGfloat m21 = -sin_val*dst->m[0] + cos_val*dst->m[3];
- VGfloat m22 = -sin_val*dst->m[1] + cos_val*dst->m[4];
- dst->m[0] = m11; dst->m[1] = m12;
- dst->m[3] = m21; dst->m[4] = m22;
- }
-}
-
-
-static INLINE VGfloat matrix_determinant(struct matrix *mat)
-{
- return mat->m[0]*(mat->m[8]*mat->m[4]-mat->m[7]*mat->m[5]) -
- mat->m[3]*(mat->m[8]*mat->m[1]-mat->m[7]*mat->m[2])+
- mat->m[6]*(mat->m[5]*mat->m[1]-mat->m[4]*mat->m[2]);
-}
-
-
-static INLINE void matrix_adjoint(struct matrix *mat)
-{
- VGfloat h[9];
- h[0] = mat->m[4]*mat->m[8] - mat->m[5]*mat->m[7];
- h[3] = mat->m[5]*mat->m[6] - mat->m[3]*mat->m[8];
- h[6] = mat->m[3]*mat->m[7] - mat->m[4]*mat->m[6];
- h[1] = mat->m[2]*mat->m[7] - mat->m[1]*mat->m[8];
- h[4] = mat->m[0]*mat->m[8] - mat->m[2]*mat->m[6];
- h[7] = mat->m[1]*mat->m[6] - mat->m[0]*mat->m[7];
- h[2] = mat->m[1]*mat->m[5] - mat->m[2]*mat->m[4];
- h[5] = mat->m[2]*mat->m[3] - mat->m[0]*mat->m[5];
- h[8] = mat->m[0]*mat->m[4] - mat->m[1]*mat->m[3];
-
-
- memcpy(mat->m, h, sizeof(VGfloat) * 9);
-}
-
-static INLINE void matrix_divs(struct matrix *mat,
- VGfloat s)
-{
- mat->m[0] /= s;
- mat->m[1] /= s;
- mat->m[2] /= s;
- mat->m[3] /= s;
- mat->m[4] /= s;
- mat->m[5] /= s;
- mat->m[6] /= s;
- mat->m[7] /= s;
- mat->m[8] /= s;
-}
-
-static INLINE VGboolean matrix_invert(struct matrix *mat)
-{
- VGfloat det = matrix_determinant(mat);
-
- if (floatIsZero(det))
- return VG_FALSE;
-
- matrix_adjoint(mat);
- matrix_divs(mat, det);
- return VG_TRUE;
-}
-
-static INLINE VGboolean matrix_is_invertible(struct matrix *mat)
-{
- return !floatIsZero(matrix_determinant(mat));
-}
-
-
-static INLINE VGboolean matrix_square_to_quad(VGfloat dx0, VGfloat dy0,
- VGfloat dx1, VGfloat dy1,
- VGfloat dx3, VGfloat dy3,
- VGfloat dx2, VGfloat dy2,
- struct matrix *mat)
-{
- VGfloat ax = dx0 - dx1 + dx2 - dx3;
- VGfloat ay = dy0 - dy1 + dy2 - dy3;
-
- if (floatIsZero(ax) && floatIsZero(ay)) {
- /* affine case */
- matrix_inits(mat,
- dx1 - dx0, dy1 - dy0, 0,
- dx2 - dx1, dy2 - dy1, 0,
- dx0, dy0, 1);
- } else {
- VGfloat a, b, c, d, e, f, g, h;
- VGfloat ax1 = dx1 - dx2;
- VGfloat ax2 = dx3 - dx2;
- VGfloat ay1 = dy1 - dy2;
- VGfloat ay2 = dy3 - dy2;
-
- /* determinants */
- VGfloat gtop = ax * ay2 - ax2 * ay;
- VGfloat htop = ax1 * ay - ax * ay1;
- VGfloat bottom = ax1 * ay2 - ax2 * ay1;
-
- if (!bottom)
- return VG_FALSE;
-
- g = gtop / bottom;
- h = htop / bottom;
-
- a = dx1 - dx0 + g * dx1;
- b = dx3 - dx0 + h * dx3;
- c = dx0;
- d = dy1 - dy0 + g * dy1;
- e = dy3 - dy0 + h * dy3;
- f = dy0;
-
- matrix_inits(mat,
- a, d, g,
- b, e, h,
- c, f, 1.f);
- }
-
- return VG_TRUE;
-}
-
-static INLINE VGboolean matrix_quad_to_square(VGfloat sx0, VGfloat sy0,
- VGfloat sx1, VGfloat sy1,
- VGfloat sx2, VGfloat sy2,
- VGfloat sx3, VGfloat sy3,
- struct matrix *mat)
-{
- if (!matrix_square_to_quad(sx0, sy0, sx1, sy1,
- sx2, sy2, sx3, sy3,
- mat))
- return VG_FALSE;
-
- return matrix_invert(mat);
-}
-
-
-static INLINE VGboolean matrix_quad_to_quad(VGfloat dx0, VGfloat dy0,
- VGfloat dx1, VGfloat dy1,
- VGfloat dx2, VGfloat dy2,
- VGfloat dx3, VGfloat dy3,
- VGfloat sx0, VGfloat sy0,
- VGfloat sx1, VGfloat sy1,
- VGfloat sx2, VGfloat sy2,
- VGfloat sx3, VGfloat sy3,
- struct matrix *mat)
-{
- struct matrix sqr_to_qd;
-
- if (!matrix_square_to_quad(dx0, dy0, dx1, dy1,
- dx2, dy2, dx3, dy3,
- mat))
- return VG_FALSE;
-
- if (!matrix_quad_to_square(sx0, sy0, sx1, sy1,
- sx2, sy2, sx3, sy3,
- &sqr_to_qd))
- return VG_FALSE;
-
- matrix_mult(mat, &sqr_to_qd);
-
- return VG_TRUE;
-}
-
-
-static INLINE VGboolean null_line(const VGfloat *l)
-{
- return floatsEqual(l[0], l[2]) && floatsEqual(l[1], l[3]);
-}
-
-static INLINE void line_normal(float *l, float *norm)
-{
- norm[0] = l[0];
- norm[1] = l[1];
-
- norm[2] = l[0] + (l[3] - l[1]);
- norm[3] = l[1] - (l[2] - l[0]);
-}
-
-static INLINE void line_normalize(float *l)
-{
- float x = l[2] - l[0];
- float y = l[3] - l[1];
- float len = (float) sqrt(x*x + y*y);
- l[2] = l[0] + x/len;
- l[3] = l[1] + y/len;
-}
-
-static INLINE VGfloat line_length(VGfloat x1, VGfloat y1,
- VGfloat x2, VGfloat y2)
-{
- VGfloat x = x2 - x1;
- VGfloat y = y2 - y1;
- return (VGfloat) sqrt(x*x + y*y);
-}
-
-static INLINE VGfloat line_lengthv(const VGfloat *l)
-{
- VGfloat x = l[2] - l[0];
- VGfloat y = l[3] - l[1];
- return (VGfloat) sqrt(x*x + y*y);
-}
-
-
-static INLINE void line_point_at(float *l, float t, float *pt)
-{
- float dx = l[2] - l[0];
- float dy = l[3] - l[1];
-
- pt[0] = l[0] + dx * t;
- pt[1] = l[1] + dy * t;
-}
-
-static INLINE void vector_unit(float *vec)
-{
- float len = (float) sqrt(vec[0] * vec[0] + vec[1] * vec[1]);
- vec[0] /= len;
- vec[1] /= len;
-}
-
-static INLINE void line_normal_vector(float *line, float *vec)
-{
- VGfloat normal[4];
-
- line_normal(line, normal);
-
- vec[0] = normal[2] - normal[0];
- vec[1] = normal[3] - normal[1];
-
- vector_unit(vec);
-}
-
-#endif
diff --git a/src/gallium/state_trackers/vega/paint.c b/src/gallium/state_trackers/vega/paint.c
deleted file mode 100644
index fea9fc18e66..00000000000
--- a/src/gallium/state_trackers/vega/paint.c
+++ /dev/null
@@ -1,759 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "paint.h"
-
-#include "matrix.h"
-#include "image.h"
-
-#include "pipe/p_compiler.h"
-#include "util/u_inlines.h"
-
-#include "util/u_memory.h"
-#include "util/u_math.h"
-#include "util/u_sampler.h"
-
-#include "cso_cache/cso_context.h"
-
-struct vg_paint {
- struct vg_object base;
-
- VGPaintType type;
-
- struct {
- VGfloat color[4];
- VGint colori[4];
- } solid;
-
- struct {
- VGColorRampSpreadMode spread;
- VGuint color_data[1024];
- struct {
- VGfloat coords[4];
- VGint coordsi[4];
- } linear;
- struct {
- VGfloat vals[5];
- VGint valsi[5];
- } radial;
- struct pipe_sampler_view *sampler_view;
- struct pipe_sampler_state sampler;
-
- VGfloat *ramp_stops;
- VGint *ramp_stopsi;
- VGint num_stops;
-
- VGboolean color_ramps_premultiplied;
- } gradient;
-
- struct {
- struct pipe_sampler_view *sampler_view;
- VGTilingMode tiling_mode;
- struct pipe_sampler_state sampler;
- } pattern;
-
- /* XXX next 3 all unneded? */
- struct pipe_resource *cbuf;
- struct pipe_shader_state fs_state;
- void *fs;
-};
-
-static INLINE VGuint mix_pixels(VGuint p1, VGuint a, VGuint p2, VGuint b)
-{
- VGuint t = (p1 & 0xff00ff) * a + (p2 & 0xff00ff) * b;
- t >>= 8; t &= 0xff00ff;
-
- p1 = ((p1 >> 8) & 0xff00ff) * a + ((p2 >> 8) & 0xff00ff) * b;
- p1 &= 0xff00ff00; p1 |= t;
-
- return p1;
-}
-
-static INLINE VGuint float4_to_argb(const VGfloat *clr)
-{
- return float_to_ubyte(clr[3]) << 24 |
- float_to_ubyte(clr[0]) << 16 |
- float_to_ubyte(clr[1]) << 8 |
- float_to_ubyte(clr[2]) << 0;
-}
-
-static INLINE void create_gradient_data(const VGfloat *ramp_stops,
- VGint num,
- VGuint *data,
- VGint size)
-{
- VGint i;
- VGint pos = 0;
- VGfloat fpos = 0, incr = 1.f / size;
- VGuint last_color;
-
- while (fpos < ramp_stops[0]) {
- data[pos] = float4_to_argb(ramp_stops + 1);
- fpos += incr;
- ++pos;
- }
-
- for (i = 0; i < num - 1; ++i) {
- VGint rcur = 5 * i;
- VGint rnext = 5 * (i + 1);
- VGfloat delta = 1.f/(ramp_stops[rnext] - ramp_stops[rcur]);
- while (fpos < ramp_stops[rnext] && pos < size) {
- VGint dist = 256 * ((fpos - ramp_stops[rcur]) * delta);
- VGint idist = 256 - dist;
- VGuint current_color = float4_to_argb(ramp_stops + rcur + 1);
- VGuint next_color = float4_to_argb(ramp_stops + rnext + 1);
- data[pos] = mix_pixels(current_color, idist,
- next_color, dist);
- fpos += incr;
- ++pos;
- }
- }
-
- last_color = float4_to_argb(ramp_stops + ((num - 1) * 5 + 1));
- while (pos < size) {
- data[pos] = last_color;
- ++pos;
- }
- data[size-1] = last_color;
-}
-
-static INLINE struct pipe_resource *create_gradient_texture(struct vg_paint *p)
-{
- struct pipe_context *pipe = p->base.ctx->pipe;
- struct pipe_screen *screen = pipe->screen;
- struct pipe_resource *tex = 0;
- struct pipe_resource templ;
-
- memset(&templ, 0, sizeof(templ));
- templ.target = PIPE_TEXTURE_1D;
- templ.format = PIPE_FORMAT_B8G8R8A8_UNORM;
- templ.last_level = 0;
- templ.width0 = 1024;
- templ.height0 = 1;
- templ.depth0 = 1;
- templ.array_size = 1;
- templ.bind = PIPE_BIND_SAMPLER_VIEW;
-
- tex = screen->resource_create(screen, &templ);
-
- { /* upload color_data */
- struct pipe_transfer *transfer;
- void *map =
- pipe_transfer_map(p->base.ctx->pipe, tex, 0, 0,
- PIPE_TRANSFER_WRITE, 0, 0, 1024, 1,
- &transfer);
- memcpy(map, p->gradient.color_data, sizeof(VGint)*1024);
- pipe->transfer_unmap(pipe, transfer);
- }
-
- return tex;
-}
-
-static INLINE struct pipe_sampler_view *create_gradient_sampler_view(struct vg_paint *p)
-{
- struct pipe_context *pipe = p->base.ctx->pipe;
- struct pipe_resource *texture;
- struct pipe_sampler_view view_templ;
- struct pipe_sampler_view *view;
-
- texture = create_gradient_texture(p);
-
- if (!texture)
- return NULL;
-
- u_sampler_view_default_template(&view_templ, texture, texture->format);
- view = pipe->create_sampler_view(pipe, texture, &view_templ);
- /* want the texture to go away if the view is freed */
- pipe_resource_reference(&texture, NULL);
-
- return view;
-}
-
-struct vg_paint * paint_create(struct vg_context *ctx)
-{
- struct vg_paint *paint = CALLOC_STRUCT(vg_paint);
- const VGfloat default_color[] = {0.0f, 0.0f, 0.0f, 1.0f};
- const VGfloat def_ling[] = {0.0f, 0.0f, 1.0f, 0.0f};
- const VGfloat def_radg[] = {0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- vg_init_object(&paint->base, ctx, VG_OBJECT_PAINT);
- vg_context_add_object(ctx, &paint->base);
-
- paint->type = VG_PAINT_TYPE_COLOR;
- memcpy(paint->solid.color, default_color,
- 4 * sizeof(VGfloat));
- paint->gradient.spread = VG_COLOR_RAMP_SPREAD_PAD;
- memcpy(paint->gradient.linear.coords, def_ling,
- 4 * sizeof(VGfloat));
- memcpy(paint->gradient.radial.vals, def_radg,
- 5 * sizeof(VGfloat));
-
- paint->gradient.sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- paint->gradient.sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- paint->gradient.sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
- paint->gradient.sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
- paint->gradient.sampler.normalized_coords = 1;
-
- memcpy(&paint->pattern.sampler,
- &paint->gradient.sampler,
- sizeof(struct pipe_sampler_state));
-
- return paint;
-}
-
-void paint_destroy(struct vg_paint *paint)
-{
- struct vg_context *ctx = paint->base.ctx;
- pipe_sampler_view_reference(&paint->gradient.sampler_view, NULL);
- if (paint->pattern.sampler_view)
- pipe_sampler_view_reference(&paint->pattern.sampler_view, NULL);
- if (ctx) {
- vg_context_remove_object(ctx, &paint->base);
- vg_free_object(&paint->base);
- }
-
- free(paint->gradient.ramp_stopsi);
- free(paint->gradient.ramp_stops);
- FREE(paint);
-}
-
-void paint_set_color(struct vg_paint *paint,
- const VGfloat *color)
-{
- paint->solid.color[0] = color[0];
- paint->solid.color[1] = color[1];
- paint->solid.color[2] = color[2];
- paint->solid.color[3] = color[3];
-
- paint->solid.colori[0] = FLT_TO_INT(color[0]);
- paint->solid.colori[1] = FLT_TO_INT(color[1]);
- paint->solid.colori[2] = FLT_TO_INT(color[2]);
- paint->solid.colori[3] = FLT_TO_INT(color[3]);
-}
-
-static INLINE void paint_color_buffer(struct vg_paint *paint, void *buffer)
-{
- VGfloat *map = (VGfloat*)buffer;
- memcpy(buffer, paint->solid.color, 4 * sizeof(VGfloat));
- map[4] = 0.f;
- map[5] = 1.f;
- map[6] = 2.f;
- map[7] = 4.f;
-}
-
-static INLINE void paint_linear_gradient_buffer(struct vg_paint *paint,
- const struct matrix *inv,
- void *buffer)
-{
- VGfloat *map = (VGfloat*)buffer;
- VGfloat dd;
-
- map[0] = paint->gradient.linear.coords[2] - paint->gradient.linear.coords[0];
- map[1] = paint->gradient.linear.coords[3] - paint->gradient.linear.coords[1];
- dd = (map[0] * map[0] + map[1] * map[1]);
-
- map[2] = (dd > 0.0f) ? 1.f / dd : 0.f;
- map[3] = 1.f;
-
- map[4] = 0.f;
- map[5] = 1.f;
- map[6] = 2.f;
- map[7] = 4.f;
- {
- struct matrix mat;
- matrix_load_identity(&mat);
- /* VEGA_LINEAR_GRADIENT_SHADER expects the first point to be at (0, 0) */
- matrix_translate(&mat, -paint->gradient.linear.coords[0], -paint->gradient.linear.coords[1]);
- matrix_mult(&mat, inv);
-
- map[8] = mat.m[0]; map[9] = mat.m[3]; map[10] = mat.m[6]; map[11] = 0.f;
- map[12] = mat.m[1]; map[13] = mat.m[4]; map[14] = mat.m[7]; map[15] = 0.f;
- map[16] = mat.m[2]; map[17] = mat.m[5]; map[18] = mat.m[8]; map[19] = 0.f;
- }
-#if 0
- debug_printf("Coords (%f, %f, %f, %f)\n",
- map[0], map[1], map[2], map[3]);
-#endif
-}
-
-
-static INLINE void paint_radial_gradient_buffer(struct vg_paint *paint,
- const struct matrix *inv,
- void *buffer)
-{
- const VGfloat *center = &paint->gradient.radial.vals[0];
- const VGfloat *focal = &paint->gradient.radial.vals[2];
- VGfloat rr = paint->gradient.radial.vals[4];
- VGfloat *map = (VGfloat*)buffer;
- VGfloat dd, new_focal[2];
-
- rr *= rr;
-
- map[0] = center[0] - focal[0];
- map[1] = center[1] - focal[1];
- dd = map[0] * map[0] + map[1] * map[1];
-
- /* focal point must lie inside the circle */
- if (0.998f * rr < dd) {
- VGfloat scale;
-
- scale = (dd > 0.0f) ? sqrt(0.998f * rr / dd) : 0.0f;
- map[0] *= scale;
- map[1] *= scale;
-
- new_focal[0] = center[0] - map[0];
- new_focal[1] = center[1] - map[1];
- dd = map[0] * map[0] + map[1] * map[1];
- focal = new_focal;
- }
-
- map[2] = (rr > dd) ? rr - dd : 1.0f;
- map[3] = 1.f;
-
- map[4] = 0.f;
- map[5] = 1.f;
- map[6] = 2.f;
- map[7] = 4.f;
-
- {
- struct matrix mat;
- matrix_load_identity(&mat);
- matrix_translate(&mat, -focal[0], -focal[1]);
- matrix_mult(&mat, inv);
-
- map[8] = mat.m[0]; map[9] = mat.m[3]; map[10] = mat.m[6]; map[11] = 0.f;
- map[12] = mat.m[1]; map[13] = mat.m[4]; map[14] = mat.m[7]; map[15] = 0.f;
- map[16] = mat.m[2]; map[17] = mat.m[5]; map[18] = mat.m[8]; map[19] = 0.f;
- }
-
-#if 0
- debug_printf("Coords (%f, %f, %f, %f)\n",
- map[0], map[1], map[2], map[3]);
-#endif
-}
-
-
-static INLINE void paint_pattern_buffer(struct vg_paint *paint,
- const struct matrix *inv,
- void *buffer)
-{
- VGfloat *map = (VGfloat *)buffer;
- memcpy(map, paint->solid.color, 4 * sizeof(VGfloat));
-
- map[4] = 0.f;
- map[5] = 1.f;
- map[6] = paint->pattern.sampler_view->texture->width0;
- map[7] = paint->pattern.sampler_view->texture->height0;
- {
- struct matrix mat;
-
- memcpy(&mat, inv, sizeof(*inv));
-
- map[8] = mat.m[0]; map[9] = mat.m[3]; map[10] = mat.m[6]; map[11] = 0.f;
- map[12] = mat.m[1]; map[13] = mat.m[4]; map[14] = mat.m[7]; map[15] = 0.f;
- map[16] = mat.m[2]; map[17] = mat.m[5]; map[18] = mat.m[8]; map[19] = 0.f;
- }
-}
-
-void paint_set_type(struct vg_paint *paint, VGPaintType type)
-{
- paint->type = type;
-}
-
-void paint_set_ramp_stops(struct vg_paint *paint, const VGfloat *stops,
- int num)
-{
- const VGfloat default_stops[] = {0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
- VGint i;
- const VGint num_stops = num / 5;
- VGfloat last_coord;
-
- paint->gradient.num_stops = num;
- if (num) {
- free(paint->gradient.ramp_stops);
- paint->gradient.ramp_stops = malloc(sizeof(VGfloat)*num);
- memcpy(paint->gradient.ramp_stops, stops, sizeof(VGfloat)*num);
- } else
- return;
-
- /* stops must be in increasing order. the last stop is 1.0. if the
- * first one is bigger than 1 then the whole sequence is invalid*/
- if (stops[0] > 1) {
- stops = default_stops;
- num = 10;
- }
- last_coord = stops[0];
- for (i = 1; i < num_stops; ++i) {
- VGint idx = 5 * i;
- VGfloat coord = stops[idx];
- if (!floatsEqual(last_coord, coord) && coord < last_coord) {
- stops = default_stops;
- num = 10;
- break;
- }
- last_coord = coord;
- }
-
- create_gradient_data(stops, num / 5, paint->gradient.color_data,
- 1024);
-
- if (paint->gradient.sampler_view) {
- pipe_sampler_view_reference(&paint->gradient.sampler_view, NULL);
- paint->gradient.sampler_view = NULL;
- }
-
- paint->gradient.sampler_view = create_gradient_sampler_view(paint);
-}
-
-void paint_set_colori(struct vg_paint *p,
- VGuint rgba)
-{
- p->solid.color[0] = ((rgba >> 24) & 0xff) / 255.f;
- p->solid.color[1] = ((rgba >> 16) & 0xff) / 255.f;
- p->solid.color[2] = ((rgba >> 8) & 0xff) / 255.f;
- p->solid.color[3] = ((rgba >> 0) & 0xff) / 255.f;
-}
-
-VGuint paint_colori(struct vg_paint *p)
-{
-#define F2B(f) (float_to_ubyte(f))
-
- return ((F2B(p->solid.color[0]) << 24) |
- (F2B(p->solid.color[1]) << 16) |
- (F2B(p->solid.color[2]) << 8) |
- (F2B(p->solid.color[3]) << 0));
-#undef F2B
-}
-
-void paint_set_linear_gradient(struct vg_paint *paint,
- const VGfloat *coords)
-{
- memcpy(paint->gradient.linear.coords, coords, sizeof(VGfloat) * 4);
-}
-
-void paint_set_spread_mode(struct vg_paint *paint,
- VGint mode)
-{
- paint->gradient.spread = mode;
- switch(mode) {
- case VG_COLOR_RAMP_SPREAD_PAD:
- paint->gradient.sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- break;
- case VG_COLOR_RAMP_SPREAD_REPEAT:
- paint->gradient.sampler.wrap_s = PIPE_TEX_WRAP_REPEAT;
- break;
- case VG_COLOR_RAMP_SPREAD_REFLECT:
- paint->gradient.sampler.wrap_s = PIPE_TEX_WRAP_MIRROR_REPEAT;
- break;
- }
-}
-
-VGColorRampSpreadMode paint_spread_mode(struct vg_paint *paint)
-{
- return paint->gradient.spread;
-}
-
-void paint_set_radial_gradient(struct vg_paint *paint,
- const VGfloat *values)
-{
- memcpy(paint->gradient.radial.vals, values, sizeof(VGfloat) * 5);
-}
-
-void paint_set_pattern(struct vg_paint *paint,
- struct vg_image *img)
-{
- if (paint->pattern.sampler_view)
- pipe_sampler_view_reference(&paint->pattern.sampler_view, NULL);
-
- paint->pattern.sampler_view = NULL;
- pipe_sampler_view_reference(&paint->pattern.sampler_view,
- img->sampler_view);
-}
-
-void paint_set_pattern_tiling(struct vg_paint *paint,
- VGTilingMode mode)
-{
- paint->pattern.tiling_mode = mode;
-
- switch(mode) {
- case VG_TILE_FILL:
- paint->pattern.sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_BORDER;
- paint->pattern.sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_BORDER;
- break;
- case VG_TILE_PAD:
- paint->pattern.sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- paint->pattern.sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- break;
- case VG_TILE_REPEAT:
- paint->pattern.sampler.wrap_s = PIPE_TEX_WRAP_REPEAT;
- paint->pattern.sampler.wrap_t = PIPE_TEX_WRAP_REPEAT;
- break;
- case VG_TILE_REFLECT:
- paint->pattern.sampler.wrap_s = PIPE_TEX_WRAP_MIRROR_REPEAT;
- paint->pattern.sampler.wrap_t = PIPE_TEX_WRAP_MIRROR_REPEAT;
- break;
- default:
- debug_assert(!"Unknown tiling mode");
- }
-}
-
-void paint_get_color(struct vg_paint *paint,
- VGfloat *color)
-{
- color[0] = paint->solid.color[0];
- color[1] = paint->solid.color[1];
- color[2] = paint->solid.color[2];
- color[3] = paint->solid.color[3];
-}
-
-void paint_ramp_stops(struct vg_paint *paint, VGfloat *stops,
- int num)
-{
- memcpy(stops, paint->gradient.ramp_stops, sizeof(VGfloat)*num);
-}
-
-void paint_linear_gradient(struct vg_paint *paint,
- VGfloat *coords)
-{
- memcpy(coords, paint->gradient.linear.coords, sizeof(VGfloat)*4);
-}
-
-void paint_radial_gradient(struct vg_paint *paint,
- VGfloat *coords)
-{
- memcpy(coords, paint->gradient.radial.vals, sizeof(VGfloat)*5);
-}
-
-int paint_num_ramp_stops(struct vg_paint *paint)
-{
- return paint->gradient.num_stops;
-}
-
-VGPaintType paint_type(struct vg_paint *paint)
-{
- return paint->type;
-}
-
-void paint_set_coloriv(struct vg_paint *paint,
- const VGint *color)
-{
- paint->solid.color[0] = color[0];
- paint->solid.color[1] = color[1];
- paint->solid.color[2] = color[2];
- paint->solid.color[3] = color[3];
-
- paint->solid.colori[0] = color[0];
- paint->solid.colori[1] = color[1];
- paint->solid.colori[2] = color[2];
- paint->solid.colori[3] = color[3];
-}
-
-void paint_get_coloriv(struct vg_paint *paint,
- VGint *color)
-{
- color[0] = paint->solid.colori[0];
- color[1] = paint->solid.colori[1];
- color[2] = paint->solid.colori[2];
- color[3] = paint->solid.colori[3];
-}
-
-void paint_set_color_ramp_premultiplied(struct vg_paint *paint,
- VGboolean set)
-{
- paint->gradient.color_ramps_premultiplied = set;
-}
-
-VGboolean paint_color_ramp_premultiplied(struct vg_paint *paint)
-{
- return paint->gradient.color_ramps_premultiplied;
-}
-
-void paint_set_ramp_stopsi(struct vg_paint *paint, const VGint *stops,
- int num)
-{
- if (num) {
- free(paint->gradient.ramp_stopsi);
- paint->gradient.ramp_stopsi = malloc(sizeof(VGint)*num);
- memcpy(paint->gradient.ramp_stopsi, stops, sizeof(VGint)*num);
- }
-}
-
-void paint_ramp_stopsi(struct vg_paint *paint, VGint *stops,
- int num)
-{
- memcpy(stops, paint->gradient.ramp_stopsi, sizeof(VGint)*num);
-}
-
-void paint_set_linear_gradienti(struct vg_paint *paint,
- const VGint *coords)
-{
- memcpy(paint->gradient.linear.coordsi, coords, sizeof(VGint) * 4);
-}
-
-void paint_linear_gradienti(struct vg_paint *paint,
- VGint *coords)
-{
- memcpy(coords, paint->gradient.linear.coordsi, sizeof(VGint)*4);
-}
-
-void paint_set_radial_gradienti(struct vg_paint *paint,
- const VGint *values)
-{
- memcpy(paint->gradient.radial.valsi, values, sizeof(VGint) * 5);
-}
-
-void paint_radial_gradienti(struct vg_paint *paint,
- VGint *coords)
-{
- memcpy(coords, paint->gradient.radial.valsi, sizeof(VGint)*5);
-}
-
-VGTilingMode paint_pattern_tiling(struct vg_paint *paint)
-{
- return paint->pattern.tiling_mode;
-}
-
-VGint paint_bind_samplers(struct vg_paint *paint, struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **sampler_views)
-{
- struct vg_context *ctx = vg_current_context();
-
- switch(paint->type) {
- case VG_PAINT_TYPE_LINEAR_GRADIENT:
- case VG_PAINT_TYPE_RADIAL_GRADIENT: {
- if (paint->gradient.sampler_view) {
- paint->gradient.sampler.min_img_filter = image_sampler_filter(ctx);
- paint->gradient.sampler.mag_img_filter = image_sampler_filter(ctx);
- samplers[0] = &paint->gradient.sampler;
- sampler_views[0] = paint->gradient.sampler_view;
- return 1;
- }
- }
- break;
- case VG_PAINT_TYPE_PATTERN: {
- memcpy(paint->pattern.sampler.border_color.f,
- ctx->state.vg.tile_fill_color,
- sizeof(VGfloat) * 4);
- paint->pattern.sampler.min_img_filter = image_sampler_filter(ctx);
- paint->pattern.sampler.mag_img_filter = image_sampler_filter(ctx);
- samplers[0] = &paint->pattern.sampler;
- sampler_views[0] = paint->pattern.sampler_view;
- return 1;
- }
- break;
- default:
- break;
- }
- return 0;
-}
-
-void paint_resolve_type(struct vg_paint *paint)
-{
- if (paint->type == VG_PAINT_TYPE_PATTERN &&
- !paint->pattern.sampler_view) {
- paint->type = VG_PAINT_TYPE_COLOR;
- }
-}
-
-VGboolean paint_is_degenerate(struct vg_paint *paint)
-{
- VGboolean degen;
- VGfloat *vals;
-
-
- switch (paint->type) {
- case VG_PAINT_TYPE_LINEAR_GRADIENT:
- vals = paint->gradient.linear.coords;
- /* two points are coincident */
- degen = (floatsEqual(vals[0], vals[2]) &&
- floatsEqual(vals[1], vals[3]));
- break;
- case VG_PAINT_TYPE_RADIAL_GRADIENT:
- vals = paint->gradient.radial.vals;
- /* radius <= 0 */
- degen = (vals[4] <= 0.0f);
- break;
- case VG_PAINT_TYPE_COLOR:
- case VG_PAINT_TYPE_PATTERN:
- default:
- degen = VG_FALSE;
- break;
- }
-
- return degen;
-}
-
-VGint paint_constant_buffer_size(struct vg_paint *paint)
-{
- switch(paint->type) {
- case VG_PAINT_TYPE_COLOR:
- return 8 * sizeof(VGfloat);/*4 color + 4 constants (0.f,1.f,2.f,4.f)*/
- break;
- case VG_PAINT_TYPE_LINEAR_GRADIENT:
- return 20 * sizeof(VGfloat);
- break;
- case VG_PAINT_TYPE_RADIAL_GRADIENT:
- return 20 * sizeof(VGfloat);
- break;
- case VG_PAINT_TYPE_PATTERN:
- return 20 * sizeof(VGfloat);
- break;
- default:
- debug_printf("Uknown paint type: %d\n", paint->type);
- }
-
- return 0;
-}
-
-void paint_fill_constant_buffer(struct vg_paint *paint,
- const struct matrix *mat,
- void *buffer)
-{
- switch(paint->type) {
- case VG_PAINT_TYPE_COLOR:
- paint_color_buffer(paint, buffer);
- break;
- case VG_PAINT_TYPE_LINEAR_GRADIENT:
- paint_linear_gradient_buffer(paint, mat, buffer);
- break;
- case VG_PAINT_TYPE_RADIAL_GRADIENT:
- paint_radial_gradient_buffer(paint, mat, buffer);
- break;
- case VG_PAINT_TYPE_PATTERN:
- paint_pattern_buffer(paint, mat, buffer);
- break;
-
- default:
- abort();
- }
-}
-
-VGboolean paint_is_opaque(struct vg_paint *paint)
-{
- /* TODO add other paint types and make sure PAINT_DIRTY gets set */
- return (paint->type == VG_PAINT_TYPE_COLOR &&
- floatsEqual(paint->solid.color[3], 1.0f));
-}
diff --git a/src/gallium/state_trackers/vega/paint.h b/src/gallium/state_trackers/vega/paint.h
deleted file mode 100644
index e5357763b89..00000000000
--- a/src/gallium/state_trackers/vega/paint.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef PAINT_H
-#define PAINT_H
-
-#include "vg_context.h"
-
-#include "VG/openvg.h"
-#include "pipe/p_state.h"
-
-struct vg_paint;
-struct vg_image;
-struct pipe_sampler_state;
-struct pipe_resource;
-
-struct vg_paint *paint_create(struct vg_context *ctx);
-void paint_destroy(struct vg_paint *paint);
-
-void paint_set_color(struct vg_paint *paint,
- const VGfloat *color);
-void paint_get_color(struct vg_paint *paint,
- VGfloat *color);
-
-void paint_set_coloriv(struct vg_paint *paint,
- const VGint *color);
-void paint_get_coloriv(struct vg_paint *paint,
- VGint *color);
-
-void paint_set_colori(struct vg_paint *paint,
- VGuint rgba);
-
-VGuint paint_colori(struct vg_paint *paint);
-
-void paint_set_type(struct vg_paint *paint, VGPaintType type);
-VGPaintType paint_type(struct vg_paint *paint);
-void paint_resolve_type(struct vg_paint *paint);
-
-void paint_set_linear_gradient(struct vg_paint *paint,
- const VGfloat *coords);
-void paint_linear_gradient(struct vg_paint *paint,
- VGfloat *coords);
-void paint_set_linear_gradienti(struct vg_paint *paint,
- const VGint *coords);
-void paint_linear_gradienti(struct vg_paint *paint,
- VGint *coords);
-
-
-void paint_set_radial_gradient(struct vg_paint *paint,
- const VGfloat *values);
-void paint_radial_gradient(struct vg_paint *paint,
- VGfloat *coords);
-void paint_set_radial_gradienti(struct vg_paint *paint,
- const VGint *values);
-void paint_radial_gradienti(struct vg_paint *paint,
- VGint *coords);
-
-
-void paint_set_ramp_stops(struct vg_paint *paint, const VGfloat *stops,
- int num);
-void paint_ramp_stops(struct vg_paint *paint, VGfloat *stops,
- int num);
-
-void paint_set_ramp_stopsi(struct vg_paint *paint, const VGint *stops,
- int num);
-void paint_ramp_stopsi(struct vg_paint *paint, VGint *stops,
- int num);
-
-int paint_num_ramp_stops(struct vg_paint *paint);
-
-void paint_set_spread_mode(struct vg_paint *paint,
- VGint mode);
-VGColorRampSpreadMode paint_spread_mode(struct vg_paint *paint);
-
-
-void paint_set_pattern(struct vg_paint *paint,
- struct vg_image *img);
-void paint_set_pattern_tiling(struct vg_paint *paint,
- VGTilingMode mode);
-VGTilingMode paint_pattern_tiling(struct vg_paint *paint);
-
-void paint_set_color_ramp_premultiplied(struct vg_paint *paint,
- VGboolean set);
-VGboolean paint_color_ramp_premultiplied(struct vg_paint *paint);
-
-
-VGint paint_bind_samplers(struct vg_paint *paint, struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **sampler_views);
-
-VGboolean paint_is_degenerate(struct vg_paint *paint);
-
-VGint paint_constant_buffer_size(struct vg_paint *paint);
-
-void paint_fill_constant_buffer(struct vg_paint *paint,
- const struct matrix *mat,
- void *buffer);
-
-VGboolean paint_is_opaque(struct vg_paint *paint);
-
-#endif
diff --git a/src/gallium/state_trackers/vega/path.c b/src/gallium/state_trackers/vega/path.c
deleted file mode 100644
index 6448e642cd6..00000000000
--- a/src/gallium/state_trackers/vega/path.c
+++ /dev/null
@@ -1,2077 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "path.h"
-
-#include "stroker.h"
-#include "polygon.h"
-#include "bezier.h"
-#include "matrix.h"
-#include "vg_context.h"
-#include "util_array.h"
-#include "arc.h"
-#include "path_utils.h"
-#include "paint.h"
-#include "shader.h"
-
-#include "util/u_memory.h"
-
-#include <assert.h>
-
-#define DEBUG_PATH 0
-
-struct path {
- struct vg_object base;
- VGbitfield caps;
- VGboolean dirty;
- VGboolean dirty_stroke;
-
- VGPathDatatype datatype;
-
- VGfloat scale;
- VGfloat bias;
-
- VGint num_segments;
-
- struct array * segments;
- struct array * control_points;
-
- struct {
- struct polygon_array polygon_array;
- struct matrix matrix;
- } fill_polys;
-
- struct {
- struct path *path;
- struct matrix matrix;
- VGfloat stroke_width;
- VGfloat miter_limit;
- VGCapStyle cap_style;
- VGJoinStyle join_style;
- } stroked;
-};
-
-
-static INLINE void data_at(void **data,
- struct path *p,
- VGint start, VGint count,
- VGfloat *out)
-{
- VGPathDatatype dt = p->datatype;
- VGint i;
- VGint end = start + count;
- VGfloat *itr = out;
-
- switch(dt) {
- case VG_PATH_DATATYPE_S_8: {
- VGbyte **bdata = (VGbyte **)data;
- for (i = start; i < end; ++i) {
- *itr = (*bdata)[i];
- ++itr;
- }
- *bdata += count;
- }
- break;
- case VG_PATH_DATATYPE_S_16: {
- VGshort **bdata = (VGshort **)data;
- for (i = start; i < end; ++i) {
- *itr = (*bdata)[i];
- ++itr;
- }
- *bdata += count;
- }
- break;
- case VG_PATH_DATATYPE_S_32: {
- VGint **bdata = (VGint **)data;
- for (i = start; i < end; ++i) {
- *itr = (*bdata)[i];
- ++itr;
- }
- *bdata += count;
- }
- break;
- case VG_PATH_DATATYPE_F: {
- VGfloat **fdata = (VGfloat **)data;
- for (i = start; i < end; ++i) {
- *itr = (*fdata)[i];
- ++itr;
- }
- *fdata += count;
- }
- break;
- default:
- debug_assert(!"Unknown path datatype!");
- }
-}
-
-
-void vg_float_to_datatype(VGPathDatatype datatype,
- VGubyte *common_data,
- const VGfloat *data,
- VGint num_coords)
-{
- VGint i;
- switch(datatype) {
- case VG_PATH_DATATYPE_S_8: {
- for (i = 0; i < num_coords; ++i) {
- common_data[i] = (VGubyte)data[i];
- }
- }
- break;
- case VG_PATH_DATATYPE_S_16: {
- VGshort *buf = (VGshort*)common_data;
- for (i = 0; i < num_coords; ++i) {
- buf[i] = (VGshort)data[i];
- }
- }
- break;
- case VG_PATH_DATATYPE_S_32: {
- VGint *buf = (VGint*)common_data;
- for (i = 0; i < num_coords; ++i) {
- buf[i] = (VGint)data[i];
- }
- }
- break;
- case VG_PATH_DATATYPE_F: {
- memcpy(common_data, data, sizeof(VGfloat) * num_coords);
- }
- break;
- default:
- debug_assert(!"Unknown path datatype!");
- }
-}
-
-static void coords_adjust_by_scale_bias(struct path *p,
- void *pdata, VGint num_coords,
- VGfloat scale, VGfloat bias,
- VGPathDatatype datatype)
-{
- VGfloat data[8];
- void *coords = (VGfloat *)pdata;
- VGubyte *common_data = (VGubyte *)pdata;
- VGint size_dst = size_for_datatype(datatype);
- VGint i;
-
- for (i = 0; i < num_coords; ++i) {
- data_at(&coords, p, 0, 1, data);
- data[0] = data[0] * scale + bias;
- vg_float_to_datatype(datatype, common_data, data, 1);
- common_data += size_dst;
- }
-}
-
-struct path * path_create(VGPathDatatype dt, VGfloat scale, VGfloat bias,
- VGint segmentCapacityHint,
- VGint coordCapacityHint,
- VGbitfield capabilities)
-{
- struct path *path = CALLOC_STRUCT(path);
-
- vg_init_object(&path->base, vg_current_context(), VG_OBJECT_PATH);
- path->caps = capabilities & VG_PATH_CAPABILITY_ALL;
- vg_context_add_object(vg_current_context(), &path->base);
-
- path->datatype = dt;
- path->scale = scale;
- path->bias = bias;
-
- path->segments = array_create(size_for_datatype(VG_PATH_DATATYPE_S_8));
- path->control_points = array_create(size_for_datatype(dt));
-
- path->dirty = VG_TRUE;
- path->dirty_stroke = VG_TRUE;
-
- return path;
-}
-
-static void polygon_array_cleanup(struct polygon_array *polyarray)
-{
- if (polyarray->array) {
- VGint i;
-
- for (i = 0; i < polyarray->array->num_elements; i++) {
- struct polygon *p = ((struct polygon **) polyarray->array->data)[i];
- polygon_destroy(p);
- }
-
- array_destroy(polyarray->array);
- polyarray->array = NULL;
- }
-}
-
-void path_destroy(struct path *p)
-{
- vg_context_remove_object(vg_current_context(), &p->base);
-
- array_destroy(p->segments);
- array_destroy(p->control_points);
-
- polygon_array_cleanup(&p->fill_polys.polygon_array);
-
- if (p->stroked.path)
- path_destroy(p->stroked.path);
-
- vg_free_object(&p->base);
-
- FREE(p);
-}
-
-VGbitfield path_capabilities(struct path *p)
-{
- return p->caps;
-}
-
-void path_set_capabilities(struct path *p, VGbitfield bf)
-{
- p->caps = (bf & VG_PATH_CAPABILITY_ALL);
-}
-
-void path_append_data(struct path *p,
- VGint numSegments,
- const VGubyte * pathSegments,
- const void * pathData)
-{
- VGint old_segments = p->num_segments;
- VGint num_new_coords = num_elements_for_segments(pathSegments, numSegments);
- array_append_data(p->segments, pathSegments, numSegments);
- array_append_data(p->control_points, pathData, num_new_coords);
-
- p->num_segments += numSegments;
- if (!floatsEqual(p->scale, 1.f) || !floatsEqual(p->bias, 0.f)) {
- VGubyte *coords = (VGubyte*)p->control_points->data;
- coords_adjust_by_scale_bias(p,
- coords + old_segments * p->control_points->datatype_size,
- num_new_coords,
- p->scale, p->bias, p->datatype);
- }
- p->dirty = VG_TRUE;
- p->dirty_stroke = VG_TRUE;
-}
-
-VGint path_num_segments(struct path *p)
-{
- return p->num_segments;
-}
-
-static INLINE void map_if_relative(VGfloat ox, VGfloat oy,
- VGboolean relative,
- VGfloat *x, VGfloat *y)
-{
- if (relative) {
- if (x)
- *x += ox;
- if (y)
- *y += oy;
- }
-}
-
-static INLINE void close_polygon(struct polygon *current,
- VGfloat sx, VGfloat sy,
- VGfloat ox, VGfloat oy,
- struct matrix *matrix)
-{
- if (!floatsEqual(sx, ox) ||
- !floatsEqual(sy, oy)) {
- VGfloat x0 = sx;
- VGfloat y0 = sy;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- polygon_vertex_append(current, x0, y0);
- }
-}
-
-static void convert_path(struct path *p,
- VGPathDatatype to,
- void *dst,
- VGint num_coords)
-{
- VGfloat data[8];
- void *coords = (VGfloat *)p->control_points->data;
- VGubyte *common_data = (VGubyte *)dst;
- VGint size_dst = size_for_datatype(to);
- VGint i;
-
- for (i = 0; i < num_coords; ++i) {
- data_at(&coords, p, 0, 1, data);
- vg_float_to_datatype(to, common_data, data, 1);
- common_data += size_dst;
- }
-}
-
-static void polygon_array_calculate_bounds( struct polygon_array *polyarray )
-{
- struct array *polys = polyarray->array;
- VGfloat min_x, max_x;
- VGfloat min_y, max_y;
- VGfloat bounds[4];
- unsigned i;
-
- assert(polys);
-
- if (!polys->num_elements) {
- polyarray->min_x = 0.0f;
- polyarray->min_y = 0.0f;
- polyarray->max_x = 0.0f;
- polyarray->max_y = 0.0f;
- return;
- }
-
- polygon_bounding_rect((((struct polygon**)polys->data)[0]), bounds);
- min_x = bounds[0];
- min_y = bounds[1];
- max_x = bounds[0] + bounds[2];
- max_y = bounds[1] + bounds[3];
- for (i = 1; i < polys->num_elements; ++i) {
- struct polygon *p = (((struct polygon**)polys->data)[i]);
- polygon_bounding_rect(p, bounds);
- min_x = MIN2(min_x, bounds[0]);
- min_y = MIN2(min_y, bounds[1]);
- max_x = MAX2(max_x, bounds[0] + bounds[2]);
- max_y = MAX2(max_y, bounds[1] + bounds[3]);
- }
-
- polyarray->min_x = min_x;
- polyarray->min_y = min_y;
- polyarray->max_x = max_x;
- polyarray->max_y = max_y;
-}
-
-
-static struct polygon_array * path_get_fill_polygons(struct path *p, struct matrix *matrix)
-{
- VGint i;
- struct polygon *current = 0;
- VGfloat sx, sy, px, py, ox, oy;
- VGfloat x0, y0, x1, y1, x2, y2, x3, y3;
- VGfloat data[8];
- void *coords = (VGfloat *)p->control_points->data;
- struct array *array;
-
- memset(data, 0, sizeof(data));
-
- if (p->fill_polys.polygon_array.array)
- {
- if (memcmp( &p->fill_polys.matrix,
- matrix,
- sizeof *matrix ) == 0 && p->dirty == VG_FALSE)
- {
- return &p->fill_polys.polygon_array;
- }
- else {
- polygon_array_cleanup(&p->fill_polys.polygon_array);
- }
- }
-
- /* an array of pointers to polygons */
- array = array_create(sizeof(struct polygon *));
-
- sx = sy = px = py = ox = oy = 0.f;
-
- if (p->num_segments)
- current = polygon_create(32);
-
- for (i = 0; i < p->num_segments; ++i) {
- VGubyte segment = ((VGubyte*)(p->segments->data))[i];
- VGint command = SEGMENT_COMMAND(segment);
- VGboolean relative = SEGMENT_ABS_REL(segment);
-
- switch(command) {
- case VG_CLOSE_PATH:
- close_polygon(current, sx, sy, ox, oy, matrix);
- ox = sx;
- oy = sy;
- break;
- case VG_MOVE_TO:
- if (current && polygon_vertex_count(current) > 0) {
- /* add polygon */
- close_polygon(current, sx, sy, ox, oy, matrix);
- array_append_data(array, &current, 1);
- current = polygon_create(32);
- }
- data_at(&coords, p, 0, 2, data);
- x0 = data[0];
- y0 = data[1];
- map_if_relative(ox, oy, relative, &x0, &y0);
- sx = x0;
- sy = y0;
- ox = x0;
- oy = y0;
- px = x0;
- py = y0;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- polygon_vertex_append(current, x0, y0);
- break;
- case VG_LINE_TO:
- data_at(&coords, p, 0, 2, data);
- x0 = data[0];
- y0 = data[1];
- map_if_relative(ox, oy, relative, &x0, &y0);
- ox = x0;
- oy = y0;
- px = x0;
- py = y0;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- polygon_vertex_append(current, x0, y0);
- break;
- case VG_HLINE_TO:
- data_at(&coords, p, 0, 1, data);
- x0 = data[0];
- y0 = oy;
- map_if_relative(ox, oy, relative, &x0, 0);
- ox = x0;
- px = x0;
- py = y0;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- polygon_vertex_append(current, x0, y0);
- break;
- case VG_VLINE_TO:
- data_at(&coords, p, 0, 1, data);
- x0 = ox;
- y0 = data[0];
- map_if_relative(ox, oy, relative, 0, &y0);
- oy = y0;
- px = x0;
- py = y0;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- polygon_vertex_append(current, x0, y0);
- break;
- case VG_CUBIC_TO: {
- struct bezier bezier;
- data_at(&coords, p, 0, 6, data);
- x0 = ox;
- y0 = oy;
- x1 = data[0];
- y1 = data[1];
- x2 = data[2];
- y2 = data[3];
- x3 = data[4];
- y3 = data[5];
- map_if_relative(ox, oy, relative, &x1, &y1);
- map_if_relative(ox, oy, relative, &x2, &y2);
- map_if_relative(ox, oy, relative, &x3, &y3);
- ox = x3;
- oy = y3;
- px = x2;
- py = y2;
- assert(matrix_is_affine(matrix));
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- matrix_map_point(matrix, x1, y1, &x1, &y1);
- matrix_map_point(matrix, x2, y2, &x2, &y2);
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- bezier_init(&bezier, x0, y0, x1, y1,
- x2, y2, x3, y3);
- bezier_add_to_polygon(&bezier, current);
- }
- break;
- case VG_QUAD_TO: {
- struct bezier bezier;
- data_at(&coords, p, 0, 4, data);
- x0 = ox;
- y0 = oy;
- x1 = data[0];
- y1 = data[1];
- x3 = data[2];
- y3 = data[3];
- map_if_relative(ox, oy, relative, &x1, &y1);
- map_if_relative(ox, oy, relative, &x3, &y3);
- px = x1;
- py = y1;
- { /* form a cubic out of it */
- x2 = (x3 + 2*x1) / 3.f;
- y2 = (y3 + 2*y1) / 3.f;
- x1 = (x0 + 2*x1) / 3.f;
- y1 = (y0 + 2*y1) / 3.f;
- }
- ox = x3;
- oy = y3;
- assert(matrix_is_affine(matrix));
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- matrix_map_point(matrix, x1, y1, &x1, &y1);
- matrix_map_point(matrix, x2, y2, &x2, &y2);
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- bezier_init(&bezier, x0, y0, x1, y1,
- x2, y2, x3, y3);
- bezier_add_to_polygon(&bezier, current);
- }
- break;
- case VG_SQUAD_TO: {
- struct bezier bezier;
- data_at(&coords, p, 0, 2, data);
- x0 = ox;
- y0 = oy;
- x1 = 2*ox-px;
- y1 = 2*oy-py;
- x3 = data[0];
- y3 = data[1];
- map_if_relative(ox, oy, relative, &x3, &y3);
- px = x1;
- py = y1;
- { /* form a cubic out of it */
- x2 = (x3 + 2*x1) / 3.f;
- y2 = (y3 + 2*y1) / 3.f;
- x1 = (x0 + 2*x1) / 3.f;
- y1 = (y0 + 2*y1) / 3.f;
- }
- ox = x3;
- oy = y3;
- assert(matrix_is_affine(matrix));
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- matrix_map_point(matrix, x1, y1, &x1, &y1);
- matrix_map_point(matrix, x2, y2, &x2, &y2);
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- bezier_init(&bezier, x0, y0, x1, y1,
- x2, y2, x3, y3);
- bezier_add_to_polygon(&bezier, current);
- }
- break;
- case VG_SCUBIC_TO: {
- struct bezier bezier;
- data_at(&coords, p, 0, 4, data);
- x0 = ox;
- y0 = oy;
- x1 = 2*ox-px;
- y1 = 2*oy-py;
- x2 = data[0];
- y2 = data[1];
- x3 = data[2];
- y3 = data[3];
- map_if_relative(ox, oy, relative, &x2, &y2);
- map_if_relative(ox, oy, relative, &x3, &y3);
- ox = x3;
- oy = y3;
- px = x2;
- py = y2;
- assert(matrix_is_affine(matrix));
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- matrix_map_point(matrix, x1, y1, &x1, &y1);
- matrix_map_point(matrix, x2, y2, &x2, &y2);
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- bezier_init(&bezier, x0, y0, x1, y1,
- x2, y2, x3, y3);
- bezier_add_to_polygon(&bezier, current);
- }
- break;
- case VG_SCCWARC_TO:
- case VG_SCWARC_TO:
- case VG_LCCWARC_TO:
- case VG_LCWARC_TO: {
- VGfloat rh, rv, rot;
- struct arc arc;
-
- data_at(&coords, p, 0, 5, data);
- x0 = ox;
- y0 = oy;
- rh = data[0];
- rv = data[1];
- rot = data[2];
- x1 = data[3];
- y1 = data[4];
- map_if_relative(ox, oy, relative, &x1, &y1);
-#if 0
- debug_printf("------- ARC (%f, %f), (%f, %f) %f, %f, %f\n",
- x0, y0, x1, y1, rh, rv, rot);
-#endif
- arc_init(&arc, command, x0, y0, x1, y1,
- rh, rv, rot);
- arc_add_to_polygon(&arc, current,
- matrix);
- ox = x1;
- oy = y1;
- px = x1;
- py = y1;
- }
- break;
- default:
- abort();
- assert(!"Unknown segment!");
- }
- }
- if (current) {
- if (polygon_vertex_count(current) > 0) {
- close_polygon(current, sx, sy, ox, oy, matrix);
- array_append_data(array, &current, 1);
- } else
- polygon_destroy(current);
- }
-
- p->fill_polys.polygon_array.array = array;
- p->fill_polys.matrix = *matrix;
-
- polygon_array_calculate_bounds( &p->fill_polys.polygon_array );
-
- p->dirty = VG_FALSE;
-
- return &p->fill_polys.polygon_array;
-}
-
-VGbyte path_datatype_size(struct path *p)
-{
- return size_for_datatype(p->datatype);
-}
-
-VGPathDatatype path_datatype(struct path *p)
-{
- return p->datatype;
-}
-
-VGfloat path_scale(struct path *p)
-{
- return p->scale;
-}
-
-VGfloat path_bias(struct path *p)
-{
- return p->bias;
-}
-
-VGint path_num_coords(struct path *p)
-{
- return num_elements_for_segments((VGubyte*)p->segments->data,
- p->num_segments);
-}
-
-void path_modify_coords(struct path *p,
- VGint startIndex,
- VGint numSegments,
- const void * pathData)
-{
- VGubyte *segments = (VGubyte*)(p->segments->data);
- VGint count = num_elements_for_segments(&segments[startIndex], numSegments);
- VGint start_cp = num_elements_for_segments(segments, startIndex);
-
- array_change_data(p->control_points, pathData, start_cp, count);
- coords_adjust_by_scale_bias(p,
- ((VGubyte*)p->control_points->data) +
- (startIndex * p->control_points->datatype_size),
- path_num_coords(p),
- p->scale, p->bias, p->datatype);
- p->dirty = VG_TRUE;
- p->dirty_stroke = VG_TRUE;
-}
-
-void path_for_each_segment(struct path *path,
- path_for_each_cb cb,
- void *user_data)
-{
- VGint i;
- struct path_for_each_data p;
- VGfloat data[8];
- void *coords = (VGfloat *)path->control_points->data;
-
- p.coords = data;
- p.sx = p.sy = p.px = p.py = p.ox = p.oy = 0.f;
- p.user_data = user_data;
-
- for (i = 0; i < path->num_segments; ++i) {
- VGint command;
- VGboolean relative;
-
- p.segment = ((VGubyte*)(path->segments->data))[i];
- command = SEGMENT_COMMAND(p.segment);
- relative = SEGMENT_ABS_REL(p.segment);
-
- switch(command) {
- case VG_CLOSE_PATH:
- cb(path, &p);
- break;
- case VG_MOVE_TO:
- data_at(&coords, path, 0, 2, data);
- map_if_relative(p.ox, p.oy, relative, &data[0], &data[1]);
- cb(path, &p);
- p.sx = data[0];
- p.sy = data[1];
- p.ox = data[0];
- p.oy = data[1];
- p.px = data[0];
- p.py = data[1];
- break;
- case VG_LINE_TO:
- data_at(&coords, path, 0, 2, data);
- map_if_relative(p.ox, p.oy, relative, &data[0], &data[1]);
- cb(path, &p);
- p.ox = data[0];
- p.oy = data[1];
- p.px = data[0];
- p.py = data[1];
- break;
- case VG_HLINE_TO:
- data_at(&coords, path, 0, 1, data);
- map_if_relative(p.ox, p.oy, relative, &data[0], 0);
- p.segment = VG_LINE_TO;
- data[1] = p.oy;
- cb(path, &p);
- p.ox = data[0];
- p.oy = data[1];
- p.px = data[0];
- p.py = data[1];
- break;
- case VG_VLINE_TO:
- data_at(&coords, path, 0, 1, data);
- map_if_relative(p.ox, p.oy, relative, 0, &data[0]);
- p.segment = VG_LINE_TO;
- data[1] = data[0];
- data[0] = p.ox;
- cb(path, &p);
- p.ox = data[0];
- p.oy = data[1];
- p.px = data[0];
- p.py = data[1];
- break;
- case VG_CUBIC_TO: {
- data_at(&coords, path, 0, 6, data);
- map_if_relative(p.ox, p.oy, relative, &data[0], &data[1]);
- map_if_relative(p.ox, p.oy, relative, &data[2], &data[3]);
- map_if_relative(p.ox, p.oy, relative, &data[4], &data[5]);
- cb(path, &p);
- p.px = data[2];
- p.py = data[3];
- p.ox = data[4];
- p.oy = data[5];
- }
- break;
- case VG_QUAD_TO: {
- data_at(&coords, path, 0, 4, data);
- map_if_relative(p.ox, p.oy, relative, &data[0], &data[1]);
- map_if_relative(p.ox, p.oy, relative, &data[2], &data[3]);
- cb(path, &p);
- p.px = data[0];
- p.py = data[1];
- p.ox = data[2];
- p.oy = data[3];
- }
- break;
- case VG_SQUAD_TO: {
- data_at(&coords, path, 0, 2, data);
- map_if_relative(p.ox, p.oy, relative, &data[0], &data[1]);
- cb(path, &p);
- p.px = 2*p.ox-p.px;
- p.py = 2*p.oy-p.py;
- p.ox = data[2];
- p.oy = data[3];
- }
- break;
- case VG_SCUBIC_TO: {
- data_at(&coords, path, 0, 4, data);
- map_if_relative(p.ox, p.oy, relative, &data[0], &data[1]);
- map_if_relative(p.ox, p.oy, relative, &data[2], &data[3]);
- cb(path, &p);
- p.px = data[0];
- p.py = data[1];
- p.ox = data[2];
- p.oy = data[3];
- }
- break;
- case VG_SCCWARC_TO:
- case VG_SCWARC_TO:
- case VG_LCCWARC_TO:
- case VG_LCWARC_TO: {
- data_at(&coords, path, 0, 5, data);
- map_if_relative(p.ox, p.oy, relative, &data[3], &data[4]);
-#if 0
- debug_printf("------- ARC (%f, %f), (%f, %f) %f, %f, %f\n",
- p.ox, p.oy, data[3], data[4], data[0], data[1], data[2]);
-#endif
- cb(path, &p);
- p.ox = data[3];
- p.oy = data[4];
- p.px = data[3];
- p.py = data[4];
- }
- break;
- default:
- abort();
- assert(!"Unknown segment!");
- }
- }
-}
-
-struct transform_data {
- struct array *segments;
- struct array *coords;
-
- struct matrix *matrix;
-
- VGPathDatatype datatype;
-};
-
-static VGboolean transform_cb(struct path *p,
- struct path_for_each_data *pd)
-{
- struct transform_data *td = (struct transform_data *)pd->user_data;
- VGint num_coords = num_elements_for_segments(&pd->segment, 1);
- VGubyte segment = SEGMENT_COMMAND(pd->segment);/* abs bit is 0 */
- VGfloat data[8];
- VGubyte common_data[sizeof(VGfloat)*8];
-
- memcpy(data, pd->coords, sizeof(VGfloat) * num_coords);
-
- switch(segment) {
- case VG_CLOSE_PATH:
- break;
- case VG_MOVE_TO:
- matrix_map_point(td->matrix,
- data[0], data[1], &data[0], &data[1]);
- break;
- case VG_LINE_TO:
- matrix_map_point(td->matrix,
- data[0], data[1], &data[0], &data[1]);
- break;
- case VG_HLINE_TO:
- case VG_VLINE_TO:
- assert(0);
- break;
- case VG_QUAD_TO:
- matrix_map_point(td->matrix,
- data[0], data[1], &data[0], &data[1]);
- matrix_map_point(td->matrix,
- data[2], data[3], &data[2], &data[3]);
- break;
- case VG_CUBIC_TO:
- matrix_map_point(td->matrix,
- data[0], data[1], &data[0], &data[1]);
- matrix_map_point(td->matrix,
- data[2], data[3], &data[2], &data[3]);
- matrix_map_point(td->matrix,
- data[4], data[5], &data[4], &data[5]);
- break;
- case VG_SQUAD_TO:
- matrix_map_point(td->matrix,
- data[0], data[1], &data[0], &data[1]);
- break;
- case VG_SCUBIC_TO:
- matrix_map_point(td->matrix,
- data[0], data[1], &data[0], &data[1]);
- matrix_map_point(td->matrix,
- data[2], data[3], &data[2], &data[3]);
- break;
- case VG_SCCWARC_TO:
- case VG_SCWARC_TO:
- case VG_LCCWARC_TO:
- case VG_LCWARC_TO: {
- struct arc arc;
- struct path *path = path_create(td->datatype,
- 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL);
- arc_init(&arc, segment,
- pd->ox, pd->oy, data[3], data[4],
- data[0], data[1], data[2]);
-
- arc_to_path(&arc, path, td->matrix);
-
- num_coords = path_num_coords(path);
-
- array_append_data(td->segments, path->segments->data,
- path->num_segments);
- array_append_data(td->coords, path->control_points->data,
- num_coords);
- path_destroy(path);
-
- return VG_TRUE;
- }
- break;
- default:
- break;
- }
-
- vg_float_to_datatype(td->datatype, common_data, data, num_coords);
-
- array_append_data(td->segments, &pd->segment, 1);
- array_append_data(td->coords, common_data, num_coords);
- return VG_TRUE;
-}
-
-void path_transform(struct path *dst, struct path *src)
-{
- struct transform_data data;
- struct vg_context *ctx = dst->base.ctx;
-
- data.segments = dst->segments;
- data.coords = dst->control_points;
- data.matrix = &ctx->state.vg.path_user_to_surface_matrix;
- data.datatype = dst->datatype;
-
- path_for_each_segment(src, transform_cb, (void*)&data);
-
- dst->num_segments = dst->segments->num_elements;
- dst->dirty = VG_TRUE;
- dst->dirty_stroke = VG_TRUE;
-}
-
-void path_append_path(struct path *dst,
- struct path *src)
-{
- VGint num_coords = path_num_coords(src);
- void *dst_data = malloc(size_for_datatype(dst->datatype) * num_coords);
- array_append_data(dst->segments,
- src->segments->data,
- src->num_segments);
- convert_path(src, dst->datatype,
- dst_data, num_coords);
- array_append_data(dst->control_points,
- dst_data,
- num_coords);
- free(dst_data);
-
- dst->num_segments += src->num_segments;
- dst->dirty = VG_TRUE;
- dst->dirty_stroke = VG_TRUE;
-}
-
-static INLINE VGboolean is_segment_arc(VGubyte segment)
-{
- VGubyte scommand = SEGMENT_COMMAND(segment);
- return (scommand == VG_SCCWARC_TO ||
- scommand == VG_SCWARC_TO ||
- scommand == VG_LCCWARC_TO ||
- scommand == VG_LCWARC_TO);
-}
-
-struct path_iter_data {
- struct path *path;
- VGubyte segment;
- void *coords;
- VGfloat px, py, ox, oy, sx, sy;
-};
-static INLINE VGubyte normalize_coords(struct path_iter_data *pd,
- VGint *num_coords,
- VGfloat *data)
-{
- VGint command = SEGMENT_COMMAND(pd->segment);
- VGboolean relative = SEGMENT_ABS_REL(pd->segment);
-
- switch(command) {
- case VG_CLOSE_PATH:
- *num_coords = 0;
- pd->ox = pd->sx;
- pd->oy = pd->sy;
- return VG_CLOSE_PATH;
- break;
- case VG_MOVE_TO:
- data_at(&pd->coords, pd->path, 0, 2, data);
- map_if_relative(pd->ox, pd->oy, relative, &data[0], &data[1]);
- pd->sx = data[0];
- pd->sy = data[1];
- pd->ox = data[0];
- pd->oy = data[1];
- pd->px = data[0];
- pd->py = data[1];
- *num_coords = 2;
- return VG_MOVE_TO_ABS;
- break;
- case VG_LINE_TO:
- data_at(&pd->coords, pd->path, 0, 2, data);
- map_if_relative(pd->ox, pd->oy, relative, &data[0], &data[1]);
- pd->ox = data[0];
- pd->oy = data[1];
- pd->px = data[0];
- pd->py = data[1];
- *num_coords = 2;
- return VG_LINE_TO_ABS;
- break;
- case VG_HLINE_TO:
- data_at(&pd->coords, pd->path, 0, 1, data);
- map_if_relative(pd->ox, pd->oy, relative, &data[0], 0);
- data[1] = pd->oy;
- pd->ox = data[0];
- pd->oy = data[1];
- pd->px = data[0];
- pd->py = data[1];
- *num_coords = 2;
- return VG_LINE_TO_ABS;
- break;
- case VG_VLINE_TO:
- data_at(&pd->coords, pd->path, 0, 1, data);
- map_if_relative(pd->ox, pd->oy, relative, 0, &data[0]);
- data[1] = data[0];
- data[0] = pd->ox;
- pd->ox = data[0];
- pd->oy = data[1];
- pd->px = data[0];
- pd->py = data[1];
- *num_coords = 2;
- return VG_LINE_TO_ABS;
- break;
- case VG_CUBIC_TO: {
- data_at(&pd->coords, pd->path, 0, 6, data);
- map_if_relative(pd->ox, pd->oy, relative, &data[0], &data[1]);
- map_if_relative(pd->ox, pd->oy, relative, &data[2], &data[3]);
- map_if_relative(pd->ox, pd->oy, relative, &data[4], &data[5]);
- pd->px = data[2];
- pd->py = data[3];
- pd->ox = data[4];
- pd->oy = data[5];
- *num_coords = 6;
- return VG_CUBIC_TO_ABS;
- }
- break;
- case VG_QUAD_TO: {
- VGfloat x0, y0, x1, y1, x2, y2, x3, y3;
- data_at(&pd->coords, pd->path, 0, 4, data);
- x0 = pd->ox;
- y0 = pd->oy;
- x1 = data[0];
- y1 = data[1];
- x3 = data[2];
- y3 = data[3];
- map_if_relative(pd->ox, pd->oy, relative, &x1, &y1);
- map_if_relative(pd->ox, pd->oy, relative, &x3, &y3);
- pd->px = x1;
- pd->py = y1;
- { /* form a cubic out of it */
- x2 = (x3 + 2*x1) / 3.f;
- y2 = (y3 + 2*y1) / 3.f;
- x1 = (x0 + 2*x1) / 3.f;
- y1 = (y0 + 2*y1) / 3.f;
- }
- pd->ox = x3;
- pd->oy = y3;
- data[0] = x1;
- data[1] = y1;
- data[2] = x2;
- data[3] = y2;
- data[4] = x3;
- data[5] = y3;
- *num_coords = 6;
- return VG_CUBIC_TO_ABS;
- }
- break;
- case VG_SQUAD_TO: {
- VGfloat x0, y0, x1, y1, x2, y2, x3, y3;
- data_at(&pd->coords, pd->path, 0, 2, data);
- x0 = pd->ox;
- y0 = pd->oy;
- x1 = 2 * pd->ox - pd->px;
- y1 = 2 * pd->oy - pd->py;
- x3 = data[0];
- y3 = data[1];
- map_if_relative(pd->ox, pd->oy, relative, &x3, &y3);
- pd->px = x1;
- pd->py = y1;
- { /* form a cubic out of it */
- x2 = (x3 + 2*x1) / 3.f;
- y2 = (y3 + 2*y1) / 3.f;
- x1 = (x0 + 2*x1) / 3.f;
- y1 = (y0 + 2*y1) / 3.f;
- }
- pd->ox = x3;
- pd->oy = y3;
- data[0] = x1;
- data[1] = y1;
- data[2] = x2;
- data[3] = y2;
- data[4] = x3;
- data[5] = y3;
- *num_coords = 6;
- return VG_CUBIC_TO_ABS;
- }
- break;
- case VG_SCUBIC_TO: {
- VGfloat x1, y1, x2, y2, x3, y3;
- data_at(&pd->coords, pd->path, 0, 4, data);
- x1 = 2*pd->ox-pd->px;
- y1 = 2*pd->oy-pd->py;
- x2 = data[0];
- y2 = data[1];
- x3 = data[2];
- y3 = data[3];
- map_if_relative(pd->ox, pd->oy, relative, &x2, &y2);
- map_if_relative(pd->ox, pd->oy, relative, &x3, &y3);
- pd->ox = x3;
- pd->oy = y3;
- pd->px = x2;
- pd->py = y2;
- data[0] = x1;
- data[1] = y1;
- data[2] = x2;
- data[3] = y2;
- data[4] = x3;
- data[5] = y3;
- *num_coords = 6;
- return VG_CUBIC_TO_ABS;
- }
- break;
- case VG_SCCWARC_TO:
- case VG_SCWARC_TO:
- case VG_LCCWARC_TO:
- case VG_LCWARC_TO: {
- data_at(&pd->coords, pd->path, 0, 5, data);
- map_if_relative(pd->ox, pd->oy, relative, &data[3], &data[4]);
- pd->ox = data[3];
- pd->oy = data[4];
- pd->px = data[3];
- pd->py = data[4];
- *num_coords = 5;
- return command | VG_ABSOLUTE;
- }
- break;
- default:
- abort();
- assert(!"Unknown segment!");
- return 0;
- }
-}
-
-static void linearly_interpolate(VGfloat *result,
- const VGfloat *start,
- const VGfloat *end,
- VGfloat amount,
- VGint number)
-{
- VGint i;
- for (i = 0; i < number; ++i) {
- result[i] = start[i] + (end[i] - start[i]) * amount;
- }
-}
-
-VGboolean path_interpolate(struct path *dst,
- struct path *start, struct path *end,
- VGfloat amount)
-{
- /* temporary path that we can discard if it will turn
- * out that start is not compatible with end */
- struct path *res_path = path_create(dst->datatype,
- 1.0, 0.0,
- 0, 0, dst->caps);
- VGint i;
- VGfloat start_coords[8];
- VGfloat end_coords[8];
- VGfloat results[8];
- VGubyte common_data[sizeof(VGfloat)*8];
- struct path_iter_data start_iter, end_iter;
-
- memset(&start_iter, 0, sizeof(struct path_iter_data));
- memset(&end_iter, 0, sizeof(struct path_iter_data));
-
- start_iter.path = start;
- start_iter.coords = start->control_points->data;
- end_iter.path = end;
- end_iter.coords = end->control_points->data;
-
- for (i = 0; i < start->num_segments; ++i) {
- VGubyte segment;
- VGubyte ssegment, esegment;
- VGint snum_coords, enum_coords;
- start_iter.segment = ((VGubyte*)(start->segments->data))[i];
- end_iter.segment = ((VGubyte*)(end->segments->data))[i];
-
- ssegment = normalize_coords(&start_iter, &snum_coords,
- start_coords);
- esegment = normalize_coords(&end_iter, &enum_coords,
- end_coords);
-
- if (is_segment_arc(ssegment)) {
- if (!is_segment_arc(esegment)) {
- path_destroy(res_path);
- return VG_FALSE;
- }
- if (amount > 0.5)
- segment = esegment;
- else
- segment = ssegment;
- } else if (is_segment_arc(esegment)) {
- path_destroy(res_path);
- return VG_FALSE;
- }
- else if (ssegment != esegment) {
- path_destroy(res_path);
- return VG_FALSE;
- }
- else
- segment = ssegment;
-
- linearly_interpolate(results, start_coords, end_coords,
- amount, snum_coords);
- vg_float_to_datatype(dst->datatype, common_data, results, snum_coords);
- path_append_data(res_path, 1, &segment, common_data);
- }
-
- path_append_path(dst, res_path);
- path_destroy(res_path);
-
- dst->dirty = VG_TRUE;
- dst->dirty_stroke = VG_TRUE;
-
- return VG_TRUE;
-}
-
-void path_clear(struct path *p, VGbitfield capabilities)
-{
- path_set_capabilities(p, capabilities);
- array_destroy(p->segments);
- array_destroy(p->control_points);
- p->segments = array_create(size_for_datatype(VG_PATH_DATATYPE_S_8));
- p->control_points = array_create(size_for_datatype(p->datatype));
- p->num_segments = 0;
- p->dirty = VG_TRUE;
- p->dirty_stroke = VG_TRUE;
-}
-
-struct path * path_create_stroke(struct path *p,
- struct matrix *matrix)
-{
- VGint i;
- VGfloat sx, sy, px, py, ox, oy;
- VGfloat x0, y0, x1, y1, x2, y2, x3, y3;
- VGfloat data[8];
- void *coords = (VGfloat *)p->control_points->data;
- int dashed = (p->base.ctx->state.vg.stroke.dash_pattern_num ? 1 : 0);
- struct dash_stroker stroker;
- struct vg_state *vg_state = &p->base.ctx->state.vg;
-
- if (p->stroked.path)
- {
- /* ### compare the dash patterns to see if we can cache them.
- * for now we simply always bail out if the path is dashed.
- */
- if (memcmp( &p->stroked.matrix,
- matrix,
- sizeof *matrix ) == 0 &&
- !dashed && !p->dirty_stroke &&
- floatsEqual(p->stroked.stroke_width, vg_state->stroke.line_width.f) &&
- floatsEqual(p->stroked.miter_limit, vg_state->stroke.miter_limit.f) &&
- p->stroked.cap_style == vg_state->stroke.cap_style &&
- p->stroked.join_style == vg_state->stroke.join_style)
- {
- return p->stroked.path;
- }
- else {
- path_destroy( p->stroked.path );
- p->stroked.path = NULL;
- }
- }
-
-
- sx = sy = px = py = ox = oy = 0.f;
-
- if (dashed)
- dash_stroker_init((struct stroker *)&stroker, vg_state);
- else
- stroker_init((struct stroker *)&stroker, vg_state);
-
- stroker_begin((struct stroker *)&stroker);
-
- for (i = 0; i < p->num_segments; ++i) {
- VGubyte segment = ((VGubyte*)(p->segments->data))[i];
- VGint command = SEGMENT_COMMAND(segment);
- VGboolean relative = SEGMENT_ABS_REL(segment);
-
- switch(command) {
- case VG_CLOSE_PATH: {
- VGfloat x0 = sx;
- VGfloat y0 = sy;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- stroker_line_to((struct stroker *)&stroker, x0, y0);
- }
- break;
- case VG_MOVE_TO:
- data_at(&coords, p, 0, 2, data);
- x0 = data[0];
- y0 = data[1];
- map_if_relative(ox, oy, relative, &x0, &y0);
- sx = x0;
- sy = y0;
- ox = x0;
- oy = y0;
- px = x0;
- py = y0;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- stroker_move_to((struct stroker *)&stroker, x0, y0);
- break;
- case VG_LINE_TO:
- data_at(&coords, p, 0, 2, data);
- x0 = data[0];
- y0 = data[1];
- map_if_relative(ox, oy, relative, &x0, &y0);
- ox = x0;
- oy = y0;
- px = x0;
- py = y0;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- stroker_line_to((struct stroker *)&stroker, x0, y0);
- break;
- case VG_HLINE_TO:
- data_at(&coords, p, 0, 1, data);
- x0 = data[0];
- y0 = oy;
- map_if_relative(ox, oy, relative, &x0, 0);
- ox = x0;
- px = x0;
- py = y0;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- stroker_line_to((struct stroker *)&stroker, x0, y0);
- break;
- case VG_VLINE_TO:
- data_at(&coords, p, 0, 1, data);
- x0 = ox;
- y0 = data[0];
- map_if_relative(ox, oy, relative, 0, &y0);
- oy = y0;
- px = x0;
- py = y0;
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- stroker_line_to((struct stroker *)&stroker, x0, y0);
- break;
- case VG_CUBIC_TO: {
- data_at(&coords, p, 0, 6, data);
- x0 = ox;
- y0 = oy;
- x1 = data[0];
- y1 = data[1];
- x2 = data[2];
- y2 = data[3];
- x3 = data[4];
- y3 = data[5];
- map_if_relative(ox, oy, relative, &x1, &y1);
- map_if_relative(ox, oy, relative, &x2, &y2);
- map_if_relative(ox, oy, relative, &x3, &y3);
- if (floatsEqual(x1, ox) && floatsEqual(y1, oy) &&
- floatsEqual(x1, x2) && floatsEqual(y1, y2) &&
- floatsEqual(x2, x3) && floatsEqual(y2, y3)) {
- /*ignore the empty segment */
- continue;
- } else if (floatsEqual(x3, ox) && floatsEqual(y3, oy)) {
- /* if dup vertex, emit a line */
- ox = x3;
- oy = y3;
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- stroker_line_to((struct stroker *)&stroker, x3, y3);
- continue;
- }
- ox = x3;
- oy = y3;
- px = x2;
- py = y2;
- assert(matrix_is_affine(matrix));
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- matrix_map_point(matrix, x1, y1, &x1, &y1);
- matrix_map_point(matrix, x2, y2, &x2, &y2);
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- stroker_curve_to((struct stroker *)&stroker, x1, y1, x2, y2, x3, y3);
- }
- break;
- case VG_QUAD_TO: {
- data_at(&coords, p, 0, 4, data);
- x0 = ox;
- y0 = oy;
- x1 = data[0];
- y1 = data[1];
- x3 = data[2];
- y3 = data[3];
- map_if_relative(ox, oy, relative, &x1, &y1);
- map_if_relative(ox, oy, relative, &x3, &y3);
- px = x1;
- py = y1;
- { /* form a cubic out of it */
- x2 = (x3 + 2*x1) / 3.f;
- y2 = (y3 + 2*y1) / 3.f;
- x1 = (x0 + 2*x1) / 3.f;
- y1 = (y0 + 2*y1) / 3.f;
- }
- if (floatsEqual(x1, ox) && floatsEqual(y1, oy) &&
- floatsEqual(x1, x2) && floatsEqual(y1, y2) &&
- floatsEqual(x2, x3) && floatsEqual(y2, y3)) {
- /*ignore the empty segment */
- continue;
- } else if (floatsEqual(x3, ox) && floatsEqual(y3, oy)) {
- /* if dup vertex, emit a line */
- ox = x3;
- oy = y3;
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- stroker_line_to((struct stroker *)&stroker, x3, y3);
- continue;
- }
- ox = x3;
- oy = y3;
- assert(matrix_is_affine(matrix));
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- matrix_map_point(matrix, x1, y1, &x1, &y1);
- matrix_map_point(matrix, x2, y2, &x2, &y2);
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- stroker_curve_to((struct stroker *)&stroker, x1, y1, x2, y2, x3, y3);
- }
- break;
- case VG_SQUAD_TO: {
- data_at(&coords, p, 0, 2, data);
- x0 = ox;
- y0 = oy;
- x1 = 2*ox-px;
- y1 = 2*oy-py;
- x3 = data[0];
- y3 = data[1];
- map_if_relative(ox, oy, relative, &x3, &y3);
- px = x1;
- py = y1;
- { /* form a cubic out of it */
- x2 = (x3 + 2*x1) / 3.f;
- y2 = (y3 + 2*y1) / 3.f;
- x1 = (x0 + 2*x1) / 3.f;
- y1 = (y0 + 2*y1) / 3.f;
- }
- if (floatsEqual(x1, ox) && floatsEqual(y1, oy) &&
- floatsEqual(x1, x2) && floatsEqual(y1, y2) &&
- floatsEqual(x2, x3) && floatsEqual(y2, y3)) {
- /*ignore the empty segment */
- continue;
- } else if (floatsEqual(x3, ox) && floatsEqual(y3, oy)) {
- /* if dup vertex, emit a line */
- ox = x3;
- oy = y3;
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- stroker_line_to((struct stroker *)&stroker, x3, y3);
- continue;
- }
- ox = x3;
- oy = y3;
- assert(matrix_is_affine(matrix));
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- matrix_map_point(matrix, x1, y1, &x1, &y1);
- matrix_map_point(matrix, x2, y2, &x2, &y2);
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- stroker_curve_to((struct stroker *)&stroker, x1, y1, x2, y2, x3, y3);
- }
- break;
- case VG_SCUBIC_TO: {
- data_at(&coords, p, 0, 4, data);
- x0 = ox;
- y0 = oy;
- x1 = 2*ox-px;
- y1 = 2*oy-py;
- x2 = data[0];
- y2 = data[1];
- x3 = data[2];
- y3 = data[3];
- map_if_relative(ox, oy, relative, &x2, &y2);
- map_if_relative(ox, oy, relative, &x3, &y3);
- if (floatsEqual(x1, ox) && floatsEqual(y1, oy) &&
- floatsEqual(x1, x2) && floatsEqual(y1, y2) &&
- floatsEqual(x2, x3) && floatsEqual(y2, y3)) {
- /*ignore the empty segment */
- continue;
- } else if (floatsEqual(x3, ox) && floatsEqual(y3, oy)) {
- /* if dup vertex, emit a line */
- ox = x3;
- oy = y3;
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- stroker_line_to((struct stroker *)&stroker, x3, y3);
- continue;
- }
- ox = x3;
- oy = y3;
- px = x2;
- py = y2;
- assert(matrix_is_affine(matrix));
- matrix_map_point(matrix, x0, y0, &x0, &y0);
- matrix_map_point(matrix, x1, y1, &x1, &y1);
- matrix_map_point(matrix, x2, y2, &x2, &y2);
- matrix_map_point(matrix, x3, y3, &x3, &y3);
- stroker_curve_to((struct stroker *)&stroker, x1, y1, x2, y2, x3, y3);
- }
- break;
- case VG_SCCWARC_TO:
- case VG_SCWARC_TO:
- case VG_LCCWARC_TO:
- case VG_LCWARC_TO: {
- VGfloat rh, rv, rot;
- struct arc arc;
-
- data_at(&coords, p, 0, 5, data);
- x0 = ox;
- y0 = oy;
- rh = data[0];
- rv = data[1];
- rot = data[2];
- x1 = data[3];
- y1 = data[4];
- map_if_relative(ox, oy, relative, &x1, &y1);
- if (floatsEqual(x1, ox) && floatsEqual(y1, oy)) {
- /* if dup vertex, emit a line */
- ox = x1;
- oy = y1;
- matrix_map_point(matrix, x1, y1, &x1, &y1);
- stroker_line_to((struct stroker *)&stroker, x1, y1);
- continue;
- }
- arc_init(&arc, command, x0, y0, x1, y1,
- rh, rv, rot);
- arc_stroke_cb(&arc, (struct stroker *)&stroker,
- matrix);
- ox = x1;
- oy = y1;
- px = x1;
- py = y1;
- }
- break;
- default:
- abort();
- assert(!"Unknown segment!");
- }
- }
-
- stroker_end((struct stroker *)&stroker);
-
- if (dashed)
- dash_stroker_cleanup((struct dash_stroker *)&stroker);
- else
- stroker_cleanup((struct stroker *)&stroker);
-
- p->stroked.path = stroker.base.path;
- p->stroked.matrix = *matrix;
- p->dirty_stroke = VG_FALSE;
- p->stroked.stroke_width = vg_state->stroke.line_width.f;
- p->stroked.miter_limit = vg_state->stroke.miter_limit.f;
- p->stroked.cap_style = vg_state->stroke.cap_style;
- p->stroked.join_style = vg_state->stroke.join_style;
-
- return stroker.base.path;
-}
-
-void path_render(struct path *p, VGbitfield paintModes,
- struct matrix *mat)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix paint_matrix;
-
- vg_validate_state(ctx);
-
- shader_set_drawing_image(ctx->shader, VG_FALSE);
- shader_set_image(ctx->shader, 0);
-#if 0
- fprintf(stderr, "Matrix(11=%f 12=%f 13=%f 21=%f 22=%f 23=%f 31=%f 32=%f 33=%f)\n",
- mat->m[0], mat->m[1], mat->m[2],
- mat->m[3], mat->m[4], mat->m[5],
- mat->m[6], mat->m[7], mat->m[8]);
-#endif
- if ((paintModes & VG_FILL_PATH) &&
- vg_get_paint_matrix(ctx,
- &ctx->state.vg.fill_paint_to_user_matrix,
- mat,
- &paint_matrix)) {
- /* First the fill */
- shader_set_surface_matrix(ctx->shader, mat);
- shader_set_paint(ctx->shader, ctx->state.vg.fill_paint);
- shader_set_paint_matrix(ctx->shader, &paint_matrix);
- shader_bind(ctx->shader);
- path_fill(p);
- }
-
- if ((paintModes & VG_STROKE_PATH) &&
- vg_get_paint_matrix(ctx,
- &ctx->state.vg.stroke_paint_to_user_matrix,
- mat,
- &paint_matrix)) {
- /* 8.7.5: "line width less than or equal to 0 prevents stroking from
- * taking place."*/
- if (ctx->state.vg.stroke.line_width.f <= 0)
- return;
- shader_set_surface_matrix(ctx->shader, mat);
- shader_set_paint(ctx->shader, ctx->state.vg.stroke_paint);
- shader_set_paint_matrix(ctx->shader, &paint_matrix);
- shader_bind(ctx->shader);
- path_stroke(p);
- }
-}
-
-void path_fill(struct path *p)
-{
- struct vg_context *ctx = vg_current_context();
- struct matrix identity;
-
- matrix_load_identity(&identity);
-
- {
- struct polygon_array *polygon_array = path_get_fill_polygons(p, &identity);
- struct array *polys = polygon_array->array;
-
- if (!polygon_array || !polys || !polys->num_elements) {
- return;
- }
- polygon_array_fill(polygon_array, ctx);
- }
-}
-
-void path_stroke(struct path *p)
-{
- struct vg_context *ctx = vg_current_context();
- VGFillRule old_fill = ctx->state.vg.fill_rule;
- struct matrix identity;
- struct path *stroke;
-
- matrix_load_identity(&identity);
- stroke = path_create_stroke(p, &identity);
- if (stroke && !path_is_empty(stroke)) {
- ctx->state.vg.fill_rule = VG_NON_ZERO;
-
- path_fill(stroke);
-
- ctx->state.vg.fill_rule = old_fill;
- }
-}
-
-void path_move_to(struct path *p, float x, float y)
-{
- VGubyte segment = VG_MOVE_TO_ABS;
- VGubyte common_data[sizeof(VGfloat) * 2];
- VGfloat data[2] = {x, y};
-
- vg_float_to_datatype(p->datatype, common_data, data, 2);
- path_append_data(p, 1, &segment, common_data);
-}
-
-void path_line_to(struct path *p, float x, float y)
-{
- VGubyte segment = VG_LINE_TO_ABS;
- VGubyte common_data[sizeof(VGfloat) * 2];
- VGfloat data[2] = {x, y};
-
- vg_float_to_datatype(p->datatype, common_data, data, 2);
-
- path_append_data(p, 1, &segment, common_data);
-}
-
-void path_cubic_to(struct path *p, float px1, float py1,
- float px2, float py2,
- float x, float y)
-{
- VGubyte segment = VG_CUBIC_TO_ABS;
- VGubyte common_data[sizeof(VGfloat) * 6];
- VGfloat data[6];
-
- data[0] = px1; data[1] = py1;
- data[2] = px2; data[3] = py2;
- data[4] = x; data[5] = y;
-
- vg_float_to_datatype(p->datatype, common_data, data, 6);
-
- path_append_data(p, 1, &segment, common_data);
-}
-
-static INLINE void line_bounds(VGfloat *line /*x1,y1,x2,y2*/,
- VGfloat *bounds)
-{
- bounds[0] = MIN2(line[0], line[2]);
- bounds[1] = MIN2(line[1], line[3]);
- bounds[2] = MAX2(line[0], line[2]) - bounds[0];
- bounds[3] = MAX2(line[1], line[3]) - bounds[1];
-}
-
-static INLINE void unite_bounds(VGfloat *bounds,
- VGfloat *el)
-{
- VGfloat cx1, cy1, cx2, cy2;
- VGfloat nx1, ny1, nx2, ny2;
-
- cx1 = bounds[0];
- cy1 = bounds[1];
- cx2 = bounds[0] + bounds[2];
- cy2 = bounds[1] + bounds[3];
-
- nx1 = el[0];
- ny1 = el[1];
- nx2 = el[0] + el[2];
- ny2 = el[1] + el[3];
-
- bounds[0] = MIN2(cx1, nx1);
- bounds[1] = MIN2(cy1, ny1);
- bounds[2] = MAX2(cx2, nx2) - bounds[0];
- bounds[3] = MAX2(cy2, ny2) - bounds[1];
-}
-
-static INLINE void set_bounds(VGfloat *bounds,
- VGfloat *element_bounds,
- VGboolean *initialized)
-{
- if (!(*initialized)) {
- memcpy(bounds, element_bounds, 4 * sizeof(VGfloat));
- *initialized = VG_TRUE;
- } else
- unite_bounds(bounds, element_bounds);
-}
-
-void path_bounding_rect(struct path *p, float *x, float *y,
- float *w, float *h)
-{
- VGint i;
- VGfloat coords[8];
- struct path_iter_data iter;
- VGint num_coords;
- VGfloat bounds[4];
- VGfloat element_bounds[4];
- VGfloat ox, oy;
- VGboolean bounds_inited = VG_FALSE;
-
- memset(&iter, 0, sizeof(struct path_iter_data));
- memset(&bounds, 0, sizeof(bounds));
-
- if (!p->num_segments) {
- bounds[2] = -1;
- bounds[3] = -1;
- }
-
-
- iter.path = p;
- iter.coords = p->control_points->data;
-
- for (i = 0; i < p->num_segments; ++i) {
- VGubyte segment;
- iter.segment = ((VGubyte*)(p->segments->data))[i];
-
- ox = iter.ox;
- oy = iter.oy;
-
- segment = normalize_coords(&iter, &num_coords, coords);
-
- switch(segment) {
- case VG_CLOSE_PATH:
- case VG_MOVE_TO_ABS:
- break;
- case VG_LINE_TO_ABS: {
- VGfloat line[4] = {ox, oy, coords[0], coords[1]};
- line_bounds(line, element_bounds);
- set_bounds(bounds, element_bounds, &bounds_inited);
- }
- break;
- case VG_CUBIC_TO_ABS: {
- struct bezier bezier;
- bezier_init(&bezier, ox, oy,
- coords[0], coords[1],
- coords[2], coords[3],
- coords[4], coords[5]);
- bezier_exact_bounds(&bezier, element_bounds);
- set_bounds(bounds, element_bounds, &bounds_inited);
- }
- break;
- case VG_SCCWARC_TO:
- case VG_SCWARC_TO:
- case VG_LCCWARC_TO:
- case VG_LCWARC_TO: {
- struct arc arc;
- struct matrix identity;
- struct path *path = path_create(VG_PATH_DATATYPE_F,
- 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL);
-
- matrix_load_identity(&identity);
- arc_init(&arc, segment,
- ox, oy, coords[3], coords[4],
- coords[0], coords[1], coords[2]);
-
- arc_to_path(&arc, path, &identity);
-
- path_bounding_rect(path, element_bounds + 0, element_bounds + 1,
- element_bounds + 2, element_bounds + 3);
- set_bounds(bounds, element_bounds, &bounds_inited);
- }
- break;
- default:
- assert(0);
- }
- }
-
- *x = bounds[0];
- *y = bounds[1];
- *w = bounds[2];
- *h = bounds[3];
-}
-
-float path_length(struct path *p, int start_segment, int num_segments)
-{
- VGint i;
- VGfloat coords[8];
- struct path_iter_data iter;
- VGint num_coords;
- VGfloat length = 0;
- VGfloat ox, oy;
- VGboolean in_range = VG_FALSE;
-
- memset(&iter, 0, sizeof(struct path_iter_data));
-
- iter.path = p;
- iter.coords = p->control_points->data;
-
- for (i = 0; i < (start_segment + num_segments); ++i) {
- VGubyte segment;
-
- iter.segment = ((VGubyte*)(p->segments->data))[i];
-
- ox = iter.ox;
- oy = iter.oy;
-
- segment = normalize_coords(&iter, &num_coords, coords);
-
- in_range = (i >= start_segment) && i <= (start_segment + num_segments);
- if (!in_range)
- continue;
-
- switch(segment) {
- case VG_MOVE_TO_ABS:
- break;
- case VG_CLOSE_PATH: {
- VGfloat line[4] = {ox, oy, iter.sx, iter.sy};
- length += line_lengthv(line);
- }
- break;
- case VG_LINE_TO_ABS: {
- VGfloat line[4] = {ox, oy, coords[0], coords[1]};
- length += line_lengthv(line);
- }
- break;
- case VG_CUBIC_TO_ABS: {
- struct bezier bezier;
- bezier_init(&bezier, ox, oy,
- coords[0], coords[1],
- coords[2], coords[3],
- coords[4], coords[5]);
- length += bezier_length(&bezier, BEZIER_DEFAULT_ERROR);
- }
- break;
- case VG_SCCWARC_TO:
- case VG_SCWARC_TO:
- case VG_LCCWARC_TO:
- case VG_LCWARC_TO: {
- struct arc arc;
- struct matrix identity;
- struct path *path = path_create(VG_PATH_DATATYPE_F,
- 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL);
-
- matrix_load_identity(&identity);
- arc_init(&arc, segment,
- ox, oy, coords[3], coords[4],
- coords[0], coords[1], coords[2]);
-
- arc_to_path(&arc, path, &identity);
-
- length += path_length(path, 0, path_num_segments(path));
- }
- break;
- default:
- assert(0);
- }
- }
-
- return length;
-}
-
-static INLINE VGboolean point_on_current_segment(VGfloat distance,
- VGfloat length,
- VGfloat segment_length)
-{
- return
- (((floatIsZero(distance) || distance < 0) && floatIsZero(length)) ||
- ((distance > length || floatsEqual(distance, length)) &&
- (floatsEqual(distance, length + segment_length) ||
- distance < (length + segment_length))));
-}
-
-static VGboolean path_point_segment(struct path_iter_data iter,
- struct path_iter_data prev_iter,
- VGfloat coords[8],
- VGfloat distance,
- VGfloat length, VGfloat *current_length,
- VGfloat *point, VGfloat *normal)
-{
- switch (iter.segment) {
- case VG_MOVE_TO_ABS:
- break;
- case VG_CLOSE_PATH: {
- VGfloat line[4] = {prev_iter.ox, prev_iter.oy, iter.sx, iter.sy};
- VGboolean on_current_segment = VG_FALSE;
- *current_length = line_lengthv(line);
- on_current_segment = point_on_current_segment(distance,
- length,
- *current_length);
- if (on_current_segment) {
- VGfloat at = (distance - length) / line_lengthv(line);
- line_normal_vector(line, normal);
- line_point_at(line, at, point);
- return VG_TRUE;
- }
- }
- break;
- case VG_LINE_TO_ABS: {
- VGfloat line[4] = {prev_iter.ox, prev_iter.oy, coords[0], coords[1]};
- VGboolean on_current_segment = VG_FALSE;
- *current_length = line_lengthv(line);
- on_current_segment = point_on_current_segment(distance,
- length,
- *current_length);
- if (on_current_segment) {
- VGfloat at = (distance - length) / line_lengthv(line);
- line_normal_vector(line, normal);
- line_point_at(line, at, point);
- return VG_TRUE;
- }
- }
- break;
- case VG_CUBIC_TO_ABS: {
- struct bezier bezier;
- bezier_init(&bezier, prev_iter.ox, prev_iter.oy,
- coords[0], coords[1],
- coords[2], coords[3],
- coords[4], coords[5]);
- *current_length = bezier_length(&bezier, BEZIER_DEFAULT_ERROR);
- if (point_on_current_segment(distance, length, *current_length)) {
- bezier_point_at_length(&bezier, distance - length,
- point, normal);
- return VG_TRUE;
- }
- }
- break;
- case VG_SCCWARC_TO:
- case VG_SCWARC_TO:
- case VG_LCCWARC_TO:
- case VG_LCWARC_TO: {
- struct arc arc;
- struct matrix identity;
- struct path *path = path_create(VG_PATH_DATATYPE_F,
- 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL);
-
- matrix_load_identity(&identity);
- arc_init(&arc, iter.segment,
- prev_iter.ox, prev_iter.oy, coords[3], coords[4],
- coords[0], coords[1], coords[2]);
-
- arc_to_path(&arc, path, &identity);
-
- *current_length = path_length(path, 0, path_num_segments(path));
- if (point_on_current_segment(distance, length, *current_length)) {
- path_point(path, 0, path_num_segments(path),
- distance - length, point, normal);
- return VG_TRUE;
- }
- }
- break;
- default:
- assert(0);
- }
- return VG_FALSE;
-}
-
-void path_point(struct path *p, VGint start_segment, VGint num_segments,
- VGfloat distance, VGfloat *point, VGfloat *normal)
-{
- VGint i;
- VGfloat coords[8];
- struct path_iter_data iter, prev_iter;
- VGint num_coords;
- VGfloat length = 0;
- VGfloat current_length = 0;
-
- memset(&iter, 0, sizeof(struct path_iter_data));
- memset(&prev_iter, 0, sizeof(struct path_iter_data));
-
- point[0] = 0;
- point[1] = 0;
-
- normal[0] = 0;
- normal[1] = -1;
-
- iter.path = p;
- iter.coords = p->control_points->data;
- if (distance < 0)
- distance = 0;
-
- for (i = 0; i < (start_segment + num_segments); ++i) {
- VGboolean outside_range = (i < start_segment ||
- i >= (start_segment + num_segments));
-
- prev_iter = iter;
-
- iter.segment = ((VGubyte*)(p->segments->data))[i];
- iter.segment = normalize_coords(&iter, &num_coords, coords);
-
- if (outside_range)
- continue;
-
- if (path_point_segment(iter, prev_iter, coords,
- distance, length, &current_length,
- point, normal))
- return;
-
- length += current_length;
- }
-
- /*
- *OpenVG 1.0 - 8.6.11 vgPointAlongPath
- *
- * If distance is greater than or equal to the path length
- *(i.e., the value returned by vgPathLength when called with the same
- *startSegment and numSegments parameters), the visual ending point of
- *the path is used.
- */
- {
- switch (iter.segment) {
- case VG_MOVE_TO_ABS:
- break;
- case VG_CLOSE_PATH: {
- VGfloat line[4] = {prev_iter.ox, prev_iter.oy, iter.sx, iter.sy};
- line_normal_vector(line, normal);
- line_point_at(line, 1.f, point);
- }
- break;
- case VG_LINE_TO_ABS: {
- VGfloat line[4] = {prev_iter.ox, prev_iter.oy, coords[0], coords[1]};
- line_normal_vector(line, normal);
- line_point_at(line, 1.f, point);
- }
- break;
- case VG_CUBIC_TO_ABS: {
- struct bezier bezier;
- bezier_init(&bezier, prev_iter.ox, prev_iter.oy,
- coords[0], coords[1],
- coords[2], coords[3],
- coords[4], coords[5]);
- bezier_point_at_t(&bezier, 1.f, point, normal);
- }
- break;
- case VG_SCCWARC_TO:
- case VG_SCWARC_TO:
- case VG_LCCWARC_TO:
- case VG_LCWARC_TO: {
- struct arc arc;
- struct matrix identity;
- struct path *path = path_create(VG_PATH_DATATYPE_F,
- 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL);
-
- matrix_load_identity(&identity);
- arc_init(&arc, iter.segment,
- prev_iter.ox, prev_iter.oy, coords[3], coords[4],
- coords[0], coords[1], coords[2]);
-
- arc_to_path(&arc, path, &identity);
-
- path_point(path, 0, path_num_segments(path),
- /* to make sure we're bigger than len * 2 it */
- 2 * path_length(path, 0, path_num_segments(path)),
- point, normal);
- }
- break;
- default:
- assert(0);
- }
- }
-}
-
-VGboolean path_is_empty(struct path *p)
-{
- return p->segments->num_elements == 0;
-}
diff --git a/src/gallium/state_trackers/vega/path.h b/src/gallium/state_trackers/vega/path.h
deleted file mode 100644
index d84b1f083ce..00000000000
--- a/src/gallium/state_trackers/vega/path.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef _PATH_H
-#define _PATH_H
-
-#include "VG/openvg.h"
-
-struct path;
-struct polygon;
-struct matrix;
-
-enum fill_rule {
- ODD_EVEN_FILL,
- WINDING_FILL
-};
-
-
-struct path_for_each_data {
- VGubyte segment;
- /* all coords are absolute, even if segment is relative */
- const VGfloat *coords;
- VGfloat sx, sy, ox, oy, px, py;
- void *user_data;
-};
-
-typedef VGboolean (*path_for_each_cb)(struct path *p,
- struct path_for_each_data *data);
-
-
-struct path *path_create(VGPathDatatype dt, VGfloat scale, VGfloat bias,
- VGint segmentCapacityHint,
- VGint coordCapacityHint,
- VGbitfield capabilities);
-void path_destroy(struct path *p);
-
-VGbitfield path_capabilities(struct path *p);
-void path_set_capabilities(struct path *p, VGbitfield bf);
-
-void path_append_data(struct path *p,
- VGint numSegments,
- const VGubyte * pathSegments,
- const void * pathData);
-
-void path_append_path(struct path *dst,
- struct path *src);
-
-VGint path_num_segments(struct path *p);
-
-void path_bounding_rect(struct path *p, float *x, float *y,
- float *w, float *h);
-float path_length(struct path *p, int start_segment, int num_segments);
-
-void path_set_fill_rule(enum fill_rule fill);
-enum fill_rule path_fill_rule(enum fill_rule fill);
-
-VGboolean path_is_empty(struct path *p);
-
-VGbyte path_datatype_size(struct path *p);
-
-VGPathDatatype path_datatype(struct path *p);
-VGfloat path_scale(struct path *p);
-VGfloat path_bias(struct path *p);
-VGint path_num_coords(struct path *p);
-
-void path_modify_coords(struct path *p,
- VGint startIndex,
- VGint numSegments,
- const void * pathData);
-
-struct path *path_create_stroke(struct path *p,
- struct matrix *m);
-
-void path_for_each_segment(struct path *path,
- path_for_each_cb cb,
- void *user_data);
-
-void path_transform(struct path *dst, struct path *src);
-VGboolean path_interpolate(struct path *dst,
- struct path *start, struct path *end,
- VGfloat amount);
-
-void path_clear(struct path *p, VGbitfield capabilities);
-void path_render(struct path *p, VGbitfield paintModes, struct matrix *mat);
-void path_fill(struct path *p);
-void path_stroke(struct path *p);
-
-void path_move_to(struct path *p, float x, float y);
-void path_line_to(struct path *p, float x, float y);
-void path_cubic_to(struct path *p, float px1, float py1,
- float px2, float py2,
- float x, float y);
-
-void path_point(struct path *p, VGint startSegment, VGint numSegments,
- VGfloat distance, VGfloat *point, VGfloat *normal);
-
-
-
-void vg_float_to_datatype(VGPathDatatype datatype,
- VGubyte *common_data,
- const VGfloat *data,
- VGint num_coords);
-#endif
diff --git a/src/gallium/state_trackers/vega/path_utils.h b/src/gallium/state_trackers/vega/path_utils.h
deleted file mode 100644
index c2b3221dc53..00000000000
--- a/src/gallium/state_trackers/vega/path_utils.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef PATH_UTILS_H
-#define PATH_UTILS_H
-
-#include "VG/openvg.h"
-
-#define SEGMENT_COMMAND(command) /* Extract segment type */ \
- ((command) & 0x1e)
-#define SEGMENT_ABS_REL(command) /* Extract absolute/relative bit */ \
- ((command) & 0x1)
-
-static INLINE VGint size_for_datatype(VGPathDatatype datatype)
-{
- switch(datatype) {
- case VG_PATH_DATATYPE_S_8:
- return 1;
- case VG_PATH_DATATYPE_S_16:
- return 2;
- case VG_PATH_DATATYPE_S_32:
- return 4;
- case VG_PATH_DATATYPE_F:
- return 4;
- default:
- assert(!"unknown datatype");
- }
- return 0;
-}
-
-static INLINE VGint num_elements_for_segments(const VGubyte *segments,
- VGint num_segments)
-{
- VGint i;
- VGint count = 0;
-
- for (i = 0; i < num_segments; ++i) {
- VGubyte segment = segments[i];
- VGint command = SEGMENT_COMMAND(segment);
- switch(command) {
- case VG_CLOSE_PATH:
- break;
- case VG_MOVE_TO:
- count += 2;
- break;
- case VG_LINE_TO:
- count += 2;
- break;
- case VG_HLINE_TO:
- count += 1;
- break;
- case VG_VLINE_TO:
- count += 1;
- break;
- case VG_QUAD_TO:
- count += 4;
- break;
- case VG_CUBIC_TO:
- count += 6;
- break;
- case VG_SQUAD_TO:
- count += 2;
- break;
- case VG_SCUBIC_TO:
- count += 4;
- break;
- case VG_SCCWARC_TO:
- count += 5;
- break;
- case VG_SCWARC_TO:
- count += 5;
- break;
- case VG_LCCWARC_TO:
- count += 5;
- break;
- case VG_LCWARC_TO:
- count += 5;
- break;
- default:
- assert(!"Unknown segment!");
- }
- }
- return count;
-}
-
-#endif
diff --git a/src/gallium/state_trackers/vega/polygon.c b/src/gallium/state_trackers/vega/polygon.c
deleted file mode 100644
index 37f96d48347..00000000000
--- a/src/gallium/state_trackers/vega/polygon.c
+++ /dev/null
@@ -1,351 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "polygon.h"
-
-#include "matrix.h" /*for floatsEqual*/
-#include "vg_context.h"
-#include "vg_state.h"
-#include "renderer.h"
-#include "util_array.h"
-#include "VG/openvg.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_state.h"
-#include "util/u_inlines.h"
-#include "pipe/p_screen.h"
-
-#include "util/u_draw_quad.h"
-#include "util/u_math.h"
-
-#include <string.h>
-#include <stdlib.h>
-
-#define DEBUG_POLYGON 0
-
-#define COMPONENTS 2
-
-struct polygon
-{
- VGfloat *data;
- VGint size;
-
- VGint num_verts;
-
- VGboolean dirty;
- void *user_vbuf;
- struct pipe_screen *screen;
-};
-
-static float *ptr_to_vertex(float *data, int idx)
-{
- return data + (idx * COMPONENTS);
-}
-
-#if 0
-static void polygon_print(struct polygon *poly)
-{
- int i;
- float *vert;
- debug_printf("Polygon %p, size = %d\n", poly, poly->num_verts);
- for (i = 0; i < poly->num_verts; ++i) {
- vert = ptr_to_vertex(poly->data, i);
- debug_printf("%f, %f, ", vert[0], vert[1]);
- }
- debug_printf("\nend\n");
-}
-#endif
-
-
-struct polygon * polygon_create(int size)
-{
- struct polygon *poly = malloc(sizeof(struct polygon));
-
- poly->data = malloc(sizeof(float) * COMPONENTS * size);
- poly->size = size;
- poly->num_verts = 0;
- poly->dirty = VG_TRUE;
- poly->user_vbuf = NULL;
-
- return poly;
-}
-
-struct polygon * polygon_create_from_data(float *data, int size)
-{
- struct polygon *poly = polygon_create(size);
-
- memcpy(poly->data, data, sizeof(float) * COMPONENTS * size);
- poly->num_verts = size;
- poly->dirty = VG_TRUE;
- poly->user_vbuf = NULL;
-
- return poly;
-}
-
-void polygon_destroy(struct polygon *poly)
-{
- free(poly->data);
- free(poly);
-}
-
-void polygon_resize(struct polygon *poly, int new_size)
-{
- float *data = malloc(sizeof(float) * COMPONENTS * new_size);
- int size = MIN2(sizeof(float) * COMPONENTS * new_size,
- sizeof(float) * COMPONENTS * poly->size);
- memcpy(data, poly->data, size);
- free(poly->data);
- poly->data = data;
- poly->size = new_size;
- poly->dirty = VG_TRUE;
-}
-
-int polygon_size(struct polygon *poly)
-{
- return poly->size;
-}
-
-int polygon_vertex_count(struct polygon *poly)
-{
- return poly->num_verts;
-}
-
-float * polygon_data(struct polygon *poly)
-{
- return poly->data;
-}
-
-void polygon_vertex_append(struct polygon *p,
- float x, float y)
-{
- float *vert;
-#if DEBUG_POLYGON
- debug_printf("Append vertex [%f, %f]\n", x, y);
-#endif
- if (p->num_verts >= p->size) {
- polygon_resize(p, p->size * 2);
- }
-
- vert = ptr_to_vertex(p->data, p->num_verts);
- vert[0] = x;
- vert[1] = y;
- ++p->num_verts;
- p->dirty = VG_TRUE;
-}
-
-void polygon_set_vertex(struct polygon *p, int idx,
- float x, float y)
-{
- float *vert;
- if (idx >= p->num_verts) {
- /*fixme: error reporting*/
- abort();
- return;
- }
-
- vert = ptr_to_vertex(p->data, idx);
- vert[0] = x;
- vert[1] = y;
- p->dirty = VG_TRUE;
-}
-
-void polygon_vertex(struct polygon *p, int idx,
- float *vertex)
-{
- float *vert;
- if (idx >= p->num_verts) {
- /*fixme: error reporting*/
- abort();
- return;
- }
-
- vert = ptr_to_vertex(p->data, idx);
- vertex[0] = vert[0];
- vertex[1] = vert[1];
-}
-
-void polygon_bounding_rect(struct polygon *p,
- float *rect)
-{
- int i;
- float minx, miny, maxx, maxy;
- float *vert = ptr_to_vertex(p->data, 0);
- minx = vert[0];
- maxx = vert[0];
- miny = vert[1];
- maxy = vert[1];
-
- for (i = 1; i < p->num_verts; ++i) {
- vert = ptr_to_vertex(p->data, i);
- minx = MIN2(vert[0], minx);
- miny = MIN2(vert[1], miny);
-
- maxx = MAX2(vert[0], maxx);
- maxy = MAX2(vert[1], maxy);
- }
-
- rect[0] = minx;
- rect[1] = miny;
- rect[2] = maxx - minx;
- rect[3] = maxy - miny;
-}
-
-int polygon_contains_point(struct polygon *p,
- float x, float y)
-{
- return 0;
-}
-
-void polygon_append_polygon(struct polygon *dst,
- struct polygon *src)
-{
- if (dst->num_verts + src->num_verts >= dst->size) {
- polygon_resize(dst, dst->num_verts + src->num_verts * 1.5);
- }
- memcpy(ptr_to_vertex(dst->data, dst->num_verts),
- src->data, src->num_verts * COMPONENTS * sizeof(VGfloat));
- dst->num_verts += src->num_verts;
-}
-
-VGboolean polygon_is_closed(struct polygon *p)
-{
- VGfloat start[2], end[2];
-
- polygon_vertex(p, 0, start);
- polygon_vertex(p, p->num_verts - 1, end);
-
- return floatsEqual(start[0], end[0]) && floatsEqual(start[1], end[1]);
-}
-
-static void polygon_prepare_buffer(struct vg_context *ctx,
- struct polygon *poly)
-{
- struct pipe_context *pipe;
-
- /*polygon_print(poly);*/
-
- pipe = ctx->pipe;
-
- if (poly->user_vbuf == NULL || poly->dirty) {
- poly->screen = pipe->screen;
- poly->user_vbuf = poly->data;
- poly->dirty = VG_FALSE;
- }
-}
-
-void polygon_fill(struct polygon *poly, struct vg_context *ctx)
-{
- struct pipe_vertex_element velement;
- struct pipe_vertex_buffer vbuffer;
- VGfloat bounds[4];
- VGfloat min_x, min_y, max_x, max_y;
-
- assert(poly);
- polygon_bounding_rect(poly, bounds);
- min_x = bounds[0];
- min_y = bounds[1];
- max_x = bounds[0] + bounds[2];
- max_y = bounds[1] + bounds[3];
-
-#if DEBUG_POLYGON
- debug_printf("Poly bounds are [%f, %f], [%f, %f]\n",
- min_x, min_y, max_x, max_y);
-#endif
-
- polygon_prepare_buffer(ctx, poly);
-
- /* tell renderer about the vertex attributes */
- memset(&velement, 0, sizeof(velement));
- velement.src_offset = 0;
- velement.instance_divisor = 0;
- velement.vertex_buffer_index = 0;
- velement.src_format = PIPE_FORMAT_R32G32_FLOAT;
-
- /* tell renderer about the vertex buffer */
- memset(&vbuffer, 0, sizeof(vbuffer));
- vbuffer.user_buffer = poly->user_vbuf;
- vbuffer.stride = COMPONENTS * sizeof(float); /* vertex size */
-
- renderer_polygon_stencil_begin(ctx->renderer,
- &velement, ctx->state.vg.fill_rule, VG_FALSE);
- renderer_polygon_stencil(ctx->renderer, &vbuffer,
- PIPE_PRIM_TRIANGLE_FAN, 0, (VGuint) poly->num_verts);
- renderer_polygon_stencil_end(ctx->renderer);
-
- renderer_polygon_fill_begin(ctx->renderer, VG_FALSE);
- renderer_polygon_fill(ctx->renderer, min_x, min_y, max_x, max_y);
- renderer_polygon_fill_end(ctx->renderer);
-}
-
-void polygon_array_fill(struct polygon_array *polyarray, struct vg_context *ctx)
-{
- struct array *polys = polyarray->array;
- VGfloat min_x = polyarray->min_x;
- VGfloat min_y = polyarray->min_y;
- VGfloat max_x = polyarray->max_x;
- VGfloat max_y = polyarray->max_y;
- struct pipe_vertex_element velement;
- struct pipe_vertex_buffer vbuffer;
- VGint i;
-
-
-#if DEBUG_POLYGON
- debug_printf("%s: Poly bounds are [%f, %f], [%f, %f]\n",
- __FUNCTION__,
- min_x, min_y, max_x, max_y);
-#endif
-
- /* tell renderer about the vertex attributes */
- memset(&velement, 0, sizeof(velement));
- velement.src_offset = 0;
- velement.instance_divisor = 0;
- velement.vertex_buffer_index = 0;
- velement.src_format = PIPE_FORMAT_R32G32_FLOAT;
-
- /* tell renderer about the vertex buffer */
- memset(&vbuffer, 0, sizeof(vbuffer));
- vbuffer.stride = COMPONENTS * sizeof(float); /* vertex size */
-
- /* prepare the stencil buffer */
- renderer_polygon_stencil_begin(ctx->renderer,
- &velement, ctx->state.vg.fill_rule, VG_FALSE);
- for (i = 0; i < polys->num_elements; ++i) {
- struct polygon *poly = (((struct polygon**)polys->data)[i]);
-
- polygon_prepare_buffer(ctx, poly);
- vbuffer.user_buffer = poly->user_vbuf;
-
- renderer_polygon_stencil(ctx->renderer, &vbuffer,
- PIPE_PRIM_TRIANGLE_FAN, 0, (VGuint) poly->num_verts);
- }
- renderer_polygon_stencil_end(ctx->renderer);
-
- /* fill it */
- renderer_polygon_fill_begin(ctx->renderer, VG_FALSE);
- renderer_polygon_fill(ctx->renderer, min_x, min_y, max_x, max_y);
- renderer_polygon_fill_end(ctx->renderer);
-}
diff --git a/src/gallium/state_trackers/vega/polygon.h b/src/gallium/state_trackers/vega/polygon.h
deleted file mode 100644
index 22672b728ed..00000000000
--- a/src/gallium/state_trackers/vega/polygon.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef POLYGON_H
-#define POLYGON_H
-
-#include "VG/openvg.h"
-
-struct polygon;
-struct vg_context;
-struct vg_paint;
-struct array;
-
-struct polygon *polygon_create(int size);
-struct polygon *polygon_create_from_data(float *data, int size);
-void polygon_destroy(struct polygon *poly);
-
-void polygon_resize(struct polygon *poly, int new_size);
-int polygon_size(struct polygon *poly);
-
-int polygon_vertex_count(struct polygon *poly);
-float * polygon_data(struct polygon *poly);
-
-void polygon_vertex_append(struct polygon *p,
- float x, float y);
-void polygon_append_polygon(struct polygon *dst,
- struct polygon *src);
-void polygon_set_vertex(struct polygon *p, int idx,
- float x, float y);
-void polygon_vertex(struct polygon *p, int idx,
- float *vertex);
-
-void polygon_bounding_rect(struct polygon *p,
- float *rect);
-int polygon_contains_point(struct polygon *p,
- float x, float y);
-
-VGboolean polygon_is_closed(struct polygon *p);
-
-void polygon_fill(struct polygon *p, struct vg_context *pipe);
-
-/* TODO: make a file/module around this struct
- */
-struct polygon_array {
- struct array *array;
- VGfloat min_x, max_x;
- VGfloat min_y, max_y;
-};
-
-void polygon_array_fill(struct polygon_array *polyarray, struct vg_context *ctx);
-
-#endif
diff --git a/src/gallium/state_trackers/vega/renderer.c b/src/gallium/state_trackers/vega/renderer.c
deleted file mode 100644
index d369c323bcc..00000000000
--- a/src/gallium/state_trackers/vega/renderer.c
+++ /dev/null
@@ -1,1558 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- * Copyright 2010 LunarG, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "renderer.h"
-
-#include "vg_context.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_state.h"
-#include "util/u_inlines.h"
-#include "pipe/p_screen.h"
-#include "pipe/p_shader_tokens.h"
-
-#include "util/u_draw_quad.h"
-#include "util/u_simple_shaders.h"
-#include "util/u_memory.h"
-#include "util/u_sampler.h"
-#include "util/u_surface.h"
-#include "util/u_math.h"
-#include "util/u_format.h"
-
-#include "cso_cache/cso_context.h"
-#include "tgsi/tgsi_ureg.h"
-
-typedef enum {
- RENDERER_STATE_INIT,
- RENDERER_STATE_COPY,
- RENDERER_STATE_DRAWTEX,
- RENDERER_STATE_SCISSOR,
- RENDERER_STATE_CLEAR,
- RENDERER_STATE_FILTER,
- RENDERER_STATE_POLYGON_STENCIL,
- RENDERER_STATE_POLYGON_FILL,
- NUM_RENDERER_STATES
-} RendererState;
-
-typedef enum {
- RENDERER_VS_PLAIN,
- RENDERER_VS_COLOR,
- RENDERER_VS_TEXTURE,
- NUM_RENDERER_VS
-} RendererVs;
-
-typedef enum {
- RENDERER_FS_COLOR,
- RENDERER_FS_TEXTURE,
- RENDERER_FS_SCISSOR,
- RENDERER_FS_WHITE,
- NUM_RENDERER_FS
-} RendererFs;
-
-struct renderer {
- struct pipe_context *pipe;
- struct cso_context *cso;
-
- VGbitfield dirty;
- struct {
- struct pipe_rasterizer_state rasterizer;
- struct pipe_depth_stencil_alpha_state dsa;
- struct pipe_framebuffer_state fb;
- } g3d;
- struct matrix projection;
-
- struct matrix mvp;
- struct pipe_resource *vs_cbuf;
-
- struct pipe_resource *fs_cbuf;
- VGfloat fs_cbuf_data[32];
- VGint fs_cbuf_len;
-
- struct pipe_vertex_element velems[2];
- VGfloat vertices[4][2][4];
-
- void *cached_vs[NUM_RENDERER_VS];
- void *cached_fs[NUM_RENDERER_FS];
-
- RendererState state;
-
- /* state data */
- union {
- struct {
- VGint tex_width;
- VGint tex_height;
- } copy;
-
- struct {
- VGint tex_width;
- VGint tex_height;
- } drawtex;
-
- struct {
- VGboolean restore_dsa;
- } scissor;
-
- struct {
- VGboolean use_sampler;
- VGint tex_width, tex_height;
- } filter;
-
- struct {
- struct pipe_depth_stencil_alpha_state dsa;
- VGboolean manual_two_sides;
- VGboolean restore_dsa;
- } polygon_stencil;
- } u;
-};
-
-/**
- * Return VG_TRUE if the renderer can use the resource as the asked bindings.
- */
-static VGboolean renderer_can_support(struct renderer *renderer,
- struct pipe_resource *res,
- unsigned bindings)
-{
- struct pipe_screen *screen = renderer->pipe->screen;
-
- return screen->is_format_supported(screen,
- res->format, res->target, 0, bindings);
-}
-
-/**
- * Set the model-view-projection matrix used by vertex shaders.
- */
-static void renderer_set_mvp(struct renderer *renderer,
- const struct matrix *mvp)
-{
- struct matrix *cur = &renderer->mvp;
- struct pipe_resource *cbuf;
- VGfloat consts[3][4];
- VGint i;
-
- /* projection only */
- if (!mvp)
- mvp = &renderer->projection;
-
- /* re-upload only if necessary */
- if (memcmp(cur, mvp, sizeof(*mvp)) == 0)
- return;
-
- /* 3x3 matrix to 3 constant vectors (no Z) */
- for (i = 0; i < 3; i++) {
- consts[i][0] = mvp->m[i + 0];
- consts[i][1] = mvp->m[i + 3];
- consts[i][2] = 0.0f;
- consts[i][3] = mvp->m[i + 6];
- }
-
- cbuf = renderer->vs_cbuf;
- pipe_resource_reference(&cbuf, NULL);
- cbuf = pipe_buffer_create(renderer->pipe->screen,
- PIPE_BIND_CONSTANT_BUFFER,
- PIPE_USAGE_DEFAULT,
- sizeof(consts));
- if (cbuf) {
- pipe_buffer_write(renderer->pipe, cbuf,
- 0, sizeof(consts), consts);
- }
- pipe_set_constant_buffer(renderer->pipe,
- PIPE_SHADER_VERTEX, 0, cbuf);
-
- memcpy(cur, mvp, sizeof(*mvp));
- renderer->vs_cbuf = cbuf;
-}
-
-/**
- * Create a simple vertex shader that passes through position and the given
- * attribute.
- */
-static void *create_passthrough_vs(struct pipe_context *pipe, int semantic_name)
-{
- struct ureg_program *ureg;
- struct ureg_src src[2], constants[3];
- struct ureg_dst dst[2], tmp;
- int i;
-
- ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
- if (!ureg)
- return NULL;
-
- /* position is in user coordinates */
- src[0] = ureg_DECL_vs_input(ureg, 0);
- dst[0] = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
- tmp = ureg_DECL_temporary(ureg);
- for (i = 0; i < Elements(constants); i++)
- constants[i] = ureg_DECL_constant(ureg, i);
-
- /* transform to clipped coordinates */
- ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), src[0], constants[0]);
- ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Y), src[0], constants[1]);
- ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Z), src[0]);
- ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), src[0], constants[2]);
- ureg_MOV(ureg, dst[0], ureg_src(tmp));
-
- if (semantic_name >= 0) {
- src[1] = ureg_DECL_vs_input(ureg, 1);
- dst[1] = ureg_DECL_output(ureg, semantic_name, 0);
- ureg_MOV(ureg, dst[1], src[1]);
- }
-
- ureg_END(ureg);
-
- return ureg_create_shader_and_destroy(ureg, pipe);
-}
-
-/**
- * Set renderer vertex shader.
- *
- * This function modifies vertex_shader state.
- */
-static void renderer_set_vs(struct renderer *r, RendererVs id)
-{
- /* create as needed */
- if (!r->cached_vs[id]) {
- int semantic_name = -1;
-
- switch (id) {
- case RENDERER_VS_PLAIN:
- break;
- case RENDERER_VS_COLOR:
- semantic_name = TGSI_SEMANTIC_COLOR;
- break;
- case RENDERER_VS_TEXTURE:
- semantic_name = TGSI_SEMANTIC_GENERIC;
- break;
- default:
- assert(!"Unknown renderer vs id");
- break;
- }
-
- r->cached_vs[id] = create_passthrough_vs(r->pipe, semantic_name);
- }
-
- cso_set_vertex_shader_handle(r->cso, r->cached_vs[id]);
-}
-
-/**
- * Create a simple fragment shader that sets the depth to 0.0f.
- */
-static void *create_scissor_fs(struct pipe_context *pipe)
-{
- struct ureg_program *ureg;
- struct ureg_dst out;
- struct ureg_src imm;
-
- ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
- out = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
- imm = ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 0.0f);
-
- ureg_MOV(ureg, ureg_writemask(out, TGSI_WRITEMASK_Z), imm);
- ureg_END(ureg);
-
- return ureg_create_shader_and_destroy(ureg, pipe);
-}
-
-/**
- * Create a simple fragment shader that sets the color to white.
- */
-static void *create_white_fs(struct pipe_context *pipe)
-{
- struct ureg_program *ureg;
- struct ureg_dst out;
- struct ureg_src imm;
-
- ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
- out = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
- imm = ureg_imm4f(ureg, 1.0f, 1.0f, 1.0f, 1.0f);
-
- ureg_MOV(ureg, out, imm);
- ureg_END(ureg);
-
- return ureg_create_shader_and_destroy(ureg, pipe);
-}
-
-/**
- * Set renderer fragment shader.
- *
- * This function modifies fragment_shader state.
- */
-static void renderer_set_fs(struct renderer *r, RendererFs id)
-{
- /* create as needed */
- if (!r->cached_fs[id]) {
- void *fs = NULL;
-
- switch (id) {
- case RENDERER_FS_COLOR:
- fs = util_make_fragment_passthrough_shader(r->pipe,
- TGSI_SEMANTIC_COLOR, TGSI_INTERPOLATE_PERSPECTIVE,
- TRUE);
- break;
- case RENDERER_FS_TEXTURE:
- fs = util_make_fragment_tex_shader(r->pipe,
- TGSI_TEXTURE_2D, TGSI_INTERPOLATE_LINEAR);
- break;
- case RENDERER_FS_SCISSOR:
- fs = create_scissor_fs(r->pipe);
- break;
- case RENDERER_FS_WHITE:
- fs = create_white_fs(r->pipe);
- break;
- default:
- assert(!"Unknown renderer fs id");
- break;
- }
-
- r->cached_fs[id] = fs;
- }
-
- cso_set_fragment_shader_handle(r->cso, r->cached_fs[id]);
-}
-
-typedef enum {
- VEGA_Y0_TOP,
- VEGA_Y0_BOTTOM
-} VegaOrientation;
-
-static void vg_set_viewport(struct renderer *r,
- VegaOrientation orientation)
-{
- const struct pipe_framebuffer_state *fb = &r->g3d.fb;
- struct pipe_viewport_state viewport;
- VGfloat y_scale = (orientation == VEGA_Y0_BOTTOM) ? -2.f : 2.f;
-
- viewport.scale[0] = fb->width / 2.f;
- viewport.scale[1] = fb->height / y_scale;
- viewport.scale[2] = 1.0;
- viewport.translate[0] = fb->width / 2.f;
- viewport.translate[1] = fb->height / 2.f;
- viewport.translate[2] = 0.0;
-
- cso_set_viewport(r->cso, &viewport);
-}
-
-/**
- * Set renderer target.
- *
- * This function modifies framebuffer and viewport states.
- */
-static void renderer_set_target(struct renderer *r,
- struct pipe_surface *cbuf,
- struct pipe_surface *zsbuf,
- VGboolean y0_top)
-{
- struct pipe_framebuffer_state fb;
-
- memset(&fb, 0, sizeof(fb));
- fb.width = cbuf->width;
- fb.height = cbuf->height;
- fb.cbufs[0] = cbuf;
- fb.nr_cbufs = 1;
- fb.zsbuf = zsbuf;
- cso_set_framebuffer(r->cso, &fb);
-
- vg_set_viewport(r, (y0_top) ? VEGA_Y0_TOP : VEGA_Y0_BOTTOM);
-}
-
-/**
- * Set renderer blend state. Blending is disabled.
- *
- * This function modifies blend state.
- */
-static void renderer_set_blend(struct renderer *r,
- VGbitfield channel_mask)
-{
- struct pipe_blend_state blend;
-
- memset(&blend, 0, sizeof(blend));
-
- blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
- blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
- blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
- blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
-
- if (channel_mask & VG_RED)
- blend.rt[0].colormask |= PIPE_MASK_R;
- if (channel_mask & VG_GREEN)
- blend.rt[0].colormask |= PIPE_MASK_G;
- if (channel_mask & VG_BLUE)
- blend.rt[0].colormask |= PIPE_MASK_B;
- if (channel_mask & VG_ALPHA)
- blend.rt[0].colormask |= PIPE_MASK_A;
-
- cso_set_blend(r->cso, &blend);
-}
-
-/**
- * Set renderer sampler and view states.
- *
- * This function modifies samplers and fragment_sampler_views states.
- */
-static void renderer_set_samplers(struct renderer *r,
- uint num_views,
- struct pipe_sampler_view **views)
-{
- struct pipe_sampler_state sampler;
- unsigned tex_filter = PIPE_TEX_FILTER_NEAREST;
- unsigned tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- uint i;
-
- memset(&sampler, 0, sizeof(sampler));
-
- sampler.min_img_filter = tex_filter;
- sampler.mag_img_filter = tex_filter;
- sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
-
- sampler.wrap_s = tex_wrap;
- sampler.wrap_t = tex_wrap;
- sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
-
- sampler.normalized_coords = 1;
-
- /* set samplers */
- for (i = 0; i < num_views; i++)
- cso_single_sampler(r->cso, PIPE_SHADER_FRAGMENT, i, &sampler);
- cso_single_sampler_done(r->cso, PIPE_SHADER_FRAGMENT);
-
- /* set views */
- cso_set_sampler_views(r->cso, PIPE_SHADER_FRAGMENT, num_views, views);
-}
-
-/**
- * Set custom renderer fragment shader, and optionally set samplers and views
- * and upload the fragment constant buffer.
- *
- * This function modifies fragment_shader, samplers and fragment_sampler_views
- * states.
- */
-static void renderer_set_custom_fs(struct renderer *renderer,
- void *fs,
- const struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **views,
- VGint num_samplers,
- const void *const_buffer,
- VGint const_buffer_len)
-{
- cso_set_fragment_shader_handle(renderer->cso, fs);
-
- /* set samplers and views */
- if (num_samplers) {
- cso_set_samplers(renderer->cso, PIPE_SHADER_FRAGMENT, num_samplers, samplers);
- cso_set_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT, num_samplers, views);
- }
-
- /* upload fs constant buffer */
- if (const_buffer_len) {
- struct pipe_resource *cbuf = renderer->fs_cbuf;
-
- if (!cbuf || renderer->fs_cbuf_len != const_buffer_len ||
- memcmp(renderer->fs_cbuf_data, const_buffer, const_buffer_len)) {
- pipe_resource_reference(&cbuf, NULL);
-
- cbuf = pipe_buffer_create(renderer->pipe->screen,
- PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_DEFAULT,
- const_buffer_len);
- pipe_buffer_write(renderer->pipe, cbuf, 0,
- const_buffer_len, const_buffer);
- pipe_set_constant_buffer(renderer->pipe,
- PIPE_SHADER_FRAGMENT, 0, cbuf);
-
- renderer->fs_cbuf = cbuf;
- if (const_buffer_len <= sizeof(renderer->fs_cbuf_data)) {
- memcpy(renderer->fs_cbuf_data, const_buffer, const_buffer_len);
- renderer->fs_cbuf_len = const_buffer_len;
- }
- else {
- renderer->fs_cbuf_len = 0;
- }
- }
- }
-}
-
-/**
- * Setup renderer quad position.
- */
-static void renderer_quad_pos(struct renderer *r,
- VGfloat x0, VGfloat y0,
- VGfloat x1, VGfloat y1,
- VGboolean scissor)
-{
- VGfloat z;
-
- /* the depth test is used for scissoring */
- z = (scissor) ? 0.0f : 1.0f;
-
- /* positions */
- r->vertices[0][0][0] = x0;
- r->vertices[0][0][1] = y0;
- r->vertices[0][0][2] = z;
-
- r->vertices[1][0][0] = x1;
- r->vertices[1][0][1] = y0;
- r->vertices[1][0][2] = z;
-
- r->vertices[2][0][0] = x1;
- r->vertices[2][0][1] = y1;
- r->vertices[2][0][2] = z;
-
- r->vertices[3][0][0] = x0;
- r->vertices[3][0][1] = y1;
- r->vertices[3][0][2] = z;
-}
-
-/**
- * Setup renderer quad texture coordinates.
- */
-static void renderer_quad_texcoord(struct renderer *r,
- VGfloat x0, VGfloat y0,
- VGfloat x1, VGfloat y1,
- VGint tex_width, VGint tex_height)
-{
- VGfloat s0, t0, s1, t1, r0, q0;
- VGint i;
-
- s0 = x0 / tex_width;
- s1 = x1 / tex_width;
- t0 = y0 / tex_height;
- t1 = y1 / tex_height;
- r0 = 0.0f;
- q0 = 1.0f;
-
- /* texcoords */
- r->vertices[0][1][0] = s0;
- r->vertices[0][1][1] = t0;
-
- r->vertices[1][1][0] = s1;
- r->vertices[1][1][1] = t0;
-
- r->vertices[2][1][0] = s1;
- r->vertices[2][1][1] = t1;
-
- r->vertices[3][1][0] = s0;
- r->vertices[3][1][1] = t1;
-
- for (i = 0; i < 4; i++) {
- r->vertices[i][1][2] = r0;
- r->vertices[i][1][3] = q0;
- }
-}
-
-/**
- * Draw renderer quad.
- */
-static void renderer_quad_draw(struct renderer *r)
-{
- util_draw_user_vertex_buffer(r->cso, r->vertices, PIPE_PRIM_TRIANGLE_FAN,
- Elements(r->vertices), /* verts */
- Elements(r->vertices[0])); /* attribs/vert */
-}
-
-/**
- * Prepare the renderer for copying.
- */
-VGboolean renderer_copy_begin(struct renderer *renderer,
- struct pipe_surface *dst,
- VGboolean y0_top,
- struct pipe_sampler_view *src)
-{
- assert(renderer->state == RENDERER_STATE_INIT);
-
- /* sanity check */
- if (!renderer_can_support(renderer,
- dst->texture, PIPE_BIND_RENDER_TARGET) ||
- !renderer_can_support(renderer,
- src->texture, PIPE_BIND_SAMPLER_VIEW))
- return VG_FALSE;
-
- cso_save_framebuffer(renderer->cso);
- cso_save_viewport(renderer->cso);
- cso_save_blend(renderer->cso);
- cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_save_fragment_shader(renderer->cso);
- cso_save_vertex_shader(renderer->cso);
-
- renderer_set_target(renderer, dst, NULL, y0_top);
-
- renderer_set_blend(renderer, ~0);
- renderer_set_samplers(renderer, 1, &src);
-
- renderer_set_fs(renderer, RENDERER_FS_TEXTURE);
- renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
-
- renderer_set_mvp(renderer, NULL);
-
- /* remember the texture size */
- renderer->u.copy.tex_width = src->texture->width0;
- renderer->u.copy.tex_height = src->texture->height0;
- renderer->state = RENDERER_STATE_COPY;
-
- return VG_TRUE;
-}
-
-/**
- * Draw into the destination rectangle given by (x, y, w, h). The texture is
- * sampled from within the rectangle given by (sx, sy, sw, sh).
- *
- * The coordinates are in surface coordinates.
- */
-void renderer_copy(struct renderer *renderer,
- VGint x, VGint y, VGint w, VGint h,
- VGint sx, VGint sy, VGint sw, VGint sh)
-{
- assert(renderer->state == RENDERER_STATE_COPY);
-
- /* there is no depth buffer for scissoring anyway */
- renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE);
- renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
- renderer->u.copy.tex_width,
- renderer->u.copy.tex_height);
-
- renderer_quad_draw(renderer);
-}
-
-/**
- * End copying and restore the states.
- */
-void renderer_copy_end(struct renderer *renderer)
-{
- assert(renderer->state == RENDERER_STATE_COPY);
-
- cso_restore_framebuffer(renderer->cso);
- cso_restore_viewport(renderer->cso);
- cso_restore_blend(renderer->cso);
- cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_restore_fragment_shader(renderer->cso);
- cso_restore_vertex_shader(renderer->cso);
-
- renderer->state = RENDERER_STATE_INIT;
-}
-
-/**
- * Prepare the renderer for textured drawing.
- */
-VGboolean renderer_drawtex_begin(struct renderer *renderer,
- struct pipe_sampler_view *src)
-{
- assert(renderer->state == RENDERER_STATE_INIT);
-
- if (!renderer_can_support(renderer, src->texture, PIPE_BIND_SAMPLER_VIEW))
- return VG_FALSE;
-
- cso_save_blend(renderer->cso);
- cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_save_fragment_shader(renderer->cso);
- cso_save_vertex_shader(renderer->cso);
-
- renderer_set_blend(renderer, ~0);
-
- renderer_set_samplers(renderer, 1, &src);
-
- renderer_set_fs(renderer, RENDERER_FS_TEXTURE);
- renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
-
- renderer_set_mvp(renderer, NULL);
-
- /* remember the texture size */
- renderer->u.drawtex.tex_width = src->texture->width0;
- renderer->u.drawtex.tex_height = src->texture->height0;
- renderer->state = RENDERER_STATE_DRAWTEX;
-
- return VG_TRUE;
-}
-
-/**
- * Draw into the destination rectangle given by (x, y, w, h). The texture is
- * sampled from within the rectangle given by (sx, sy, sw, sh).
- *
- * The coordinates are in surface coordinates.
- */
-void renderer_drawtex(struct renderer *renderer,
- VGint x, VGint y, VGint w, VGint h,
- VGint sx, VGint sy, VGint sw, VGint sh)
-{
- assert(renderer->state == RENDERER_STATE_DRAWTEX);
-
- /* with scissoring */
- renderer_quad_pos(renderer, x, y, x + w, y + h, VG_TRUE);
- renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
- renderer->u.drawtex.tex_width,
- renderer->u.drawtex.tex_height);
-
- renderer_quad_draw(renderer);
-}
-
-/**
- * End textured drawing and restore the states.
- */
-void renderer_drawtex_end(struct renderer *renderer)
-{
- assert(renderer->state == RENDERER_STATE_DRAWTEX);
-
- cso_restore_blend(renderer->cso);
- cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_restore_fragment_shader(renderer->cso);
- cso_restore_vertex_shader(renderer->cso);
-
- renderer->state = RENDERER_STATE_INIT;
-}
-
-/**
- * Prepare the renderer for scissor update. This will reset the depth buffer
- * to 1.0f.
- */
-VGboolean renderer_scissor_begin(struct renderer *renderer,
- VGboolean restore_dsa)
-{
- struct pipe_depth_stencil_alpha_state dsa;
-
- assert(renderer->state == RENDERER_STATE_INIT);
-
- if (restore_dsa)
- cso_save_depth_stencil_alpha(renderer->cso);
- cso_save_blend(renderer->cso);
- cso_save_fragment_shader(renderer->cso);
-
- /* enable depth writes */
- memset(&dsa, 0, sizeof(dsa));
- dsa.depth.enabled = 1;
- dsa.depth.writemask = 1;
- dsa.depth.func = PIPE_FUNC_ALWAYS;
- cso_set_depth_stencil_alpha(renderer->cso, &dsa);
-
- /* disable color writes */
- renderer_set_blend(renderer, 0);
- renderer_set_fs(renderer, RENDERER_FS_SCISSOR);
-
- renderer_set_mvp(renderer, NULL);
-
- renderer->u.scissor.restore_dsa = restore_dsa;
- renderer->state = RENDERER_STATE_SCISSOR;
-
- /* clear the depth buffer to 1.0f */
- renderer->pipe->clear(renderer->pipe,
- PIPE_CLEAR_DEPTHSTENCIL, NULL, 1.0f, 0);
-
- return VG_TRUE;
-}
-
-/**
- * Add a scissor rectangle. Depth values inside the rectangle will be set to
- * 0.0f.
- */
-void renderer_scissor(struct renderer *renderer,
- VGint x, VGint y, VGint width, VGint height)
-{
- assert(renderer->state == RENDERER_STATE_SCISSOR);
-
- renderer_quad_pos(renderer, x, y, x + width, y + height, VG_FALSE);
- renderer_quad_draw(renderer);
-}
-
-/**
- * End scissor update and restore the states.
- */
-void renderer_scissor_end(struct renderer *renderer)
-{
- assert(renderer->state == RENDERER_STATE_SCISSOR);
-
- if (renderer->u.scissor.restore_dsa)
- cso_restore_depth_stencil_alpha(renderer->cso);
- cso_restore_blend(renderer->cso);
- cso_restore_fragment_shader(renderer->cso);
-
- renderer->state = RENDERER_STATE_INIT;
-}
-
-/**
- * Prepare the renderer for clearing.
- */
-VGboolean renderer_clear_begin(struct renderer *renderer)
-{
- assert(renderer->state == RENDERER_STATE_INIT);
-
- cso_save_blend(renderer->cso);
- cso_save_fragment_shader(renderer->cso);
- cso_save_vertex_shader(renderer->cso);
-
- renderer_set_blend(renderer, ~0);
- renderer_set_fs(renderer, RENDERER_FS_COLOR);
- renderer_set_vs(renderer, RENDERER_VS_COLOR);
-
- renderer_set_mvp(renderer, NULL);
-
- renderer->state = RENDERER_STATE_CLEAR;
-
- return VG_TRUE;
-}
-
-/**
- * Clear the framebuffer with the specified region and color.
- *
- * The coordinates are in surface coordinates.
- */
-void renderer_clear(struct renderer *renderer,
- VGint x, VGint y, VGint width, VGint height,
- const VGfloat color[4])
-{
- VGuint i;
-
- assert(renderer->state == RENDERER_STATE_CLEAR);
-
- renderer_quad_pos(renderer, x, y, x + width, y + height, VG_TRUE);
- for (i = 0; i < 4; i++)
- memcpy(renderer->vertices[i][1], color, sizeof(VGfloat) * 4);
-
- renderer_quad_draw(renderer);
-}
-
-/**
- * End clearing and retore the states.
- */
-void renderer_clear_end(struct renderer *renderer)
-{
- assert(renderer->state == RENDERER_STATE_CLEAR);
-
- cso_restore_blend(renderer->cso);
- cso_restore_fragment_shader(renderer->cso);
- cso_restore_vertex_shader(renderer->cso);
-
- renderer->state = RENDERER_STATE_INIT;
-}
-
-/**
- * Prepare the renderer for image filtering.
- */
-VGboolean renderer_filter_begin(struct renderer *renderer,
- struct pipe_resource *dst,
- VGboolean y0_top,
- VGbitfield channel_mask,
- const struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **views,
- VGint num_samplers,
- void *fs,
- const void *const_buffer,
- VGint const_buffer_len)
-{
- struct pipe_surface *surf, surf_tmpl;
-
- assert(renderer->state == RENDERER_STATE_INIT);
-
- if (!fs)
- return VG_FALSE;
- if (!renderer_can_support(renderer, dst, PIPE_BIND_RENDER_TARGET))
- return VG_FALSE;
-
- u_surface_default_template(&surf_tmpl, dst);
- surf = renderer->pipe->create_surface(renderer->pipe, dst, &surf_tmpl);
- if (!surf)
- return VG_FALSE;
-
- cso_save_framebuffer(renderer->cso);
- cso_save_viewport(renderer->cso);
- cso_save_blend(renderer->cso);
-
- /* set the image as the target */
- renderer_set_target(renderer, surf, NULL, y0_top);
- pipe_surface_reference(&surf, NULL);
-
- renderer_set_blend(renderer, channel_mask);
-
- if (num_samplers) {
- struct pipe_resource *tex;
-
- cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_save_fragment_shader(renderer->cso);
- cso_save_vertex_shader(renderer->cso);
-
- renderer_set_custom_fs(renderer, fs,
- samplers, views, num_samplers,
- const_buffer, const_buffer_len);
- renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
-
- tex = views[0]->texture;
- renderer->u.filter.tex_width = tex->width0;
- renderer->u.filter.tex_height = tex->height0;
- renderer->u.filter.use_sampler = VG_TRUE;
- }
- else {
- cso_save_fragment_shader(renderer->cso);
-
- renderer_set_custom_fs(renderer, fs, NULL, NULL, 0,
- const_buffer, const_buffer_len);
-
- renderer->u.filter.use_sampler = VG_FALSE;
- }
-
- renderer_set_mvp(renderer, NULL);
-
- renderer->state = RENDERER_STATE_FILTER;
-
- return VG_TRUE;
-}
-
-/**
- * Draw into a rectangle of the destination with the specified region of the
- * texture(s).
- *
- * The coordinates are in surface coordinates.
- */
-void renderer_filter(struct renderer *renderer,
- VGint x, VGint y, VGint w, VGint h,
- VGint sx, VGint sy, VGint sw, VGint sh)
-{
- assert(renderer->state == RENDERER_STATE_FILTER);
-
- renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE);
- if (renderer->u.filter.use_sampler) {
- renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
- renderer->u.filter.tex_width,
- renderer->u.filter.tex_height);
- }
-
- renderer_quad_draw(renderer);
-}
-
-/**
- * End image filtering and restore the states.
- */
-void renderer_filter_end(struct renderer *renderer)
-{
- assert(renderer->state == RENDERER_STATE_FILTER);
-
- if (renderer->u.filter.use_sampler) {
- cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
- cso_restore_vertex_shader(renderer->cso);
- }
-
- cso_restore_framebuffer(renderer->cso);
- cso_restore_viewport(renderer->cso);
- cso_restore_blend(renderer->cso);
- cso_restore_fragment_shader(renderer->cso);
-
- renderer->state = RENDERER_STATE_INIT;
-}
-
-/**
- * Prepare the renderer for polygon silhouette rendering.
- */
-VGboolean renderer_polygon_stencil_begin(struct renderer *renderer,
- struct pipe_vertex_element *velem,
- VGFillRule rule,
- VGboolean restore_dsa)
-{
- struct pipe_depth_stencil_alpha_state *dsa;
- VGboolean manual_two_sides;
-
- assert(renderer->state == RENDERER_STATE_INIT);
-
- cso_save_vertex_elements(renderer->cso);
- cso_save_blend(renderer->cso);
- cso_save_depth_stencil_alpha(renderer->cso);
-
- cso_set_vertex_elements(renderer->cso, 1, velem);
-
- /* disable color writes */
- renderer_set_blend(renderer, 0);
-
- manual_two_sides = VG_FALSE;
- dsa = &renderer->u.polygon_stencil.dsa;
- memset(dsa, 0, sizeof(*dsa));
- if (rule == VG_EVEN_ODD) {
- dsa->stencil[0].enabled = 1;
- dsa->stencil[0].writemask = 1;
- dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
- dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
- dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INVERT;
- dsa->stencil[0].func = PIPE_FUNC_ALWAYS;
- dsa->stencil[0].valuemask = ~0;
- }
- else {
- assert(rule == VG_NON_ZERO);
-
- /* front face */
- dsa->stencil[0].enabled = 1;
- dsa->stencil[0].writemask = ~0;
- dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
- dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
- dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
- dsa->stencil[0].func = PIPE_FUNC_ALWAYS;
- dsa->stencil[0].valuemask = ~0;
-
- if (renderer->pipe->screen->get_param(renderer->pipe->screen,
- PIPE_CAP_TWO_SIDED_STENCIL)) {
- /* back face */
- dsa->stencil[1] = dsa->stencil[0];
- dsa->stencil[1].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
- }
- else {
- manual_two_sides = VG_TRUE;
- }
- }
- cso_set_depth_stencil_alpha(renderer->cso, dsa);
-
- if (manual_two_sides)
- cso_save_rasterizer(renderer->cso);
-
- renderer->u.polygon_stencil.manual_two_sides = manual_two_sides;
- renderer->u.polygon_stencil.restore_dsa = restore_dsa;
- renderer->state = RENDERER_STATE_POLYGON_STENCIL;
-
- return VG_TRUE;
-}
-
-/**
- * Render a polygon silhouette to stencil buffer.
- */
-void renderer_polygon_stencil(struct renderer *renderer,
- struct pipe_vertex_buffer *vbuf,
- VGuint mode, VGuint start, VGuint count)
-{
- assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL);
-
- cso_set_vertex_buffers(renderer->cso, 0, 1, vbuf);
-
- if (!renderer->u.polygon_stencil.manual_two_sides) {
- cso_draw_arrays(renderer->cso, mode, start, count);
- }
- else {
- struct pipe_rasterizer_state raster;
- struct pipe_depth_stencil_alpha_state dsa;
-
- raster = renderer->g3d.rasterizer;
- dsa = renderer->u.polygon_stencil.dsa;
-
- /* front */
- raster.cull_face = PIPE_FACE_BACK;
- dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
-
- cso_set_rasterizer(renderer->cso, &raster);
- cso_set_depth_stencil_alpha(renderer->cso, &dsa);
- cso_draw_arrays(renderer->cso, mode, start, count);
-
- /* back */
- raster.cull_face = PIPE_FACE_FRONT;
- dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
-
- cso_set_rasterizer(renderer->cso, &raster);
- cso_set_depth_stencil_alpha(renderer->cso, &dsa);
- cso_draw_arrays(renderer->cso, mode, start, count);
- }
-}
-
-/**
- * End polygon silhouette rendering.
- */
-void renderer_polygon_stencil_end(struct renderer *renderer)
-{
- assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL);
-
- if (renderer->u.polygon_stencil.manual_two_sides)
- cso_restore_rasterizer(renderer->cso);
-
- cso_restore_vertex_elements(renderer->cso);
-
- /* restore color writes */
- cso_restore_blend(renderer->cso);
-
- if (renderer->u.polygon_stencil.restore_dsa)
- cso_restore_depth_stencil_alpha(renderer->cso);
-
- renderer->state = RENDERER_STATE_INIT;
-}
-
-/**
- * Prepare the renderer for polygon filling.
- */
-VGboolean renderer_polygon_fill_begin(struct renderer *renderer,
- VGboolean save_dsa)
-{
- struct pipe_depth_stencil_alpha_state dsa;
-
- assert(renderer->state == RENDERER_STATE_INIT);
-
- if (save_dsa)
- cso_save_depth_stencil_alpha(renderer->cso);
-
- /* setup stencil ops */
- memset(&dsa, 0, sizeof(dsa));
- dsa.stencil[0].enabled = 1;
- dsa.stencil[0].func = PIPE_FUNC_NOTEQUAL;
- dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
- dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
- dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
- dsa.stencil[0].valuemask = ~0;
- dsa.stencil[0].writemask = ~0;
- dsa.depth = renderer->g3d.dsa.depth;
- cso_set_depth_stencil_alpha(renderer->cso, &dsa);
-
- renderer->state = RENDERER_STATE_POLYGON_FILL;
-
- return VG_TRUE;
-}
-
-/**
- * Fill a polygon.
- */
-void renderer_polygon_fill(struct renderer *renderer,
- VGfloat min_x, VGfloat min_y,
- VGfloat max_x, VGfloat max_y)
-{
- assert(renderer->state == RENDERER_STATE_POLYGON_FILL);
-
- renderer_quad_pos(renderer, min_x, min_y, max_x, max_y, VG_TRUE);
- renderer_quad_draw(renderer);
-}
-
-/**
- * End polygon filling.
- */
-void renderer_polygon_fill_end(struct renderer *renderer)
-{
- assert(renderer->state == RENDERER_STATE_POLYGON_FILL);
-
- cso_restore_depth_stencil_alpha(renderer->cso);
-
- renderer->state = RENDERER_STATE_INIT;
-}
-
-struct renderer * renderer_create(struct vg_context *owner)
-{
- struct renderer *renderer;
- struct pipe_rasterizer_state *raster;
- struct pipe_stencil_ref sr;
- VGint i;
-
- renderer = CALLOC_STRUCT(renderer);
- if (!renderer)
- return NULL;
-
- renderer->pipe = owner->pipe;
- renderer->cso = owner->cso_context;
-
- /* init vertex data that doesn't change */
- for (i = 0; i < 4; i++)
- renderer->vertices[i][0][3] = 1.0f; /* w */
-
- for (i = 0; i < 2; i++) {
- renderer->velems[i].src_offset = i * 4 * sizeof(float);
- renderer->velems[i].instance_divisor = 0;
- renderer->velems[i].vertex_buffer_index = 0;
- renderer->velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
- }
- cso_set_vertex_elements(renderer->cso, 2, renderer->velems);
-
- /* GL rasterization rules */
- raster = &renderer->g3d.rasterizer;
- memset(raster, 0, sizeof(*raster));
- raster->half_pixel_center = 1;
- raster->bottom_edge_rule = 1;
- raster->depth_clip = 1;
- cso_set_rasterizer(renderer->cso, raster);
-
- /* fixed at 0 */
- memset(&sr, 0, sizeof(sr));
- cso_set_stencil_ref(renderer->cso, &sr);
-
- renderer_set_vs(renderer, RENDERER_VS_PLAIN);
-
- renderer->state = RENDERER_STATE_INIT;
-
- return renderer;
-}
-
-void renderer_destroy(struct renderer *ctx)
-{
- int i;
-
- for (i = 0; i < NUM_RENDERER_VS; i++) {
- if (ctx->cached_vs[i])
- cso_delete_vertex_shader(ctx->cso, ctx->cached_vs[i]);
- }
- for (i = 0; i < NUM_RENDERER_FS; i++) {
- if (ctx->cached_fs[i])
- cso_delete_fragment_shader(ctx->cso, ctx->cached_fs[i]);
- }
-
- pipe_resource_reference(&ctx->vs_cbuf, NULL);
- pipe_resource_reference(&ctx->fs_cbuf, NULL);
-
- FREE(ctx);
-}
-
-static void update_clip_state(struct renderer *renderer,
- const struct vg_state *state)
-{
- struct pipe_depth_stencil_alpha_state *dsa = &renderer->g3d.dsa;
-
- memset(dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
-
- if (state->scissoring) {
- struct pipe_framebuffer_state *fb = &renderer->g3d.fb;
- int i;
-
- renderer_scissor_begin(renderer, VG_FALSE);
-
- for (i = 0; i < state->scissor_rects_num; ++i) {
- const float x = state->scissor_rects[i * 4 + 0].f;
- const float y = state->scissor_rects[i * 4 + 1].f;
- const float width = state->scissor_rects[i * 4 + 2].f;
- const float height = state->scissor_rects[i * 4 + 3].f;
- VGint x0, y0, x1, y1, iw, ih;
-
- x0 = (VGint) x;
- y0 = (VGint) y;
- if (x0 < 0)
- x0 = 0;
- if (y0 < 0)
- y0 = 0;
-
- /* note that x1 and y1 are exclusive */
- x1 = (VGint) ceilf(x + width);
- y1 = (VGint) ceilf(y + height);
- if (x1 > fb->width)
- x1 = fb->width;
- if (y1 > fb->height)
- y1 = fb->height;
-
- iw = x1 - x0;
- ih = y1 - y0;
- if (iw > 0 && ih> 0 )
- renderer_scissor(renderer, x0, y0, iw, ih);
- }
-
- renderer_scissor_end(renderer);
-
- dsa->depth.enabled = 1; /* glEnable(GL_DEPTH_TEST); */
- dsa->depth.writemask = 0;/*glDepthMask(FALSE);*/
- dsa->depth.func = PIPE_FUNC_GEQUAL;
- }
-}
-
-static void renderer_validate_blend(struct renderer *renderer,
- const struct vg_state *state,
- enum pipe_format fb_format)
-{
- struct pipe_blend_state blend;
-
- memset(&blend, 0, sizeof(blend));
- blend.rt[0].colormask = PIPE_MASK_RGBA;
- blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
- blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
- blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
- blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
-
- /* TODO alpha masking happens after blending? */
-
- switch (state->blend_mode) {
- case VG_BLEND_SRC:
- blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
- blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
- blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
- blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
- break;
- case VG_BLEND_SRC_OVER:
- /* use the blend state only when there is no alpha channel */
- if (!util_format_has_alpha(fb_format)) {
- blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
- blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
- blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
- blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
- blend.rt[0].blend_enable = 1;
- }
- break;
- case VG_BLEND_SRC_IN:
- blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
- blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_DST_ALPHA;
- blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
- blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
- blend.rt[0].blend_enable = 1;
- break;
- case VG_BLEND_DST_IN:
- blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ZERO;
- blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
- blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ONE;
- blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
- blend.rt[0].blend_enable = 1;
- break;
- case VG_BLEND_DST_OVER:
- case VG_BLEND_MULTIPLY:
- case VG_BLEND_SCREEN:
- case VG_BLEND_DARKEN:
- case VG_BLEND_LIGHTEN:
- case VG_BLEND_ADDITIVE:
- /* need a shader */
- break;
- default:
- assert(!"not implemented blend mode");
- break;
- }
-
- cso_set_blend(renderer->cso, &blend);
-}
-
-/**
- * Propogate OpenVG state changes to the renderer. Only framebuffer, blending
- * and scissoring states are relevant here.
- */
-void renderer_validate(struct renderer *renderer,
- VGbitfield dirty,
- const struct st_framebuffer *stfb,
- const struct vg_state *state)
-{
- assert(renderer->state == RENDERER_STATE_INIT);
-
- dirty |= renderer->dirty;
- renderer->dirty = 0;
-
- if (dirty & FRAMEBUFFER_DIRTY) {
- struct pipe_framebuffer_state *fb = &renderer->g3d.fb;
- struct matrix *proj = &renderer->projection;
-
- memset(fb, 0, sizeof(struct pipe_framebuffer_state));
- fb->width = stfb->width;
- fb->height = stfb->height;
- fb->nr_cbufs = 1;
- fb->cbufs[0] = stfb->strb->surface;
- fb->zsbuf = stfb->dsrb->surface;
-
- cso_set_framebuffer(renderer->cso, fb);
- vg_set_viewport(renderer, VEGA_Y0_BOTTOM);
-
- matrix_load_identity(proj);
- matrix_translate(proj, -1.0f, -1.0f);
- matrix_scale(proj, 2.0f / fb->width, 2.0f / fb->height);
-
- /* we also got a new depth buffer */
- if (dirty & DEPTH_STENCIL_DIRTY) {
- renderer->pipe->clear(renderer->pipe,
- PIPE_CLEAR_DEPTHSTENCIL, NULL, 0.0, 0);
- }
- }
-
- /* must be last because it renders to the depth buffer*/
- if (dirty & DEPTH_STENCIL_DIRTY) {
- update_clip_state(renderer, state);
- cso_set_depth_stencil_alpha(renderer->cso, &renderer->g3d.dsa);
- }
-
- if (dirty & BLEND_DIRTY)
- renderer_validate_blend(renderer, state, stfb->strb->format);
-}
-
-/**
- * Prepare the renderer for OpenVG pipeline.
- */
-void renderer_validate_for_shader(struct renderer *renderer,
- const struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **views,
- VGint num_samplers,
- const struct matrix *modelview,
- void *fs,
- const void *const_buffer,
- VGint const_buffer_len)
-{
- struct matrix mvp = renderer->projection;
-
- /* will be used in POLYGON_STENCIL and POLYGON_FILL */
- matrix_mult(&mvp, modelview);
- renderer_set_mvp(renderer, &mvp);
-
- renderer_set_custom_fs(renderer, fs,
- samplers, views, num_samplers,
- const_buffer, const_buffer_len);
-}
-
-void renderer_validate_for_mask_rendering(struct renderer *renderer,
- struct pipe_surface *dst,
- const struct matrix *modelview)
-{
- struct matrix mvp = renderer->projection;
-
- /* will be used in POLYGON_STENCIL and POLYGON_FILL */
- matrix_mult(&mvp, modelview);
- renderer_set_mvp(renderer, &mvp);
-
- renderer_set_target(renderer, dst, renderer->g3d.fb.zsbuf, VG_FALSE);
- renderer_set_blend(renderer, ~0);
- renderer_set_fs(renderer, RENDERER_FS_WHITE);
-
- /* set internal dirty flags (hacky!) */
- renderer->dirty = FRAMEBUFFER_DIRTY | BLEND_DIRTY;
-}
-
-void renderer_copy_surface(struct renderer *ctx,
- struct pipe_surface *src,
- int srcX0, int srcY0,
- int srcX1, int srcY1,
- struct pipe_surface *dst,
- int dstX0, int dstY0,
- int dstX1, int dstY1,
- float z, unsigned filter)
-{
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_screen *screen = pipe->screen;
- struct pipe_sampler_view view_templ;
- struct pipe_sampler_view *view;
- struct pipe_box src_box;
- struct pipe_resource texTemp, *tex;
- const struct pipe_framebuffer_state *fb = &ctx->g3d.fb;
- const int srcW = abs(srcX1 - srcX0);
- const int srcH = abs(srcY1 - srcY0);
- const int srcLeft = MIN2(srcX0, srcX1);
- const int srcTop = MIN2(srcY0, srcY1);
-
- assert(filter == PIPE_TEX_MIPFILTER_NEAREST ||
- filter == PIPE_TEX_MIPFILTER_LINEAR);
-
- if (srcLeft != srcX0) {
- /* left-right flip */
- int tmp = dstX0;
- dstX0 = dstX1;
- dstX1 = tmp;
- }
-
- if (srcTop != srcY0) {
- /* up-down flip */
- int tmp = dstY0;
- dstY0 = dstY1;
- dstY1 = tmp;
- }
-
- assert(screen->is_format_supported(screen, src->format, PIPE_TEXTURE_2D,
- 0, PIPE_BIND_SAMPLER_VIEW));
- assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
- 0, PIPE_BIND_SAMPLER_VIEW));
- assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
- 0, PIPE_BIND_RENDER_TARGET));
-
- /*
- * XXX for now we're always creating a temporary texture.
- * Strictly speaking that's not always needed.
- */
-
- /* create temp texture */
- memset(&texTemp, 0, sizeof(texTemp));
- texTemp.target = PIPE_TEXTURE_2D;
- texTemp.format = src->format;
- texTemp.last_level = 0;
- texTemp.width0 = srcW;
- texTemp.height0 = srcH;
- texTemp.depth0 = 1;
- texTemp.array_size = 1;
- texTemp.bind = PIPE_BIND_SAMPLER_VIEW;
-
- tex = screen->resource_create(screen, &texTemp);
- if (!tex)
- return;
-
- u_sampler_view_default_template(&view_templ, tex, tex->format);
- view = pipe->create_sampler_view(pipe, tex, &view_templ);
-
- if (!view)
- return;
-
- u_box_2d_zslice(srcLeft, srcTop, src->u.tex.first_layer, srcW, srcH, &src_box);
-
- pipe->resource_copy_region(pipe,
- tex, 0, 0, 0, 0, /* dest */
- src->texture, 0, &src_box);
-
- assert(floatsEqual(z, 0.0f));
-
- /* draw */
- if (fb->cbufs[0] == dst) {
- /* transform back to surface coordinates */
- dstY0 = dst->height - dstY0;
- dstY1 = dst->height - dstY1;
-
- if (renderer_drawtex_begin(ctx, view)) {
- renderer_drawtex(ctx,
- dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0,
- 0, 0, view->texture->width0, view->texture->height0);
- renderer_drawtex_end(ctx);
- }
- }
- else {
- if (renderer_copy_begin(ctx, dst, VG_TRUE, view)) {
- renderer_copy(ctx,
- dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0,
- 0, 0, view->texture->width0, view->texture->height0);
- renderer_copy_end(ctx);
- }
- }
-}
-
-void renderer_texture_quad(struct renderer *r,
- struct pipe_resource *tex,
- VGfloat x1offset, VGfloat y1offset,
- VGfloat x2offset, VGfloat y2offset,
- VGfloat x1, VGfloat y1,
- VGfloat x2, VGfloat y2,
- VGfloat x3, VGfloat y3,
- VGfloat x4, VGfloat y4)
-{
- const VGfloat z = 0.0f;
-
- assert(r->state == RENDERER_STATE_INIT);
- assert(tex->width0 != 0);
- assert(tex->height0 != 0);
-
- cso_save_vertex_shader(r->cso);
-
- renderer_set_vs(r, RENDERER_VS_TEXTURE);
-
- /* manually set up positions */
- r->vertices[0][0][0] = x1;
- r->vertices[0][0][1] = y1;
- r->vertices[0][0][2] = z;
-
- r->vertices[1][0][0] = x2;
- r->vertices[1][0][1] = y2;
- r->vertices[1][0][2] = z;
-
- r->vertices[2][0][0] = x3;
- r->vertices[2][0][1] = y3;
- r->vertices[2][0][2] = z;
-
- r->vertices[3][0][0] = x4;
- r->vertices[3][0][1] = y4;
- r->vertices[3][0][2] = z;
-
- /* texcoords */
- renderer_quad_texcoord(r, x1offset, y1offset,
- x2offset, y2offset, tex->width0, tex->height0);
-
- renderer_quad_draw(r);
-
- cso_restore_vertex_shader(r->cso);
-}
diff --git a/src/gallium/state_trackers/vega/renderer.h b/src/gallium/state_trackers/vega/renderer.h
deleted file mode 100644
index fe719936580..00000000000
--- a/src/gallium/state_trackers/vega/renderer.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- * Copyright 2010 LunarG, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef RENDERER_H
-#define RENDERER_H
-
-#include "VG/openvg.h"
-
-struct renderer;
-
-struct vg_context;
-struct vg_state;
-struct st_framebuffer;
-struct pipe_resource;
-struct pipe_sampler_state;
-struct pipe_sampler_view;
-struct pipe_surface;
-struct pipe_vertex_element;
-struct pipe_vertex_buffer;
-struct matrix;
-
-struct renderer *renderer_create(struct vg_context *owner);
-void renderer_destroy(struct renderer *);
-
-void renderer_validate(struct renderer *renderer,
- VGbitfield dirty,
- const struct st_framebuffer *stfb,
- const struct vg_state *state);
-
-void renderer_validate_for_shader(struct renderer *renderer,
- const struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **views,
- VGint num_samplers,
- const struct matrix *modelview,
- void *fs,
- const void *const_buffer,
- VGint const_buffer_len);
-
-void renderer_validate_for_mask_rendering(struct renderer *renderer,
- struct pipe_surface *dst,
- const struct matrix *modelview);
-
-VGboolean renderer_copy_begin(struct renderer *renderer,
- struct pipe_surface *dst,
- VGboolean y0_top,
- struct pipe_sampler_view *src);
-
-void renderer_copy(struct renderer *renderer,
- VGint x, VGint y, VGint w, VGint h,
- VGint sx, VGint sy, VGint sw, VGint sh);
-
-void renderer_copy_end(struct renderer *renderer);
-
-VGboolean renderer_drawtex_begin(struct renderer *renderer,
- struct pipe_sampler_view *src);
-
-void renderer_drawtex(struct renderer *renderer,
- VGint x, VGint y, VGint w, VGint h,
- VGint sx, VGint sy, VGint sw, VGint sh);
-
-void renderer_drawtex_end(struct renderer *renderer);
-
-VGboolean renderer_scissor_begin(struct renderer *renderer,
- VGboolean restore_dsa);
-
-void renderer_scissor(struct renderer *renderer,
- VGint x, VGint y, VGint width, VGint height);
-
-void renderer_scissor_end(struct renderer *renderer);
-
-VGboolean renderer_clear_begin(struct renderer *renderer);
-
-void renderer_clear(struct renderer *renderer,
- VGint x, VGint y, VGint width, VGint height,
- const VGfloat color[4]);
-
-void renderer_clear_end(struct renderer *renderer);
-
-VGboolean renderer_filter_begin(struct renderer *renderer,
- struct pipe_resource *dst,
- VGboolean y0_top,
- VGbitfield channel_mask,
- const struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **views,
- VGint num_samplers,
- void *fs,
- const void *const_buffer,
- VGint const_buffer_len);
-
-void renderer_filter(struct renderer *renderer,
- VGint x, VGint y, VGint w, VGint h,
- VGint sx, VGint sy, VGint sw, VGint sh);
-
-void renderer_filter_end(struct renderer *renderer);
-
-VGboolean renderer_polygon_stencil_begin(struct renderer *renderer,
- struct pipe_vertex_element *velem,
- VGFillRule rule,
- VGboolean restore_dsa);
-
-void renderer_polygon_stencil(struct renderer *renderer,
- struct pipe_vertex_buffer *vbuf,
- VGuint mode, VGuint start, VGuint count);
-
-void renderer_polygon_stencil_end(struct renderer *renderer);
-
-VGboolean renderer_polygon_fill_begin(struct renderer *renderer,
- VGboolean save_dsa);
-
-void renderer_polygon_fill(struct renderer *renderer,
- VGfloat min_x, VGfloat min_y,
- VGfloat max_x, VGfloat max_y);
-
-void renderer_polygon_fill_end(struct renderer *renderer);
-
-void renderer_texture_quad(struct renderer *,
- struct pipe_resource *texture,
- VGfloat x1offset, VGfloat y1offset,
- VGfloat x2offset, VGfloat y2offset,
- VGfloat x1, VGfloat y1,
- VGfloat x2, VGfloat y2,
- VGfloat x3, VGfloat y3,
- VGfloat x4, VGfloat y4);
-
-void renderer_copy_surface(struct renderer *r,
- struct pipe_surface *src,
- int sx1, int sy1,
- int sx2, int sy2,
- struct pipe_surface *dst,
- int dx1, int dy1,
- int dx2, int dy2,
- float z, unsigned filter);
-
-
-#endif
diff --git a/src/gallium/state_trackers/vega/shader.c b/src/gallium/state_trackers/vega/shader.c
deleted file mode 100644
index 09ba4049cb6..00000000000
--- a/src/gallium/state_trackers/vega/shader.c
+++ /dev/null
@@ -1,414 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "shader.h"
-
-#include "vg_context.h"
-#include "shaders_cache.h"
-#include "paint.h"
-#include "mask.h"
-#include "image.h"
-#include "renderer.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_state.h"
-#include "util/u_memory.h"
-#include "util/u_math.h"
-#include "util/u_format.h"
-
-#define MAX_CONSTANTS 28
-
-struct shader {
- struct vg_context *context;
-
- VGboolean color_transform;
- VGboolean masking;
- struct vg_paint *paint;
- struct vg_image *image;
-
- struct matrix modelview;
- struct matrix paint_matrix;
-
- VGboolean drawing_image;
- VGImageMode image_mode;
-
- float constants[MAX_CONSTANTS];
- struct pipe_resource *cbuf;
- struct pipe_shader_state fs_state;
- void *fs;
-};
-
-struct shader * shader_create(struct vg_context *ctx)
-{
- struct shader *shader = 0;
-
- shader = CALLOC_STRUCT(shader);
- shader->context = ctx;
-
- return shader;
-}
-
-void shader_destroy(struct shader *shader)
-{
- FREE(shader);
-}
-
-void shader_set_color_transform(struct shader *shader, VGboolean set)
-{
- shader->color_transform = set;
-}
-
-void shader_set_masking(struct shader *shader, VGboolean set)
-{
- shader->masking = set;
-}
-
-VGboolean shader_is_masking(struct shader *shader)
-{
- return shader->masking;
-}
-
-void shader_set_paint(struct shader *shader, struct vg_paint *paint)
-{
- shader->paint = paint;
-}
-
-struct vg_paint * shader_paint(struct shader *shader)
-{
- return shader->paint;
-}
-
-static VGint setup_constant_buffer(struct shader *shader)
-{
- const struct vg_state *state = &shader->context->state.vg;
- VGint param_bytes = paint_constant_buffer_size(shader->paint);
- VGint i;
-
- param_bytes += sizeof(VGfloat) * 8;
- assert(param_bytes <= sizeof(shader->constants));
-
- if (state->color_transform) {
- for (i = 0; i < 8; i++) {
- VGfloat val = (i < 4) ? 127.0f : 1.0f;
- shader->constants[i] =
- CLAMP(state->color_transform_values[i], -val, val);
- }
- }
- else {
- memset(shader->constants, 0, sizeof(VGfloat) * 8);
- }
-
- paint_fill_constant_buffer(shader->paint,
- &shader->paint_matrix, shader->constants + 8);
-
- return param_bytes;
-}
-
-static VGboolean blend_use_shader(struct shader *shader)
-{
- struct vg_context *ctx = shader->context;
- VGboolean advanced_blending;
-
- switch (ctx->state.vg.blend_mode) {
- case VG_BLEND_DST_OVER:
- case VG_BLEND_MULTIPLY:
- case VG_BLEND_SCREEN:
- case VG_BLEND_DARKEN:
- case VG_BLEND_LIGHTEN:
- case VG_BLEND_ADDITIVE:
- advanced_blending = VG_TRUE;
- break;
- case VG_BLEND_SRC_OVER:
- if (util_format_has_alpha(ctx->draw_buffer->strb->format)) {
- /* no blending is required if the paints and the image are opaque */
- advanced_blending = !paint_is_opaque(ctx->state.vg.fill_paint) ||
- !paint_is_opaque(ctx->state.vg.stroke_paint);
- if (!advanced_blending && shader->drawing_image) {
- advanced_blending =
- util_format_has_alpha(shader->image->sampler_view->format);
- }
- break;
- }
- /* fall through */
- default:
- advanced_blending = VG_FALSE;
- break;
- }
-
- return advanced_blending;
-}
-
-static VGint blend_bind_samplers(struct shader *shader,
- struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **sampler_views)
-{
- if (blend_use_shader(shader)) {
- struct vg_context *ctx = shader->context;
-
- samplers[2] = &ctx->blend_sampler;
- sampler_views[2] = vg_prepare_blend_surface(ctx);
-
- if (!samplers[0] || !sampler_views[0]) {
- samplers[0] = samplers[2];
- sampler_views[0] = sampler_views[2];
- }
- if (!samplers[1] || !sampler_views[1]) {
- samplers[1] = samplers[0];
- sampler_views[1] = sampler_views[0];
- }
-
- return 1;
- }
- return 0;
-}
-
-static VGint setup_samplers(struct shader *shader,
- struct pipe_sampler_state **samplers,
- struct pipe_sampler_view **sampler_views)
-{
- /* a little wonky: we use the num as a boolean that just says
- * whether any sampler/textures have been set. the actual numbering
- * for samplers is always the same:
- * 0 - paint sampler/texture for gradient/pattern
- * 1 - mask sampler/texture
- * 2 - blend sampler/texture
- * 3 - image sampler/texture
- * */
- VGint num = 0;
-
- samplers[0] = NULL;
- samplers[1] = NULL;
- samplers[2] = NULL;
- samplers[3] = NULL;
- sampler_views[0] = NULL;
- sampler_views[1] = NULL;
- sampler_views[2] = NULL;
- sampler_views[3] = NULL;
-
- num += paint_bind_samplers(shader->paint, samplers, sampler_views);
- num += mask_bind_samplers(samplers, sampler_views);
- num += blend_bind_samplers(shader, samplers, sampler_views);
- if (shader->drawing_image && shader->image)
- num += image_bind_samplers(shader->image, samplers, sampler_views);
-
- return (num) ? 4 : 0;
-}
-
-static INLINE VGboolean is_format_bw(struct shader *shader)
-{
-#if 0
- struct vg_context *ctx = shader->context;
- struct st_framebuffer *stfb = ctx->draw_buffer;
-#endif
-
- if (shader->drawing_image && shader->image) {
- if (shader->image->format == VG_BW_1)
- return VG_TRUE;
- }
-
- return VG_FALSE;
-}
-
-static void setup_shader_program(struct shader *shader)
-{
- struct vg_context *ctx = shader->context;
- VGint shader_id = 0;
- VGBlendMode blend_mode = ctx->state.vg.blend_mode;
- VGboolean black_white = is_format_bw(shader);
-
- /* 1st stage: fill */
- if (!shader->drawing_image ||
- (shader->image_mode == VG_DRAW_IMAGE_MULTIPLY || shader->image_mode == VG_DRAW_IMAGE_STENCIL)) {
- switch(paint_type(shader->paint)) {
- case VG_PAINT_TYPE_COLOR:
- shader_id |= VEGA_SOLID_FILL_SHADER;
- break;
- case VG_PAINT_TYPE_LINEAR_GRADIENT:
- shader_id |= VEGA_LINEAR_GRADIENT_SHADER;
- break;
- case VG_PAINT_TYPE_RADIAL_GRADIENT:
- shader_id |= VEGA_RADIAL_GRADIENT_SHADER;
- break;
- case VG_PAINT_TYPE_PATTERN:
- shader_id |= VEGA_PATTERN_SHADER;
- break;
-
- default:
- abort();
- }
-
- if (paint_is_degenerate(shader->paint))
- shader_id = VEGA_PAINT_DEGENERATE_SHADER;
- }
-
- /* second stage image */
- if (shader->drawing_image) {
- switch(shader->image_mode) {
- case VG_DRAW_IMAGE_NORMAL:
- shader_id |= VEGA_IMAGE_NORMAL_SHADER;
- break;
- case VG_DRAW_IMAGE_MULTIPLY:
- shader_id |= VEGA_IMAGE_MULTIPLY_SHADER;
- break;
- case VG_DRAW_IMAGE_STENCIL:
- shader_id |= VEGA_IMAGE_STENCIL_SHADER;
- break;
- default:
- debug_printf("Unknown image mode!");
- }
- }
-
- if (shader->color_transform)
- shader_id |= VEGA_COLOR_TRANSFORM_SHADER;
-
- if (blend_use_shader(shader)) {
- if (shader->drawing_image && shader->image_mode == VG_DRAW_IMAGE_STENCIL)
- shader_id |= VEGA_ALPHA_PER_CHANNEL_SHADER;
- else
- shader_id |= VEGA_ALPHA_NORMAL_SHADER;
-
- switch(blend_mode) {
- case VG_BLEND_SRC:
- shader_id |= VEGA_BLEND_SRC_SHADER;
- break;
- case VG_BLEND_SRC_OVER:
- shader_id |= VEGA_BLEND_SRC_OVER_SHADER;
- break;
- case VG_BLEND_DST_OVER:
- shader_id |= VEGA_BLEND_DST_OVER_SHADER;
- break;
- case VG_BLEND_SRC_IN:
- shader_id |= VEGA_BLEND_SRC_IN_SHADER;
- break;
- case VG_BLEND_DST_IN:
- shader_id |= VEGA_BLEND_DST_IN_SHADER;
- break;
- case VG_BLEND_MULTIPLY:
- shader_id |= VEGA_BLEND_MULTIPLY_SHADER;
- break;
- case VG_BLEND_SCREEN:
- shader_id |= VEGA_BLEND_SCREEN_SHADER;
- break;
- case VG_BLEND_DARKEN:
- shader_id |= VEGA_BLEND_DARKEN_SHADER;
- break;
- case VG_BLEND_LIGHTEN:
- shader_id |= VEGA_BLEND_LIGHTEN_SHADER;
- break;
- case VG_BLEND_ADDITIVE:
- shader_id |= VEGA_BLEND_ADDITIVE_SHADER;
- break;
- default:
- assert(0);
- break;
- }
- }
- else {
- /* update alpha of the source */
- if (shader->drawing_image && shader->image_mode == VG_DRAW_IMAGE_STENCIL)
- shader_id |= VEGA_ALPHA_PER_CHANNEL_SHADER;
- }
-
- if (shader->masking)
- shader_id |= VEGA_MASK_SHADER;
-
- if (black_white)
- shader_id |= VEGA_BW_SHADER;
-
- shader->fs = shaders_cache_fill(ctx->sc, shader_id);
-}
-
-
-void shader_bind(struct shader *shader)
-{
- struct vg_context *ctx = shader->context;
- struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
- struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
- VGint num_samplers, param_bytes;
-
- /* first resolve the real paint type */
- paint_resolve_type(shader->paint);
-
- num_samplers = setup_samplers(shader, samplers, sampler_views);
- param_bytes = setup_constant_buffer(shader);
- setup_shader_program(shader);
-
- renderer_validate_for_shader(ctx->renderer,
- (const struct pipe_sampler_state **) samplers,
- sampler_views, num_samplers,
- &shader->modelview,
- shader->fs, (const void *) shader->constants, param_bytes);
-}
-
-void shader_set_image_mode(struct shader *shader, VGImageMode image_mode)
-{
- shader->image_mode = image_mode;
-}
-
-VGImageMode shader_image_mode(struct shader *shader)
-{
- return shader->image_mode;
-}
-
-void shader_set_drawing_image(struct shader *shader, VGboolean drawing_image)
-{
- shader->drawing_image = drawing_image;
-}
-
-VGboolean shader_drawing_image(struct shader *shader)
-{
- return shader->drawing_image;
-}
-
-void shader_set_image(struct shader *shader, struct vg_image *img)
-{
- shader->image = img;
-}
-
-/**
- * Set the transformation to map a vertex to the surface coordinates.
- */
-void shader_set_surface_matrix(struct shader *shader,
- const struct matrix *mat)
-{
- shader->modelview = *mat;
-}
-
-/**
- * Set the transformation to map a pixel to the paint coordinates.
- */
-void shader_set_paint_matrix(struct shader *shader, const struct matrix *mat)
-{
- const struct st_framebuffer *stfb = shader->context->draw_buffer;
- const VGfloat px_center_offset = 0.5f;
-
- memcpy(&shader->paint_matrix, mat, sizeof(*mat));
-
- /* make it window-to-paint for the shaders */
- matrix_translate(&shader->paint_matrix, px_center_offset,
- stfb->height - 1.0f + px_center_offset);
- matrix_scale(&shader->paint_matrix, 1.0f, -1.0f);
-}
diff --git a/src/gallium/state_trackers/vega/shader.h b/src/gallium/state_trackers/vega/shader.h
deleted file mode 100644
index 8b97e537efe..00000000000
--- a/src/gallium/state_trackers/vega/shader.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef SHADER_H
-#define SHADER_H
-
-#include "VG/openvg.h"
-
-struct shader;
-struct vg_paint;
-struct vg_context;
-struct vg_image;
-struct matrix;
-
-struct shader *shader_create(struct vg_context *context);
-void shader_destroy(struct shader *shader);
-
-void shader_set_color_transform(struct shader *shader, VGboolean set);
-
-void shader_set_masking(struct shader *shader, VGboolean set);
-VGboolean shader_is_masking(struct shader *shader);
-
-void shader_set_paint(struct shader *shader, struct vg_paint *paint);
-struct vg_paint *shader_paint(struct shader *shader);
-
-void shader_set_image_mode(struct shader *shader, VGImageMode image_mode);
-VGImageMode shader_image_mode(struct shader *shader);
-
-void shader_set_drawing_image(struct shader *shader, VGboolean drawing_image);
-VGboolean shader_drawing_image(struct shader *shader);
-
-void shader_set_image(struct shader *shader, struct vg_image *img);
-
-void shader_set_surface_matrix(struct shader *shader,
- const struct matrix *mat);
-void shader_set_paint_matrix(struct shader *shader, const struct matrix *mat);
-
-void shader_bind(struct shader *shader);
-
-#endif
diff --git a/src/gallium/state_trackers/vega/shaders_cache.c b/src/gallium/state_trackers/vega/shaders_cache.c
deleted file mode 100644
index c1082ca3673..00000000000
--- a/src/gallium/state_trackers/vega/shaders_cache.c
+++ /dev/null
@@ -1,462 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "shaders_cache.h"
-
-#include "vg_context.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_shader_tokens.h"
-
-#include "tgsi/tgsi_build.h"
-#include "tgsi/tgsi_dump.h"
-#include "tgsi/tgsi_parse.h"
-#include "tgsi/tgsi_util.h"
-#include "tgsi/tgsi_text.h"
-
-#include "util/u_memory.h"
-#include "util/u_math.h"
-#include "util/u_debug.h"
-#include "cso_cache/cso_hash.h"
-#include "cso_cache/cso_context.h"
-
-#include "VG/openvg.h"
-
-#include "asm_fill.h"
-
-/* Essentially we construct an ubber-shader based on the state
- * of the pipeline. The stages are:
- * 1) Paint generation (color/gradient/pattern)
- * 2) Image composition (normal/multiply/stencil)
- * 3) Color transform
- * 4) Per-channel alpha generation
- * 5) Extended blend (multiply/screen/darken/lighten)
- * 6) Mask
- * 7) Premultiply/Unpremultiply
- * 8) Color transform (to black and white)
- */
-#define SHADER_STAGES 8
-
-struct cached_shader {
- void *driver_shader;
- struct pipe_shader_state state;
-};
-
-struct shaders_cache {
- struct vg_context *pipe;
-
- struct cso_hash *hash;
-};
-
-
-static INLINE struct tgsi_token *tokens_from_assembly(const char *txt, int num_tokens)
-{
- struct tgsi_token *tokens;
-
- tokens = (struct tgsi_token *) MALLOC(num_tokens * sizeof(tokens[0]));
-
- tgsi_text_translate(txt, tokens, num_tokens);
-
-#if DEBUG_SHADERS
- tgsi_dump(tokens, 0);
-#endif
-
- return tokens;
-}
-
-/*
-static const char max_shader_preamble[] =
- "FRAG\n"
- "DCL IN[0], POSITION, LINEAR\n"
- "DCL IN[1], GENERIC[0], PERSPECTIVE\n"
- "DCL OUT[0], COLOR, CONSTANT\n"
- "DCL CONST[0..9], CONSTANT\n"
- "DCL TEMP[0..9], CONSTANT\n"
- "DCL SAMP[0..9], CONSTANT\n";
-
- max_shader_preamble strlen == 175
-*/
-#define MAX_PREAMBLE 175
-
-static INLINE VGint range_min(VGint min, VGint current)
-{
- if (min < 0)
- min = current;
- else
- min = MIN2(min, current);
- return min;
-}
-
-static INLINE VGint range_max(VGint max, VGint current)
-{
- return MAX2(max, current);
-}
-
-static void *
-combine_shaders(const struct shader_asm_info *shaders[SHADER_STAGES], int num_shaders,
- struct pipe_context *pipe,
- struct pipe_shader_state *shader)
-{
- VGboolean declare_input = VG_FALSE;
- VGint start_const = -1, end_const = 0;
- VGint start_temp = -1, end_temp = 0;
- VGint start_sampler = -1, end_sampler = 0;
- VGint i, current_shader = 0;
- VGint num_consts, num_temps, num_samplers;
- struct ureg_program *ureg;
- struct ureg_src in[2];
- struct ureg_src *sampler = NULL;
- struct ureg_src *constant = NULL;
- struct ureg_dst out, *temp = NULL;
- void *p = NULL;
-
- for (i = 0; i < num_shaders; ++i) {
- if (shaders[i]->num_consts)
- start_const = range_min(start_const, shaders[i]->start_const);
- if (shaders[i]->num_temps)
- start_temp = range_min(start_temp, shaders[i]->start_temp);
- if (shaders[i]->num_samplers)
- start_sampler = range_min(start_sampler, shaders[i]->start_sampler);
-
- end_const = range_max(end_const, shaders[i]->start_const +
- shaders[i]->num_consts);
- end_temp = range_max(end_temp, shaders[i]->start_temp +
- shaders[i]->num_temps);
- end_sampler = range_max(end_sampler, shaders[i]->start_sampler +
- shaders[i]->num_samplers);
- if (shaders[i]->needs_position)
- declare_input = VG_TRUE;
- }
- /* if they're still unitialized, initialize them */
- if (start_const < 0)
- start_const = 0;
- if (start_temp < 0)
- start_temp = 0;
- if (start_sampler < 0)
- start_sampler = 0;
-
- num_consts = end_const - start_const;
- num_temps = end_temp - start_temp;
- num_samplers = end_sampler - start_sampler;
-
- ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
- if (!ureg)
- return NULL;
-
- if (declare_input) {
- in[0] = ureg_DECL_fs_input(ureg,
- TGSI_SEMANTIC_POSITION,
- 0,
- TGSI_INTERPOLATE_LINEAR);
- in[1] = ureg_DECL_fs_input(ureg,
- TGSI_SEMANTIC_GENERIC,
- 0,
- TGSI_INTERPOLATE_PERSPECTIVE);
- }
-
- /* we always have a color output */
- out = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
-
- if (num_consts >= 1) {
- constant = malloc(sizeof(struct ureg_src) * end_const);
- for (i = start_const; i < end_const; i++) {
- constant[i] = ureg_DECL_constant(ureg, i);
- }
-
- }
-
- if (num_temps >= 1) {
- temp = malloc(sizeof(struct ureg_dst) * end_temp);
- for (i = start_temp; i < end_temp; i++) {
- temp[i] = ureg_DECL_temporary(ureg);
- }
- }
-
- if (num_samplers >= 1) {
- sampler = malloc(sizeof(struct ureg_src) * end_sampler);
- for (i = start_sampler; i < end_sampler; i++) {
- sampler[i] = ureg_DECL_sampler(ureg, i);
- }
- }
-
- while (current_shader < num_shaders) {
- if ((current_shader + 1) == num_shaders) {
- shaders[current_shader]->func(ureg,
- &out,
- in,
- sampler,
- temp,
- constant);
- } else {
- shaders[current_shader]->func(ureg,
- &temp[0],
- in,
- sampler,
- temp,
- constant);
- }
- current_shader++;
- }
-
- ureg_END(ureg);
-
- shader->tokens = ureg_finalize(ureg);
- if (!shader->tokens) {
- ureg_destroy(ureg);
- return NULL;
- }
-
- p = pipe->create_fs_state(pipe, shader);
-
- if (num_temps >= 1) {
- for (i = start_temp; i < end_temp; i++) {
- ureg_release_temporary(ureg, temp[i]);
- }
- }
-
- ureg_destroy(ureg);
-
- free(temp);
- free(constant);
- free(sampler);
-
- return p;
-}
-
-static void *
-create_shader(struct pipe_context *pipe,
- int id,
- struct pipe_shader_state *shader)
-{
- int idx = 0, sh;
- const struct shader_asm_info * shaders[SHADER_STAGES];
-
- /* first stage */
- sh = SHADERS_GET_PAINT_SHADER(id);
- switch (sh << SHADERS_PAINT_SHIFT) {
- case VEGA_SOLID_FILL_SHADER:
- case VEGA_LINEAR_GRADIENT_SHADER:
- case VEGA_RADIAL_GRADIENT_SHADER:
- case VEGA_PATTERN_SHADER:
- case VEGA_PAINT_DEGENERATE_SHADER:
- shaders[idx] = &shaders_paint_asm[(sh >> SHADERS_PAINT_SHIFT) - 1];
- assert(shaders[idx]->id == sh);
- idx++;
- break;
- default:
- break;
- }
-
- /* second stage */
- sh = SHADERS_GET_IMAGE_SHADER(id);
- switch (sh) {
- case VEGA_IMAGE_NORMAL_SHADER:
- case VEGA_IMAGE_MULTIPLY_SHADER:
- case VEGA_IMAGE_STENCIL_SHADER:
- shaders[idx] = &shaders_image_asm[(sh >> SHADERS_IMAGE_SHIFT) - 1];
- assert(shaders[idx]->id == sh);
- idx++;
- break;
- default:
- break;
- }
-
- /* sanity check */
- assert(idx == ((!sh || sh == VEGA_IMAGE_NORMAL_SHADER) ? 1 : 2));
-
- /* third stage */
- sh = SHADERS_GET_COLOR_TRANSFORM_SHADER(id);
- switch (sh) {
- case VEGA_COLOR_TRANSFORM_SHADER:
- shaders[idx] = &shaders_color_transform_asm[
- (sh >> SHADERS_COLOR_TRANSFORM_SHIFT) - 1];
- assert(shaders[idx]->id == sh);
- idx++;
- break;
- default:
- break;
- }
-
- /* fourth stage */
- sh = SHADERS_GET_ALPHA_SHADER(id);
- switch (sh) {
- case VEGA_ALPHA_NORMAL_SHADER:
- case VEGA_ALPHA_PER_CHANNEL_SHADER:
- shaders[idx] = &shaders_alpha_asm[
- (sh >> SHADERS_ALPHA_SHIFT) - 1];
- assert(shaders[idx]->id == sh);
- idx++;
- break;
- default:
- break;
- }
-
- /* fifth stage */
- sh = SHADERS_GET_BLEND_SHADER(id);
- switch (sh) {
- case VEGA_BLEND_SRC_SHADER:
- case VEGA_BLEND_SRC_OVER_SHADER:
- case VEGA_BLEND_DST_OVER_SHADER:
- case VEGA_BLEND_SRC_IN_SHADER:
- case VEGA_BLEND_DST_IN_SHADER:
- case VEGA_BLEND_MULTIPLY_SHADER:
- case VEGA_BLEND_SCREEN_SHADER:
- case VEGA_BLEND_DARKEN_SHADER:
- case VEGA_BLEND_LIGHTEN_SHADER:
- case VEGA_BLEND_ADDITIVE_SHADER:
- shaders[idx] = &shaders_blend_asm[(sh >> SHADERS_BLEND_SHIFT) - 1];
- assert(shaders[idx]->id == sh);
- idx++;
- break;
- default:
- break;
- }
-
- /* sixth stage */
- sh = SHADERS_GET_MASK_SHADER(id);
- switch (sh) {
- case VEGA_MASK_SHADER:
- shaders[idx] = &shaders_mask_asm[(sh >> SHADERS_MASK_SHIFT) - 1];
- assert(shaders[idx]->id == sh);
- idx++;
- break;
- default:
- break;
- }
-
- /* seventh stage */
- sh = SHADERS_GET_PREMULTIPLY_SHADER(id);
- switch (sh) {
- case VEGA_PREMULTIPLY_SHADER:
- case VEGA_UNPREMULTIPLY_SHADER:
- shaders[idx] = &shaders_premultiply_asm[
- (sh >> SHADERS_PREMULTIPLY_SHIFT) - 1];
- assert(shaders[idx]->id == sh);
- idx++;
- break;
- default:
- break;
- }
-
- /* eighth stage */
- sh = SHADERS_GET_BW_SHADER(id);
- switch (sh) {
- case VEGA_BW_SHADER:
- shaders[idx] = &shaders_bw_asm[(sh >> SHADERS_BW_SHIFT) - 1];
- assert(shaders[idx]->id == sh);
- idx++;
- break;
- default:
- break;
- }
-
- return combine_shaders(shaders, idx, pipe, shader);
-}
-
-/*************************************************/
-
-struct shaders_cache * shaders_cache_create(struct vg_context *vg)
-{
- struct shaders_cache *sc = CALLOC_STRUCT(shaders_cache);
-
- sc->pipe = vg;
- sc->hash = cso_hash_create();
-
- return sc;
-}
-
-void shaders_cache_destroy(struct shaders_cache *sc)
-{
- struct cso_hash_iter iter = cso_hash_first_node(sc->hash);
-
- while (!cso_hash_iter_is_null(iter)) {
- struct cached_shader *cached =
- (struct cached_shader *)cso_hash_iter_data(iter);
- cso_delete_fragment_shader(sc->pipe->cso_context,
- cached->driver_shader);
- iter = cso_hash_erase(sc->hash, iter);
- }
-
- cso_hash_delete(sc->hash);
- FREE(sc);
-}
-
-void * shaders_cache_fill(struct shaders_cache *sc,
- int shader_key)
-{
- VGint key = shader_key;
- struct cached_shader *cached;
- struct cso_hash_iter iter = cso_hash_find(sc->hash, key);
-
- if (cso_hash_iter_is_null(iter)) {
- cached = CALLOC_STRUCT(cached_shader);
- cached->driver_shader = create_shader(sc->pipe->pipe, key, &cached->state);
-
- cso_hash_insert(sc->hash, key, cached);
-
- return cached->driver_shader;
- }
-
- cached = (struct cached_shader *)cso_hash_iter_data(iter);
-
- assert(cached->driver_shader);
- return cached->driver_shader;
-}
-
-struct vg_shader * shader_create_from_text(struct pipe_context *pipe,
- const char *txt, int num_tokens,
- int type)
-{
- struct vg_shader *shader = (struct vg_shader *)MALLOC(
- sizeof(struct vg_shader));
- struct tgsi_token *tokens = tokens_from_assembly(txt, num_tokens);
- struct pipe_shader_state state;
-
- debug_assert(type == PIPE_SHADER_VERTEX ||
- type == PIPE_SHADER_FRAGMENT);
-
- state.tokens = tokens;
- memset(&state.stream_output, 0, sizeof(state.stream_output));
- shader->type = type;
- shader->tokens = tokens;
-
- if (type == PIPE_SHADER_FRAGMENT)
- shader->driver = pipe->create_fs_state(pipe, &state);
- else
- shader->driver = pipe->create_vs_state(pipe, &state);
- return shader;
-}
-
-void vg_shader_destroy(struct vg_context *ctx, struct vg_shader *shader)
-{
- if (shader->type == PIPE_SHADER_FRAGMENT)
- cso_delete_fragment_shader(ctx->cso_context, shader->driver);
- else
- cso_delete_vertex_shader(ctx->cso_context, shader->driver);
- FREE(shader->tokens);
- FREE(shader);
-}
diff --git a/src/gallium/state_trackers/vega/shaders_cache.h b/src/gallium/state_trackers/vega/shaders_cache.h
deleted file mode 100644
index 05014f25dcc..00000000000
--- a/src/gallium/state_trackers/vega/shaders_cache.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef SHADERS_CACHE_H
-#define SHADERS_CACHE_H
-
-
-struct vg_context;
-struct pipe_context;
-struct tgsi_token;
-struct shaders_cache;
-
-#define _SHADERS_PAINT_BITS 3
-#define _SHADERS_IMAGE_BITS 2
-#define _SHADERS_COLOR_TRANSFORM_BITS 1
-#define _SHADERS_ALPHA_BITS 2
-#define _SHADERS_BLEND_BITS 4
-#define _SHADERS_MASK_BITS 1
-#define _SHADERS_PREMULTIPLY_BITS 2
-#define _SHADERS_BW_BITS 1
-
-#define SHADERS_PAINT_SHIFT (0)
-#define SHADERS_IMAGE_SHIFT (SHADERS_PAINT_SHIFT + _SHADERS_PAINT_BITS)
-#define SHADERS_COLOR_TRANSFORM_SHIFT (SHADERS_IMAGE_SHIFT + _SHADERS_IMAGE_BITS)
-#define SHADERS_ALPHA_SHIFT (SHADERS_COLOR_TRANSFORM_SHIFT + _SHADERS_COLOR_TRANSFORM_BITS)
-#define SHADERS_BLEND_SHIFT (SHADERS_ALPHA_SHIFT + _SHADERS_ALPHA_BITS)
-#define SHADERS_MASK_SHIFT (SHADERS_BLEND_SHIFT + _SHADERS_BLEND_BITS)
-#define SHADERS_PREMULTIPLY_SHIFT (SHADERS_MASK_SHIFT + _SHADERS_MASK_BITS)
-#define SHADERS_BW_SHIFT (SHADERS_PREMULTIPLY_SHIFT + _SHADERS_PREMULTIPLY_BITS)
-
-#define _SHADERS_GET_STAGE(stage, id) \
- ((id) & (((1 << _SHADERS_ ## stage ## _BITS) - 1) << SHADERS_ ## stage ## _SHIFT))
-
-#define SHADERS_GET_PAINT_SHADER(id) _SHADERS_GET_STAGE(PAINT, id)
-#define SHADERS_GET_IMAGE_SHADER(id) _SHADERS_GET_STAGE(IMAGE, id)
-#define SHADERS_GET_COLOR_TRANSFORM_SHADER(id) _SHADERS_GET_STAGE(COLOR_TRANSFORM, id)
-#define SHADERS_GET_ALPHA_SHADER(id) _SHADERS_GET_STAGE(ALPHA, id)
-#define SHADERS_GET_BLEND_SHADER(id) _SHADERS_GET_STAGE(BLEND, id)
-#define SHADERS_GET_MASK_SHADER(id) _SHADERS_GET_STAGE(MASK, id)
-#define SHADERS_GET_PREMULTIPLY_SHADER(id) _SHADERS_GET_STAGE(PREMULTIPLY, id)
-#define SHADERS_GET_BW_SHADER(id) _SHADERS_GET_STAGE(BW, id)
-
-enum VegaShaderType {
- VEGA_SOLID_FILL_SHADER = 1 << SHADERS_PAINT_SHIFT,
- VEGA_LINEAR_GRADIENT_SHADER = 2 << SHADERS_PAINT_SHIFT,
- VEGA_RADIAL_GRADIENT_SHADER = 3 << SHADERS_PAINT_SHIFT,
- VEGA_PATTERN_SHADER = 4 << SHADERS_PAINT_SHIFT,
- VEGA_PAINT_DEGENERATE_SHADER = 5 << SHADERS_PAINT_SHIFT,
-
- VEGA_IMAGE_NORMAL_SHADER = 1 << SHADERS_IMAGE_SHIFT,
- VEGA_IMAGE_MULTIPLY_SHADER = 2 << SHADERS_IMAGE_SHIFT,
- VEGA_IMAGE_STENCIL_SHADER = 3 << SHADERS_IMAGE_SHIFT,
-
- VEGA_COLOR_TRANSFORM_SHADER = 1 << SHADERS_COLOR_TRANSFORM_SHIFT,
-
- VEGA_ALPHA_NORMAL_SHADER = 1 << SHADERS_ALPHA_SHIFT,
- VEGA_ALPHA_PER_CHANNEL_SHADER = 2 << SHADERS_ALPHA_SHIFT,
-
- VEGA_BLEND_SRC_SHADER = 1 << SHADERS_BLEND_SHIFT,
- VEGA_BLEND_SRC_OVER_SHADER = 2 << SHADERS_BLEND_SHIFT,
- VEGA_BLEND_DST_OVER_SHADER = 3 << SHADERS_BLEND_SHIFT,
- VEGA_BLEND_SRC_IN_SHADER = 4 << SHADERS_BLEND_SHIFT,
- VEGA_BLEND_DST_IN_SHADER = 5 << SHADERS_BLEND_SHIFT,
- VEGA_BLEND_MULTIPLY_SHADER = 6 << SHADERS_BLEND_SHIFT,
- VEGA_BLEND_SCREEN_SHADER = 7 << SHADERS_BLEND_SHIFT,
- VEGA_BLEND_DARKEN_SHADER = 8 << SHADERS_BLEND_SHIFT,
- VEGA_BLEND_LIGHTEN_SHADER = 9 << SHADERS_BLEND_SHIFT,
- VEGA_BLEND_ADDITIVE_SHADER = 10<< SHADERS_BLEND_SHIFT,
-
- VEGA_MASK_SHADER = 1 << SHADERS_MASK_SHIFT,
-
- VEGA_PREMULTIPLY_SHADER = 1 << SHADERS_PREMULTIPLY_SHIFT,
- VEGA_UNPREMULTIPLY_SHADER = 2 << SHADERS_PREMULTIPLY_SHIFT,
-
- VEGA_BW_SHADER = 1 << SHADERS_BW_SHIFT
-};
-
-struct vg_shader {
- void *driver;
- struct tgsi_token *tokens;
- int type;/* PIPE_SHADER_VERTEX, PIPE_SHADER_FRAGMENT */
-};
-
-struct shaders_cache *shaders_cache_create(struct vg_context *pipe);
-void shaders_cache_destroy(struct shaders_cache *sc);
-void *shaders_cache_fill(struct shaders_cache *sc,
- int shader_key);
-
-struct vg_shader *shader_create_from_text(struct pipe_context *pipe,
- const char *txt, int num_tokens,
- int type);
-
-void vg_shader_destroy(struct vg_context *ctx, struct vg_shader *shader);
-
-
-
-#endif
diff --git a/src/gallium/state_trackers/vega/stroker.c b/src/gallium/state_trackers/vega/stroker.c
deleted file mode 100644
index b9f0f2c284f..00000000000
--- a/src/gallium/state_trackers/vega/stroker.c
+++ /dev/null
@@ -1,1351 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "stroker.h"
-
-#include "path.h"
-#include "vg_state.h"
-#include "util_array.h"
-#include "arc.h"
-#include "bezier.h"
-#include "matrix.h"
-#include "path_utils.h"
-#include "polygon.h"
-
-#include "util/u_math.h"
-
-#ifndef M_2PI
-#define M_2PI 6.28318530717958647692528676655900576
-#endif
-
-#define STROKE_SEGMENTS 0
-#define STROKE_DEBUG 0
-#define DEBUG_EMITS 0
-
-static const VGfloat curve_threshold = 0.25f;
-
-static const VGfloat zero_coords[] = {0.f, 0.f};
-
-enum intersection_type {
- NoIntersections,
- BoundedIntersection,
- UnboundedIntersection,
-};
-
-enum line_join_mode {
- FlatJoin,
- SquareJoin,
- MiterJoin,
- RoundJoin,
- RoundCap
-};
-
-struct stroke_iterator {
- void (*next)(struct stroke_iterator *);
- VGboolean (*has_next)(struct stroke_iterator *);
-
- VGPathCommand (*current_command)(struct stroke_iterator *it);
- void (*current_coords)(struct stroke_iterator *it, VGfloat *coords);
-
- VGint position;
- VGint coord_position;
-
- const VGubyte *cmds;
- const VGfloat *coords;
- VGint num_commands;
- VGint num_coords;
-
- struct polygon *curve_poly;
- VGint curve_index;
-};
-
-static VGPathCommand stroke_itr_command(struct stroke_iterator *itr)
-{
- return itr->current_command(itr);
-}
-
-static void stroke_itr_coords(struct stroke_iterator *itr, VGfloat *coords)
-{
- itr->current_coords(itr, coords);
-}
-
-static void stroke_fw_itr_coords(struct stroke_iterator *itr, VGfloat *coords)
-{
- if (itr->position >= itr->num_commands)
- return;
- switch (stroke_itr_command(itr)) {
- case VG_MOVE_TO_ABS:
- coords[0] = itr->coords[itr->coord_position];
- coords[1] = itr->coords[itr->coord_position + 1];
- break;
- case VG_LINE_TO_ABS:
- coords[0] = itr->coords[itr->coord_position];
- coords[1] = itr->coords[itr->coord_position + 1];
- break;
- case VG_CUBIC_TO_ABS:
- coords[0] = itr->coords[itr->coord_position];
- coords[1] = itr->coords[itr->coord_position + 1];
- coords[2] = itr->coords[itr->coord_position + 2];
- coords[3] = itr->coords[itr->coord_position + 3];
- coords[4] = itr->coords[itr->coord_position + 4];
- coords[5] = itr->coords[itr->coord_position + 5];
- break;
- default:
- debug_assert(!"invalid command!\n");
- }
-}
-
-
-static void stroke_bw_itr_coords(struct stroke_iterator *itr, VGfloat *coords)
-{
- if (itr->position >= itr->num_commands)
- return;
- switch (stroke_itr_command(itr)) {
- case VG_MOVE_TO_ABS:
- coords[0] = itr->coords[itr->coord_position];
- coords[1] = itr->coords[itr->coord_position + 1];
- break;
- case VG_LINE_TO_ABS:
- coords[0] = itr->coords[itr->coord_position];
- coords[1] = itr->coords[itr->coord_position + 1];
- break;
- case VG_CUBIC_TO_ABS:
- coords[0] = itr->coords[itr->coord_position + 4];
- coords[1] = itr->coords[itr->coord_position + 5];
- coords[2] = itr->coords[itr->coord_position + 2];
- coords[3] = itr->coords[itr->coord_position + 3];
- coords[4] = itr->coords[itr->coord_position + 0];
- coords[5] = itr->coords[itr->coord_position + 1];
- break;
- default:
- debug_assert(!"invalid command!\n");
- }
-}
-
-
-static VGPathCommand stroke_fw_current_command(struct stroke_iterator *it)
-{
- return it->cmds[it->position];
-}
-
-static VGPathCommand stroke_bw_current_command(struct stroke_iterator *it)
-{
- VGPathCommand prev_cmd;
- if (it->position == it->num_commands -1)
- return VG_MOVE_TO_ABS;
-
- prev_cmd = it->cmds[it->position + 1];
- return prev_cmd;
-}
-
-static VGboolean stroke_fw_has_next(struct stroke_iterator *itr)
-{
- return itr->position < (itr->num_commands - 1);
-}
-
-static VGboolean stroke_bw_has_next(struct stroke_iterator *itr)
-{
- return itr->position > 0;
-}
-
-static void stroke_fw_next(struct stroke_iterator *itr)
-{
- VGubyte cmd;
- debug_assert(stroke_fw_has_next(itr));
-
- cmd = stroke_itr_command(itr);
-
- itr->coord_position += num_elements_for_segments(&cmd, 1);
- ++itr->position;
-}
-
-static void stroke_bw_next(struct stroke_iterator *itr)
-{
- VGubyte cmd;
- debug_assert(stroke_bw_has_next(itr));
-
- --itr->position;
- cmd = stroke_itr_command(itr);
-
- itr->coord_position -= num_elements_for_segments(&cmd, 1);
-}
-
-static void stroke_itr_common_init(struct stroke_iterator *itr,
- struct array *cmds,
- struct array *coords)
-{
- itr->cmds = (VGubyte*)cmds->data;
- itr->num_commands = cmds->num_elements;
-
- itr->coords = (VGfloat*)coords->data;
- itr->num_coords = coords->num_elements;
-}
-
-static void stroke_forward_iterator(struct stroke_iterator *itr,
- struct array *cmds,
- struct array *coords)
-{
- stroke_itr_common_init(itr, cmds, coords);
- itr->position = 0;
- itr->coord_position = 0;
-
- itr->next = stroke_fw_next;
- itr->has_next = stroke_fw_has_next;
- itr->current_command = stroke_fw_current_command;
- itr->current_coords = stroke_fw_itr_coords;
-}
-
-static void stroke_backward_iterator(struct stroke_iterator *itr,
- struct array *cmds,
- struct array *coords)
-{
- VGubyte cmd;
- stroke_itr_common_init(itr, cmds, coords);
- itr->position = itr->num_commands - 1;
-
- cmd = stroke_bw_current_command(itr);
- itr->coord_position = itr->num_coords -
- num_elements_for_segments(&cmd, 1);
-
- itr->next = stroke_bw_next;
- itr->has_next = stroke_bw_has_next;
- itr->current_command = stroke_bw_current_command;
- itr->current_coords = stroke_bw_itr_coords;
-}
-
-
-
-static void stroke_flat_next(struct stroke_iterator *itr)
-{
- VGubyte cmd;
-
- if (itr->curve_index >= 0) {
- ++itr->curve_index;
- if (itr->curve_index >= polygon_vertex_count(itr->curve_poly)) {
- itr->curve_index = -1;
- polygon_destroy(itr->curve_poly);
- itr->curve_poly = 0;
- } else
- return;
- }
- debug_assert(stroke_fw_has_next(itr));
-
- cmd = itr->cmds[itr->position];
- itr->coord_position += num_elements_for_segments(&cmd, 1);
- ++itr->position;
-
- cmd = itr->cmds[itr->position];
-
- if (cmd == VG_CUBIC_TO_ABS) {
- struct bezier bezier;
- VGfloat bez[8];
-
- bez[0] = itr->coords[itr->coord_position - 2];
- bez[1] = itr->coords[itr->coord_position - 1];
- bez[2] = itr->coords[itr->coord_position];
- bez[3] = itr->coords[itr->coord_position + 1];
- bez[4] = itr->coords[itr->coord_position + 2];
- bez[5] = itr->coords[itr->coord_position + 3];
- bez[6] = itr->coords[itr->coord_position + 4];
- bez[7] = itr->coords[itr->coord_position + 5];
-
- bezier_init(&bezier,
- bez[0], bez[1],
- bez[2], bez[3],
- bez[4], bez[5],
- bez[6], bez[7]);
- /* skip the first one, it's the same as the prev point */
- itr->curve_index = 1;
- if (itr->curve_poly) {
- polygon_destroy(itr->curve_poly);
- itr->curve_poly = 0;
- }
- itr->curve_poly = bezier_to_polygon(&bezier);
- }
-}
-
-static VGboolean stroke_flat_has_next(struct stroke_iterator *itr)
-{
- return (itr->curve_index >= 0 &&
- itr->curve_index < (polygon_vertex_count(itr->curve_poly)-1))
- || itr->position < (itr->num_commands - 1);
-}
-
-static VGPathCommand stroke_flat_current_command(struct stroke_iterator *it)
-{
- if (it->cmds[it->position] == VG_CUBIC_TO_ABS) {
- return VG_LINE_TO_ABS;
- }
- return it->cmds[it->position];
-}
-
-static void stroke_flat_itr_coords(struct stroke_iterator *itr, VGfloat *coords)
-{
- if (itr->curve_index <= -1 && itr->position >= itr->num_commands)
- return;
-
- if (itr->curve_index >= 0) {
- polygon_vertex(itr->curve_poly, itr->curve_index,
- coords);
- return;
- }
-
- switch (stroke_itr_command(itr)) {
- case VG_MOVE_TO_ABS:
- coords[0] = itr->coords[itr->coord_position];
- coords[1] = itr->coords[itr->coord_position + 1];
- break;
- case VG_LINE_TO_ABS:
- coords[0] = itr->coords[itr->coord_position];
- coords[1] = itr->coords[itr->coord_position + 1];
- break;
- case VG_CUBIC_TO_ABS:
- default:
- debug_assert(!"invalid command!\n");
- }
-}
-
-static void stroke_flat_iterator(struct stroke_iterator *itr,
- struct array *cmds,
- struct array *coords)
-{
- stroke_itr_common_init(itr, cmds, coords);
- itr->position = 0;
- itr->coord_position = 0;
-
- itr->next = stroke_flat_next;
- itr->has_next = stroke_flat_has_next;
- itr->current_command = stroke_flat_current_command;
- itr->current_coords = stroke_flat_itr_coords;
- itr->curve_index = -1;
- itr->curve_poly = 0;
-}
-
-
-static INLINE VGboolean finite_coords4(const VGfloat *c)
-{
- return
- isfinite(c[0]) && isfinite(c[1]) &&
- isfinite(c[2]) && isfinite(c[3]);
-}
-
-/* from Graphics Gems II */
-#define SAME_SIGNS(a, b) ((a) * (b) >= 0)
-static VGboolean do_lines_intersect(VGfloat x1, VGfloat y1, VGfloat x2, VGfloat y2,
- VGfloat x3, VGfloat y3, VGfloat x4, VGfloat y4)
-{
- VGfloat a1, a2, b1, b2, c1, c2; /* Coefficients of line eqns */
- VGfloat r1, r2, r3, r4; /* 'sign' values */
-
- a1 = y2 - y1;
- b1 = x1 - x2;
- c1 = x2 * y1 - x1 * y2;
-
- r3 = a1 * x3 + b1 * y3 + c1;
- r4 = a1 * x4 + b1 * y4 + c1;
-
- if (r3 != 0 && r4 != 0 && SAME_SIGNS(r3, r4))
- return VG_FALSE;
-
- a2 = y4 - y3;
- b2 = x3 - x4;
- c2 = x4 * y3 - x3 * y4;
-
- r1 = a2 * x1 + b2 * y1 + c2;
- r2 = a2 * x2 + b2 * y2 + c2;
-
- if (r1 != 0 && r2 != 0 && SAME_SIGNS(r1, r2))
- return VG_FALSE;
-
- return VG_TRUE;
-}
-
-static INLINE VGfloat line_dx(const VGfloat *l)
-{
- return l[2] - l[0];
-}
-
-static INLINE VGfloat line_dy(const VGfloat *l)
-{
- return l[3] - l[1];
-}
-
-static INLINE VGfloat line_angle(const VGfloat *l)
-{
- const VGfloat dx = line_dx(l);
- const VGfloat dy = line_dy(l);
-
- const VGfloat theta = atan2(-dy, dx) * 360.0 / M_2PI;
-
- const VGfloat theta_normalized = theta < 0 ? theta + 360 : theta;
-
- if (floatsEqual(theta_normalized, 360.f))
- return 0;
- else
- return theta_normalized;
-}
-
-static INLINE void line_set_length(VGfloat *l, VGfloat len)
-{
- VGfloat uv[] = {l[0], l[1], l[2], l[3]};
- if (null_line(l))
- return;
- line_normalize(uv);
- l[2] = l[0] + line_dx(uv) * len;
- l[3] = l[1] + line_dy(uv) * len;
-}
-
-static INLINE void line_translate(VGfloat *l, VGfloat x, VGfloat y)
-{
- l[0] += x;
- l[1] += y;
- l[2] += x;
- l[3] += y;
-}
-
-static INLINE VGfloat line_angle_to(const VGfloat *l1,
- const VGfloat *l2)
-{
- VGfloat a1, a2, delta, delta_normalized;
- if (null_line(l1) || null_line(l1))
- return 0;
-
- a1 = line_angle(l1);
- a2 = line_angle(l2);
-
- delta = a2 - a1;
- delta_normalized = delta < 0 ? delta + 360 : delta;
-
- if (floatsEqual(delta, 360.f))
- return 0;
- else
- return delta_normalized;
-}
-
-static INLINE VGfloat line_angles(const VGfloat *l1,
- const VGfloat *l2)
-{
- VGfloat cos_line, rad = 0;
-
- if (null_line(l1) || null_line(l2))
- return 0;
-
- cos_line = (line_dx(l1)*line_dx(l2) + line_dy(l1)*line_dy(l2)) /
- (line_lengthv(l1)*line_lengthv(l2));
- rad = 0;
-
- if (cos_line >= -1.0 && cos_line <= 1.0)
- rad = acos(cos_line);
- return rad * 360 / M_2PI;
-}
-
-
-static INLINE VGfloat adapted_angle_on_x(const VGfloat *line)
-{
- const VGfloat identity[] = {0, 0, 1, 0};
- VGfloat angle = line_angles(line, identity);
- if (line_dy(line) > 0)
- angle = 360 - angle;
- return angle;
-}
-
-static enum intersection_type line_intersect(const VGfloat *l1,
- const VGfloat *l2,
- float *intersection_point)
-{
- VGfloat isect[2] = { 0 };
- enum intersection_type type;
- VGboolean dx_zero, ldx_zero;
-
- if (null_line(l1) || null_line(l2) ||
- !finite_coords4(l1) || !finite_coords4(l2))
- return NoIntersections;
-
- type = do_lines_intersect(l1[0], l1[1], l1[2], l1[3], l2[0], l2[1], l2[2], l2[3])
- ? BoundedIntersection : UnboundedIntersection;
-
- dx_zero = floatsEqual(line_dx(l1) + 1, 1);
- ldx_zero = floatsEqual(line_dx(l2) + 1, 1);
-
- /* one of the lines is vertical */
- if (dx_zero && ldx_zero) {
- type = NoIntersections;
- } else if (dx_zero) {
- VGfloat la = line_dy(l2) / line_dx(l2);
- isect[0] = l1[0];
- isect[1] = la * l1[0] + l2[1] - la * l2[0];
- } else if (ldx_zero) {
- VGfloat ta = line_dy(l1) / line_dx(l1);
- isect[0] = l2[0];
- isect[1] = ta * l2[0] + l1[1] - ta*l1[0];
- } else {
- VGfloat x;
- VGfloat ta = line_dy(l1) / line_dx(l1);
- VGfloat la = line_dy(l2) / line_dx(l2);
- if (ta == la)
- return NoIntersections;
-
- x = ( - l2[1] + la * l2[0] + l1[1] - ta * l1[0] ) / (la - ta);
- isect[0] = x;
- isect[1] = ta*(x - l1[0]) + l1[1];
- }
- if (intersection_point) {
- intersection_point[0] = isect[0];
- intersection_point[1] = isect[1];
- }
- return type;
-}
-
-static INLINE enum line_join_mode stroker_join_mode(struct stroker *s)
-{
- switch(s->join_style) {
- case VG_JOIN_MITER:
- return MiterJoin;
- case VG_JOIN_ROUND:
- return RoundJoin;
- case VG_JOIN_BEVEL:
- return FlatJoin;
- default:
- return FlatJoin;
- }
-}
-
-static INLINE enum line_join_mode stroker_cap_mode(struct stroker *s)
-{
- switch(s->cap_style) {
- case VG_CAP_BUTT:
- return FlatJoin;
- case VG_CAP_ROUND:
- return RoundCap;
- case VG_CAP_SQUARE:
- return SquareJoin;
- default:
- return FlatJoin;
- }
-}
-
-void stroker_emit_move_to(struct stroker *stroker, VGfloat x, VGfloat y)
-{
- VGubyte cmds = VG_MOVE_TO_ABS;
- VGfloat coords[2] = {x, y};
-#if DEBUG_EMITS
- debug_printf("emit move %f, %f\n", x, y);
-#endif
- stroker->back2_x = stroker->back1_x;
- stroker->back2_y = stroker->back1_y;
- stroker->back1_x = x;
- stroker->back1_y = y;
-
- path_append_data(stroker->path,
- 1,
- &cmds, &coords);
-}
-
-void stroker_emit_line_to(struct stroker *stroker, VGfloat x, VGfloat y)
-{
- VGubyte cmds = VG_LINE_TO_ABS;
- VGfloat coords[2] = {x, y};
-#if DEBUG_EMITS
- debug_printf("emit line %f, %f\n", x, y);
-#endif
- stroker->back2_x = stroker->back1_x;
- stroker->back2_y = stroker->back1_y;
- stroker->back1_x = x;
- stroker->back1_y = y;
- path_append_data(stroker->path,
- 1,
- &cmds, &coords);
-}
-
-void stroker_emit_curve_to(struct stroker *stroker, VGfloat px1, VGfloat py1,
- VGfloat px2, VGfloat py2,
- VGfloat x, VGfloat y)
-{
- VGubyte cmds = VG_CUBIC_TO_ABS;
- VGfloat coords[6] = {px1, py1, px2, py2, x, y};
-#if DEBUG_EMITS
- debug_printf("emit curve %f, %f, %f, %f, %f, %f\n", px1, py1,
- px2, py2, x, y);
-#endif
-
- if (px2 == x && py2 == y) {
- if (px1 == x && py1 == y) {
- stroker->back2_x = stroker->back1_x;
- stroker->back2_y = stroker->back1_y;
- } else {
- stroker->back2_x = px1;
- stroker->back2_y = py1;
- }
- } else {
- stroker->back2_x = px2;
- stroker->back2_y = py2;
- }
- stroker->back1_x = x;
- stroker->back1_y = y;
-
- path_append_data(stroker->path,
- 1,
- &cmds, &coords);
-}
-
-static INLINE void create_round_join(struct stroker *stroker,
- VGfloat x1, VGfloat y1,
- VGfloat x2, VGfloat y2,
- VGfloat width, VGfloat height)
-{
- struct arc arc;
- struct matrix matrix;
-
- matrix_load_identity(&matrix);
-
- /*stroker_emit_line_to(stroker, nx, ny);*/
-
- arc_init(&arc, VG_SCCWARC_TO,
- x1, y1, x2, y2, width/2, height/2, 0);
- arc_stroker_emit(&arc, stroker, &matrix);
-}
-
-
-static void create_joins(struct stroker *stroker,
- VGfloat focal_x, VGfloat focal_y,
- const VGfloat *next_line, enum line_join_mode join)
-{
-#if DEBUG_EMITS
- debug_printf("create_joins: focal=[%f, %f], next_line=[%f, %f,%f, %f]\n",
- focal_x, focal_y,
- next_line[0], next_line[1], next_line[2], next_line[3]);
-#endif
- /* if we're alredy connected do nothing */
- if (floatsEqual(stroker->back1_x, next_line[0]) &&
- floatsEqual(stroker->back1_y, next_line[1]))
- return;
-
- if (join == FlatJoin) {
- stroker_emit_line_to(stroker, next_line[0], next_line[1]);
- } else {
- VGfloat prev_line[] = {stroker->back2_x, stroker->back2_y,
- stroker->back1_x, stroker->back1_y};
-
- VGfloat isect[2] = { 0 };
- enum intersection_type type = line_intersect(prev_line, next_line, isect);
-
- if (join == SquareJoin) {
- VGfloat offset = stroker->stroke_width / 2;
- VGfloat l1[4] = {prev_line[0],
- prev_line[1],
- prev_line[2],
- prev_line[3]};
- VGfloat l2[4] = {next_line[2],
- next_line[3],
- next_line[0],
- next_line[1]};
-
- line_translate(l1, line_dx(l1), line_dy(l1));
- line_set_length(l1, offset);
-
- line_translate(l2, line_dx(l2), line_dy(l2));
- line_set_length(l2, offset);
-
- stroker_emit_line_to(stroker, l1[2], l1[3]);
- stroker_emit_line_to(stroker, l2[2], l2[3]);
- stroker_emit_line_to(stroker, l2[0], l2[1]);
- } else if (join == RoundJoin) {
- VGfloat offset = stroker->stroke_width / 2;
- VGfloat short_cut[4] = {prev_line[2], prev_line[3],
- next_line[0], next_line[1]};
- VGfloat angle = line_angles(prev_line, short_cut);
-
- if (type == BoundedIntersection ||
- (angle > 90 && !floatsEqual(angle, 90.f))) {
- stroker_emit_line_to(stroker, next_line[0], next_line[1]);
- return;
- }
- create_round_join(stroker, prev_line[2], prev_line[3],
- next_line[0], next_line[1],
- offset * 2, offset * 2);
-
- stroker_emit_line_to(stroker, next_line[0], next_line[1]);
- } else if (join == RoundCap) {
- VGfloat offset = stroker->stroke_width / 2;
- VGfloat l1[4] = { prev_line[0], prev_line[1],
- prev_line[2], prev_line[3] };
- VGfloat l2[4] = {focal_x, focal_y,
- prev_line[2], prev_line[3]};
-
- line_translate(l1, line_dx(l1), line_dy(l1));
- line_set_length(l1, KAPPA * offset);
-
- /* normal between prev_line and focal */
- line_translate(l2, -line_dy(l2), line_dx(l2));
- line_set_length(l2, KAPPA * offset);
-
- stroker_emit_curve_to(stroker, l1[2], l1[3],
- l2[2], l2[3],
- l2[0], l2[1]);
-
- l2[0] = l2[0];
- l2[1] = l2[1];
- l2[2] = l2[0] - line_dx(l2);
- l2[3] = l2[1] - line_dy(l2);
-
- line_translate(l1, next_line[0] - l1[0], next_line[1] - l1[1]);
-
- stroker_emit_curve_to(stroker,
- l2[2], l2[3],
- l1[2], l1[3],
- l1[0], l1[1]);
- } else if (join == MiterJoin) {
- VGfloat miter_line[4] = {stroker->back1_x, stroker->back1_y,
- isect[0], isect[1]};
- VGfloat sl = (stroker->stroke_width * stroker->miter_limit);
- VGfloat inside_line[4] = {prev_line[2], prev_line[3],
- next_line[0], next_line[1]};
- VGfloat angle = line_angle_to(inside_line, prev_line);
-
- if (type == BoundedIntersection ||
- (angle > 90 && !floatsEqual(angle, 90.f))) {
- /*
- debug_printf("f = %f, nl = %f, pl = %f, is = %f\n",
- focal_x, next_line[0],
- prev_line[2], isect[0]);*/
- stroker_emit_line_to(stroker, next_line[0], next_line[1]);
- return;
- }
-
- if (type == NoIntersections || line_lengthv(miter_line) > sl) {
- stroker_emit_line_to(stroker, next_line[0], next_line[1]);
- } else {
- stroker_emit_line_to(stroker, isect[0], isect[1]);
- stroker_emit_line_to(stroker, next_line[0], next_line[1]);
- }
- } else {
- debug_assert(!"create_joins bad join style");
- }
- }
-}
-
-static void stroker_add_segment(struct stroker *stroker,
- VGPathCommand cmd,
- const VGfloat *coords,
- VGint num_coords)
-{
- /* skip duplicated points */
- if (stroker->segments->num_elements &&
- stroker->last_cmd == cmd) {
- VGfloat *data = stroker->control_points->data;
- data += stroker->control_points->num_elements;
- data -= num_coords;
- switch (cmd) {
- case VG_MOVE_TO_ABS:
- if (floatsEqual(coords[0], data[0]) &&
- floatsEqual(coords[1], data[1]))
- return;
- break;
- case VG_LINE_TO_ABS:
- if (floatsEqual(coords[0], data[0]) &&
- floatsEqual(coords[1], data[1]))
- return;
- break;
- case VG_CUBIC_TO_ABS:
- if (floatsEqual(coords[0], data[0]) &&
- floatsEqual(coords[1], data[1]) &&
- floatsEqual(coords[2], data[2]) &&
- floatsEqual(coords[3], data[3]) &&
- floatsEqual(coords[4], data[4]) &&
- floatsEqual(coords[5], data[5]))
- return;
- break;
- default:
- debug_assert(!"Invalid stroke segment");
- }
- } else if (stroker->last_cmd == VG_CUBIC_TO_ABS &&
- cmd == VG_LINE_TO_ABS) {
- VGfloat *data = stroker->control_points->data;
- data += stroker->control_points->num_elements;
- data -= 2;
- if (floatsEqual(coords[0], data[0]) &&
- floatsEqual(coords[1], data[1]))
- return;
- }
- stroker->last_cmd = cmd;
- array_append_data(stroker->segments, &cmd, 1);
- array_append_data(stroker->control_points, coords, num_coords);
-}
-
-void stroker_move_to(struct stroker *stroker, VGfloat x, VGfloat y)
-{
- VGfloat coords[2] = {x, y};
-#if STROKE_SEGMENTS
- debug_printf("stroker_move_to(%f, %f)\n", x, y);
-#endif
-
- if (stroker->segments->num_elements > 0)
- stroker->process_subpath(stroker);
-
- array_reset(stroker->segments);
- array_reset(stroker->control_points);
-
- stroker_add_segment(stroker, VG_MOVE_TO_ABS, coords, 2);
-}
-
-void stroker_line_to(struct stroker *stroker, VGfloat x, VGfloat y)
-{
- VGfloat coords[] = {x, y};
-
-#if STROKE_SEGMENTS
- debug_printf("stroker_line_to(%f, %f)\n", x, y);
-#endif
- if (!stroker->segments->num_elements)
- stroker_add_segment(stroker, VG_MOVE_TO_ABS, zero_coords, 2);
-
- stroker_add_segment(stroker, VG_LINE_TO_ABS, coords, 2);
-}
-
-void stroker_curve_to(struct stroker *stroker, VGfloat px1, VGfloat py1,
- VGfloat px2, VGfloat py2,
- VGfloat x, VGfloat y)
-{
- VGfloat coords[] = {px1, py1,
- px2, py2,
- x, y};
-#if STROKE_SEGMENTS
- debug_printf("stroker_curve_to(%f, %f, %f, %f, %f, %f)\n",
- px1, py1, px2, py2, x, y);
-#endif
- if (!stroker->segments->num_elements)
- stroker_add_segment(stroker, VG_MOVE_TO_ABS, zero_coords, 2);
-
- stroker_add_segment(stroker, VG_CUBIC_TO_ABS, coords, 6);
-}
-
-static INLINE VGboolean is_segment_null(VGPathCommand cmd,
- VGfloat *coords,
- VGfloat *res)
-{
- switch(cmd) {
- case VG_MOVE_TO_ABS:
- case VG_LINE_TO_ABS:
- return floatsEqual(coords[0], res[0]) &&
- floatsEqual(coords[1], res[1]);
- break;
- case VG_CUBIC_TO_ABS:
- return floatsEqual(coords[0], res[0]) &&
- floatsEqual(coords[1], res[1]) &&
- floatsEqual(coords[2], res[0]) &&
- floatsEqual(coords[3], res[1]) &&
- floatsEqual(coords[4], res[0]) &&
- floatsEqual(coords[5], res[1]);
- break;
- default:
- assert(0);
- }
- return VG_FALSE;
-}
-
-static VGboolean vg_stroke_outline(struct stroke_iterator *it,
- struct stroker *stroker,
- VGboolean cap_first,
- VGfloat *start_tangent)
-{
-#define MAX_OFFSET 16
- struct bezier offset_curves[MAX_OFFSET];
- VGPathCommand first_element;
- VGfloat start[2], prev[2];
- VGboolean first = VG_TRUE;
- VGfloat offset;
-
- first_element = stroke_itr_command(it);
- if (first_element != VG_MOVE_TO_ABS) {
- stroker_emit_move_to(stroker, 0.f, 0.f);
- prev[0] = 0.f;
- prev[1] = 0.f;
- }
- stroke_itr_coords(it, start);
-#if STROKE_DEBUG
- debug_printf(" -> (side) [%.2f, %.2f]\n",
- start[0],
- start[1]);
-#endif
-
- prev[0] = start[0];
- prev[1] = start[1];
-
- offset = stroker->stroke_width / 2;
-
- if (!it->has_next(it)) {
- /* single point */
-
- return VG_TRUE;
- }
-
- while (it->has_next(it)) {
- VGPathCommand cmd;
- VGfloat coords[8];
-
- it->next(it);
- cmd = stroke_itr_command(it);
- stroke_itr_coords(it, coords);
-
- if (cmd == VG_LINE_TO_ABS) {
- VGfloat line[4] = {prev[0], prev[1], coords[0], coords[1]};
- VGfloat normal[4];
- line_normal(line, normal);
-
-#if STROKE_DEBUG
- debug_printf("\n ---> (side) lineto [%.2f, %.2f]\n", coords[0], coords[1]);
-#endif
- line_set_length(normal, offset);
- line_translate(line, line_dx(normal), line_dy(normal));
-
- /* if we are starting a new subpath, move to correct starting point */
- if (first) {
- if (cap_first)
- create_joins(stroker, prev[0], prev[1], line,
- stroker_cap_mode(stroker));
- else
- stroker_emit_move_to(stroker, line[0], line[1]);
- memcpy(start_tangent, line,
- sizeof(VGfloat) * 4);
- first = VG_FALSE;
- } else {
- create_joins(stroker, prev[0], prev[1], line,
- stroker_join_mode(stroker));
- }
-
- /* add the stroke for this line */
- stroker_emit_line_to(stroker, line[2], line[3]);
- prev[0] = coords[0];
- prev[1] = coords[1];
- } else if (cmd == VG_CUBIC_TO_ABS) {
-#if STROKE_DEBUG
- debug_printf("\n ---> (side) cubicTo [%.2f, %.2f]\n",
- coords[4],
- coords[5]);
-#endif
- struct bezier bezier;
- int count;
-
- bezier_init(&bezier,
- prev[0], prev[1], coords[0], coords[1],
- coords[2], coords[3], coords[4], coords[5]);
-
- count = bezier_translate_by_normal(&bezier,
- offset_curves,
- MAX_OFFSET,
- offset,
- curve_threshold);
-
- if (count) {
- /* if we are starting a new subpath, move to correct starting point */
- VGfloat tangent[4];
- VGint i;
-
- bezier_start_tangent(&bezier, tangent);
- line_translate(tangent,
- offset_curves[0].x1 - bezier.x1,
- offset_curves[0].y1 - bezier.y1);
- if (first) {
- VGfloat pt[2] = {offset_curves[0].x1,
- offset_curves[0].y1};
-
- if (cap_first) {
- create_joins(stroker, prev[0], prev[1], tangent,
- stroker_cap_mode(stroker));
- } else {
- stroker_emit_move_to(stroker, pt[0], pt[1]);
- }
- start_tangent[0] = tangent[0];
- start_tangent[1] = tangent[1];
- start_tangent[2] = tangent[2];
- start_tangent[3] = tangent[3];
- first = VG_FALSE;
- } else {
- create_joins(stroker, prev[0], prev[1], tangent,
- stroker_join_mode(stroker));
- }
-
- /* add these beziers */
- for (i = 0; i < count; ++i) {
- struct bezier *bez = &offset_curves[i];
- stroker_emit_curve_to(stroker,
- bez->x2, bez->y2,
- bez->x3, bez->y3,
- bez->x4, bez->y4);
- }
- }
-
- prev[0] = coords[4];
- prev[1] = coords[5];
- }
- }
-
- if (floatsEqual(start[0], prev[0]) &&
- floatsEqual(start[1], prev[1])) {
- /* closed subpath, join first and last point */
-#if STROKE_DEBUG
- debug_printf("\n stroker: closed subpath\n");
-#endif
- create_joins(stroker, prev[0], prev[1], start_tangent,
- stroker_join_mode(stroker));
- return VG_TRUE;
- } else {
-#if STROKE_DEBUG
- debug_printf("\n stroker: open subpath\n");
-#endif
- return VG_FALSE;
- }
-#undef MAX_OFFSET
-}
-
-static void stroker_process_subpath(struct stroker *stroker)
-{
- VGboolean fwclosed, bwclosed;
- VGfloat fw_start_tangent[4], bw_start_tangent[4];
- struct stroke_iterator fwit;
- struct stroke_iterator bwit;
- debug_assert(stroker->segments->num_elements > 0);
-
- memset(fw_start_tangent, 0,
- sizeof(VGfloat)*4);
- memset(bw_start_tangent, 0,
- sizeof(VGfloat)*4);
-
- stroke_forward_iterator(&fwit, stroker->segments,
- stroker->control_points);
- stroke_backward_iterator(&bwit, stroker->segments,
- stroker->control_points);
-
- debug_assert(fwit.cmds[0] == VG_MOVE_TO_ABS);
-
- fwclosed = vg_stroke_outline(&fwit, stroker, VG_FALSE, fw_start_tangent);
- bwclosed = vg_stroke_outline(&bwit, stroker, !fwclosed, bw_start_tangent);
-
- if (!bwclosed)
- create_joins(stroker,
- fwit.coords[0], fwit.coords[1], fw_start_tangent,
- stroker_cap_mode(stroker));
- else {
- /* hack to handle the requirement of the VG spec that says that strokes
- * of len==0 that have butt cap or round cap still need
- * to be rendered. (8.7.4 Stroke Generation) */
- if (stroker->segments->num_elements <= 3) {
- VGPathCommand cmd;
- VGfloat data[8], coords[8];
- struct stroke_iterator *it = &fwit;
-
- stroke_forward_iterator(it, stroker->segments,
- stroker->control_points);
- cmd = stroke_itr_command(it);
- stroke_itr_coords(it, coords);
- if (cmd != VG_MOVE_TO_ABS) {
- memset(data, 0, sizeof(VGfloat) * 8);
- if (!is_segment_null(cmd, coords, data))
- return;
- } else {
- data[0] = coords[0];
- data[1] = coords[1];
- }
- while (it->has_next(it)) {
- it->next(it);
- cmd = stroke_itr_command(it);
- stroke_itr_coords(it, coords);
- if (!is_segment_null(cmd, coords, data))
- return;
- }
- /* generate the square/round cap */
- if (stroker->cap_style == VG_CAP_SQUARE) {
- VGfloat offset = stroker->stroke_width / 2;
- stroker_emit_move_to(stroker, data[0] - offset,
- data[1] - offset);
- stroker_emit_line_to(stroker, data[0] + offset,
- data[1] - offset);
- stroker_emit_line_to(stroker, data[0] + offset,
- data[1] + offset);
- stroker_emit_line_to(stroker, data[0] - offset,
- data[1] + offset);
- stroker_emit_line_to(stroker, data[0] - offset,
- data[1] - offset);
- } else if (stroker->cap_style == VG_CAP_ROUND) {
- VGfloat offset = stroker->stroke_width / 2;
- VGfloat cx = data[0], cy = data[1];
- { /*circle */
- struct arc arc;
- struct matrix matrix;
- matrix_load_identity(&matrix);
-
- stroker_emit_move_to(stroker, cx + offset, cy);
- arc_init(&arc, VG_SCCWARC_TO,
- cx + offset, cy,
- cx - offset, cy,
- offset, offset, 0);
- arc_stroker_emit(&arc, stroker, &matrix);
- arc_init(&arc, VG_SCCWARC_TO,
- cx - offset, cy,
- cx + offset, cy,
- offset, offset, 0);
- arc_stroker_emit(&arc, stroker, &matrix);
- }
- }
- }
- }
-}
-
-static INLINE VGfloat dash_pattern(struct dash_stroker *stroker,
- VGint idx)
-{
- if (stroker->dash_pattern[idx] < 0)
- return 0.f;
- return stroker->dash_pattern[idx];
-}
-
-static void dash_stroker_process_subpath(struct stroker *str)
-{
- struct dash_stroker *stroker = (struct dash_stroker *)str;
- VGfloat sum_length = 0;
- VGint i;
- VGint idash = 0;
- VGfloat pos = 0;
- VGfloat elen = 0;
- VGfloat doffset = stroker->dash_phase;
- VGfloat estart = 0;
- VGfloat estop = 0;
- VGfloat cline[4];
- struct stroke_iterator it;
- VGfloat prev[2];
- VGfloat move_to_pos[2];
- VGfloat line_to_pos[2];
-
- VGboolean has_move_to = VG_FALSE;
-
- stroke_flat_iterator(&it, stroker->base.segments,
- stroker->base.control_points);
-
- stroke_itr_coords(&it, prev);
- move_to_pos[0] = prev[0];
- move_to_pos[1] = prev[1];
-
- debug_assert(stroker->dash_pattern_num > 0);
-
- for (i = 0; i < stroker->dash_pattern_num; ++i) {
- sum_length += dash_pattern(stroker, i);
- }
-
- if (floatIsZero(sum_length)) {
- return;
- }
-
- doffset -= floorf(doffset / sum_length) * sum_length;
-
- while (!floatIsZero(doffset) && doffset >= dash_pattern(stroker, idash)) {
- doffset -= dash_pattern(stroker, idash);
- idash = (idash + 1) % stroker->dash_pattern_num;
- }
-
- while (it.has_next(&it)) {
- VGPathCommand cmd;
- VGfloat coords[8];
- VGboolean done;
-
- it.next(&it);
- cmd = stroke_itr_command(&it);
- stroke_itr_coords(&it, coords);
-
- debug_assert(cmd == VG_LINE_TO_ABS);
- cline[0] = prev[0];
- cline[1] = prev[1];
- cline[2] = coords[0];
- cline[3] = coords[1];
-
- elen = line_lengthv(cline);
-
- estop = estart + elen;
-
- done = pos >= estop;
- while (!done) {
- VGfloat p2[2];
-
- VGint idash_incr = 0;
- VGboolean has_offset = doffset > 0;
- VGfloat dpos = pos + dash_pattern(stroker, idash) - doffset - estart;
-
- debug_assert(dpos >= 0);
-
- if (dpos > elen) { /* dash extends this line */
- doffset = dash_pattern(stroker, idash) - (dpos - elen);
- pos = estop;
- done = VG_TRUE;
- p2[0] = cline[2];
- p2[1] = cline[3];
- } else { /* Dash is on this line */
- line_point_at(cline, dpos/elen, p2);
- pos = dpos + estart;
- done = pos >= estop;
- idash_incr = 1;
- doffset = 0;
- }
-
- if (idash % 2 == 0) {
- line_to_pos[0] = p2[0];
- line_to_pos[1] = p2[1];
-
- if (!has_offset || !has_move_to) {
- stroker_move_to(&stroker->stroker, move_to_pos[0], move_to_pos[1]);
- has_move_to = VG_TRUE;
- }
- stroker_line_to(&stroker->stroker, line_to_pos[0], line_to_pos[1]);
- } else {
- move_to_pos[0] = p2[0];
- move_to_pos[1] = p2[1];
- }
-
- idash = (idash + idash_incr) % stroker->dash_pattern_num;
- }
-
- estart = estop;
- prev[0] = coords[0];
- prev[1] = coords[1];
- }
-
- if (it.curve_poly) {
- polygon_destroy(it.curve_poly);
- it.curve_poly = 0;
- }
-
- stroker->base.path = stroker->stroker.path;
-}
-
-static void default_begin(struct stroker *stroker)
-{
- array_reset(stroker->segments);
- array_reset(stroker->control_points);
-}
-
-static void default_end(struct stroker *stroker)
-{
- if (stroker->segments->num_elements > 0)
- stroker->process_subpath(stroker);
-}
-
-
-static void dash_stroker_begin(struct stroker *stroker)
-{
- struct dash_stroker *dasher =
- (struct dash_stroker *)stroker;
-
- default_begin(&dasher->stroker);
- default_begin(stroker);
-}
-
-static void dash_stroker_end(struct stroker *stroker)
-{
- struct dash_stroker *dasher =
- (struct dash_stroker *)stroker;
-
- default_end(stroker);
- default_end(&dasher->stroker);
-}
-
-void stroker_init(struct stroker *stroker,
- struct vg_state *state)
-{
- stroker->stroke_width = state->stroke.line_width.f;
- stroker->miter_limit = state->stroke.miter_limit.f;
- stroker->cap_style = state->stroke.cap_style;
- stroker->join_style = state->stroke.join_style;
-
- stroker->begin = default_begin;
- stroker->process_subpath = stroker_process_subpath;
- stroker->end = default_end;
-
- stroker->segments = array_create(sizeof(VGubyte));
- stroker->control_points = array_create(sizeof(VGfloat));
-
- stroker->back1_x = 0;
- stroker->back1_y = 0;
- stroker->back2_x = 0;
- stroker->back2_y = 0;
-
- stroker->path = path_create(VG_PATH_DATATYPE_F, 1.0f, 0.0f,
- 0, 0, VG_PATH_CAPABILITY_ALL);
-
- /* Initialize with an invalid value */
- stroker->last_cmd = (VGPathCommand)0;
-}
-
-void dash_stroker_init(struct stroker *str,
- struct vg_state *state)
-{
- struct dash_stroker *stroker = (struct dash_stroker *)str;
- int i;
-
- stroker_init(str, state);
- stroker_init(&stroker->stroker, state);
-
- {
- int real_num = state->stroke.dash_pattern_num;
- if (real_num % 2)/* if odd, ignore the last one */
- --real_num;
- for (i = 0; i < real_num; ++i)
- stroker->dash_pattern[i] = state->stroke.dash_pattern[i].f;
- stroker->dash_pattern_num = real_num;
- }
-
- stroker->dash_phase = state->stroke.dash_phase.f;
- stroker->dash_phase_reset = state->stroke.dash_phase_reset;
-
- stroker->base.begin = dash_stroker_begin;
- stroker->base.process_subpath = dash_stroker_process_subpath;
- stroker->base.end = dash_stroker_end;
- path_destroy(stroker->base.path);
- stroker->base.path = NULL;
-}
-
-void stroker_begin(struct stroker *stroker)
-{
- stroker->begin(stroker);
-}
-
-void stroker_end(struct stroker *stroker)
-{
- stroker->end(stroker);
-}
-
-void stroker_cleanup(struct stroker *stroker)
-{
- array_destroy(stroker->segments);
- array_destroy(stroker->control_points);
-}
-
-void dash_stroker_cleanup(struct dash_stroker *stroker)
-{
- /* if stroker->base.path is null means we never
- * processed a valid path so delete the temp one
- * we already created */
- if (!stroker->base.path)
- path_destroy(stroker->stroker.path);
- stroker_cleanup(&stroker->stroker);
- stroker_cleanup((struct stroker*)stroker);
-}
diff --git a/src/gallium/state_trackers/vega/stroker.h b/src/gallium/state_trackers/vega/stroker.h
deleted file mode 100644
index 36543cd9237..00000000000
--- a/src/gallium/state_trackers/vega/stroker.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef STROKER_H
-#define STROKER_H
-
-#include "VG/openvg.h"
-#include "api_consts.h"
-
-struct path;
-struct vg_state;
-struct array;
-
-struct stroker {
- void (*begin)(struct stroker *stroker);
- void (*process_subpath)(struct stroker *stroker);
- void (*end)(struct stroker *stroker);
-
- struct array *segments;
- struct array *control_points;
- struct path *path;
-
- VGfloat back1_x, back1_y;
- VGfloat back2_x, back2_y;
-
- VGfloat stroke_width;
- VGfloat miter_limit;
- VGCapStyle cap_style;
- VGJoinStyle join_style;
-
- VGPathCommand last_cmd;
-};
-
-struct dash_stroker {
- struct stroker base;
-
- struct stroker stroker;
-
- VGfloat dash_pattern[VEGA_MAX_DASH_COUNT];
- VGint dash_pattern_num;
- VGfloat dash_phase;
- VGboolean dash_phase_reset;
-};
-
-void stroker_init(struct stroker *stroker,
- struct vg_state *state);
-void dash_stroker_init(struct stroker *stroker,
- struct vg_state *state);
-void dash_stroker_cleanup(struct dash_stroker *stroker);
-void stroker_cleanup(struct stroker *stroker);
-
-void stroker_begin(struct stroker *stroker);
-void stroker_move_to(struct stroker *stroker, VGfloat x, VGfloat y);
-void stroker_line_to(struct stroker *stroker, VGfloat x, VGfloat y);
-void stroker_curve_to(struct stroker *stroker, VGfloat px1, VGfloat py1,
- VGfloat px2, VGfloat py2,
- VGfloat x, VGfloat y);
-void stroker_end(struct stroker *stroker);
-
-void stroker_emit_move_to(struct stroker *stroker, VGfloat x, VGfloat y);
-void stroker_emit_line_to(struct stroker *stroker, VGfloat x, VGfloat y);
-void stroker_emit_curve_to(struct stroker *stroker, VGfloat px1, VGfloat py1,
- VGfloat px2, VGfloat py2,
- VGfloat x, VGfloat y);
-
-#endif
diff --git a/src/gallium/state_trackers/vega/text.c b/src/gallium/state_trackers/vega/text.c
deleted file mode 100644
index 3537f3fb8ac..00000000000
--- a/src/gallium/state_trackers/vega/text.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2010 LunarG, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "util/u_memory.h"
-#include "cso_cache/cso_hash.h"
-
-#include "text.h"
-#include "image.h"
-#include "path.h"
-
-#ifdef OPENVG_VERSION_1_1
-
-struct vg_font {
- struct vg_object base;
- struct cso_hash *glyphs;
-};
-
-struct vg_glyph {
- struct vg_object *object; /* it could be NULL */
- VGboolean is_hinted;
- VGfloat glyph_origin[2];
- VGfloat escapement[2];
-};
-
-static VGboolean del_glyph(struct vg_font *font,
- VGuint glyphIndex)
-{
- struct vg_glyph *glyph;
-
- glyph = (struct vg_glyph *)
- cso_hash_take(font->glyphs, (unsigned) glyphIndex);
- FREE(glyph);
-
- return (glyph != NULL);
-}
-
-static void add_glyph(struct vg_font *font,
- VGuint glyphIndex,
- struct vg_object *obj,
- VGboolean isHinted,
- const VGfloat glyphOrigin[2],
- const VGfloat escapement[2])
-{
- struct vg_glyph *glyph;
-
- /* remove the existing one */
- del_glyph(font, glyphIndex);
-
- glyph = CALLOC_STRUCT(vg_glyph);
- glyph->object = obj;
- glyph->is_hinted = isHinted;
- memcpy(glyph->glyph_origin, glyphOrigin, sizeof(glyph->glyph_origin));
- memcpy(glyph->escapement, escapement, sizeof(glyph->glyph_origin));
-
- cso_hash_insert(font->glyphs, (unsigned) glyphIndex, glyph);
-}
-
-static struct vg_glyph *get_glyph(struct vg_font *font,
- VGuint glyphIndex)
-{
- struct cso_hash_iter iter;
-
- iter = cso_hash_find(font->glyphs, (unsigned) glyphIndex);
- return (struct vg_glyph *) cso_hash_iter_data(iter);
-}
-
-static void vg_render_glyph(struct vg_context *ctx,
- struct vg_glyph *glyph,
- VGbitfield paintModes,
- VGboolean allowAutoHinting)
-{
- if (glyph->object && paintModes) {
- struct vg_state *state = &ctx->state.vg;
- struct matrix m;
-
- m = state->glyph_user_to_surface_matrix;
- matrix_translate(&m,
- state->glyph_origin[0].f - glyph->glyph_origin[0],
- state->glyph_origin[1].f - glyph->glyph_origin[1]);
-
- if (glyph->object->type == VG_OBJECT_PATH) {
- path_render((struct path *) glyph->object, paintModes, &m);
- }
- else {
- assert(glyph->object->type == VG_OBJECT_IMAGE);
- image_draw((struct vg_image *) glyph->object, &m);
- }
- }
-}
-
-static void vg_advance_glyph(struct vg_context *ctx,
- struct vg_glyph *glyph,
- VGfloat adjustment_x,
- VGfloat adjustment_y,
- VGboolean last)
-{
- struct vg_value *glyph_origin = ctx->state.vg.glyph_origin;
-
- glyph_origin[0].f += glyph->escapement[0] + adjustment_x;
- glyph_origin[1].f += glyph->escapement[1] + adjustment_y;
-
- if (last) {
- glyph_origin[0].i = float_to_int_floor(glyph_origin[0].f);
- glyph_origin[1].i = float_to_int_floor(glyph_origin[1].f);
- }
-}
-
-struct vg_font *font_create(VGint glyphCapacityHint)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_font *font;
-
- font = CALLOC_STRUCT(vg_font);
- vg_init_object(&font->base, ctx, VG_OBJECT_FONT);
- font->glyphs = cso_hash_create();
-
- vg_context_add_object(ctx, &font->base);
-
- return font;
-}
-
-void font_destroy(struct vg_font *font)
-{
- struct vg_context *ctx = vg_current_context();
- struct cso_hash_iter iter;
-
- vg_context_remove_object(ctx, &font->base);
-
- iter = cso_hash_first_node(font->glyphs);
- while (!cso_hash_iter_is_null(iter)) {
- struct vg_glyph *glyph = (struct vg_glyph *) cso_hash_iter_data(iter);
- FREE(glyph);
- iter = cso_hash_iter_next(iter);
- }
- cso_hash_delete(font->glyphs);
-
- vg_free_object(&font->base);
-
- FREE(font);
-}
-
-void font_set_glyph_to_path(struct vg_font *font,
- VGuint glyphIndex,
- struct path *path,
- VGboolean isHinted,
- const VGfloat glyphOrigin[2],
- const VGfloat escapement[2])
-{
- add_glyph(font, glyphIndex, (struct vg_object *) path,
- isHinted, glyphOrigin, escapement);
-}
-
-void font_set_glyph_to_image(struct vg_font *font,
- VGuint glyphIndex,
- struct vg_image *image,
- const VGfloat glyphOrigin[2],
- const VGfloat escapement[2])
-{
- add_glyph(font, glyphIndex, (struct vg_object *) image,
- VG_TRUE, glyphOrigin, escapement);
-}
-
-void font_clear_glyph(struct vg_font *font,
- VGuint glyphIndex)
-{
- if (!del_glyph(font, glyphIndex)) {
- struct vg_context *ctx = vg_current_context();
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- }
-}
-
-void font_draw_glyph(struct vg_font *font,
- VGuint glyphIndex,
- VGbitfield paintModes,
- VGboolean allowAutoHinting)
-{
- struct vg_context *ctx = vg_current_context();
- struct vg_glyph *glyph;
-
- glyph = get_glyph(font, glyphIndex);
- if (!glyph) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
-
- vg_render_glyph(ctx, glyph, paintModes, allowAutoHinting);
- vg_advance_glyph(ctx, glyph, 0.0f, 0.0f, VG_TRUE);
-}
-
-void font_draw_glyphs(struct vg_font *font,
- VGint glyphCount,
- const VGuint *glyphIndices,
- const VGfloat *adjustments_x,
- const VGfloat *adjustments_y,
- VGbitfield paintModes,
- VGboolean allowAutoHinting)
-{
- struct vg_context *ctx = vg_current_context();
- VGint i;
-
- for (i = 0; i < glyphCount; ++i) {
- if (!get_glyph(font, glyphIndices[i])) {
- vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR);
- return;
- }
- }
-
- for (i = 0; i < glyphCount; ++i) {
- struct vg_glyph *glyph;
- VGfloat adj_x, adj_y;
-
- glyph = get_glyph(font, glyphIndices[i]);
-
- vg_render_glyph(ctx, glyph, paintModes, allowAutoHinting);
-
- adj_x = (adjustments_x) ? adjustments_x[i] : 0.0f;
- adj_y = (adjustments_y) ? adjustments_y[i] : 0.0f;
- vg_advance_glyph(ctx, glyph, adj_x, adj_y, (i == glyphCount - 1));
- }
-}
-
-VGint font_num_glyphs(struct vg_font *font)
-{
- return cso_hash_size(font->glyphs);
-}
-
-#endif /* OPENVG_VERSION_1_1 */
diff --git a/src/gallium/state_trackers/vega/text.h b/src/gallium/state_trackers/vega/text.h
deleted file mode 100644
index 6b3fa7323e9..00000000000
--- a/src/gallium/state_trackers/vega/text.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2010 LunarG, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef _TEXT_H
-#define _TEXT_H
-
-#include "vg_context.h"
-#include "cso_cache/cso_hash.h"
-
-struct vg_font;
-struct vg_image;
-struct path;
-
-struct vg_font *font_create(VGint glyphCapacityHint);
-void font_destroy(struct vg_font *font);
-
-void font_set_glyph_to_path(struct vg_font *font,
- VGuint glyphIndex,
- struct path *path,
- VGboolean isHinted,
- const VGfloat glyphOrigin[2],
- const VGfloat escapement[2]);
-
-void font_set_glyph_to_image(struct vg_font *font,
- VGuint glyphIndex,
- struct vg_image *image,
- const VGfloat glyphOrigin[2],
- const VGfloat escapement[2]);
-
-void font_clear_glyph(struct vg_font *font,
- VGuint glyphIndex);
-
-void font_draw_glyph(struct vg_font *font,
- VGuint glyphIndex,
- VGbitfield paintModes,
- VGboolean allowAutoHinting);
-
-void font_draw_glyphs(struct vg_font *font,
- VGint glyphCount,
- const VGuint *glyphIndices,
- const VGfloat *adjustments_x,
- const VGfloat *adjustments_y,
- VGbitfield paintModes,
- VGboolean allowAutoHinting);
-
-VGint font_num_glyphs(struct vg_font *font);
-
-#endif /* _TEXT_H */
diff --git a/src/gallium/state_trackers/vega/util_array.h b/src/gallium/state_trackers/vega/util_array.h
deleted file mode 100644
index b2d22f476ee..00000000000
--- a/src/gallium/state_trackers/vega/util_array.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef UTIL_ARRAY_H
-#define UTIL_ARRAY_H
-
-#include "util/u_memory.h"
-
-#define DEFAULT_ARRAY_SIZE 256
-
-struct array {
- VGint datatype_size;
- void *data;
- VGint size;
- VGint num_elements;
-};
-
-static INLINE struct array *array_create(VGint datatype_size)
-{
- struct array *array = CALLOC_STRUCT(array);
- array->datatype_size = datatype_size;
-
- array->size = DEFAULT_ARRAY_SIZE;
- array->data = malloc(array->size * array->datatype_size);
-
- return array;
-}
-
-
-static INLINE struct array *array_create_size(VGint datatype_size, VGint size)
-{
- struct array *array = CALLOC_STRUCT(array);
- array->datatype_size = datatype_size;
-
- array->size = size;
- array->data = malloc(array->size * array->datatype_size);
-
- return array;
-}
-
-static INLINE void array_destroy(struct array *array)
-{
- if (array)
- free(array->data);
- FREE(array);
-}
-
-static INLINE void array_resize(struct array *array, int num)
-{
- VGint size = array->datatype_size * num;
- void *data = malloc(size);
- memcpy(data, array->data, array->size * array->datatype_size);
- free(array->data);
- array->data = data;
- array->size = num;
- array->num_elements = (array->num_elements > num) ? num :
- array->num_elements;
-}
-
-static INLINE void array_append_data(struct array *array,
- const void *data, int num_elements)
-{
- VGbyte *adata;
-
- while (array->num_elements + num_elements > array->size) {
- array_resize(array, (array->num_elements + num_elements) * 1.5);
- }
- adata = (VGbyte *)array->data;
- memcpy(adata + (array->num_elements * array->datatype_size), data,
- num_elements * array->datatype_size);
- array->num_elements += num_elements;
-}
-
-static INLINE void array_change_data(struct array *array,
- const void *data,
- int start_idx,
- int num_elements)
-{
- VGbyte *adata = (VGbyte *)array->data;
- memcpy(adata + (start_idx * array->datatype_size), data,
- num_elements * array->datatype_size);
-}
-
-static INLINE void array_remove_element(struct array *array,
- int idx)
-{
- VGbyte *adata = (VGbyte *)array->data;
- memmove(adata + (idx * array->datatype_size),
- adata + ((idx + 1) * array->datatype_size),
- (array->num_elements - idx - 1) * array->datatype_size);
- --array->num_elements;
-}
-
-static INLINE void array_reset(struct array *array)
-{
- array->num_elements = 0;
-}
-
-#endif
diff --git a/src/gallium/state_trackers/vega/vg_api.h b/src/gallium/state_trackers/vega/vg_api.h
deleted file mode 100644
index e97e238b849..00000000000
--- a/src/gallium/state_trackers/vega/vg_api.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Mesa 3-D graphics library
- *
- * Copyright (C) 2010 LunarG Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- * Chia-I Wu <olv@lunarg.com>
- */
-
-#ifndef VG_API_H
-#define VG_API_H
-
-struct st_api;
-
-const struct st_api *
-vg_api_get(void);
-
-#endif /* VG_API_H */
diff --git a/src/gallium/state_trackers/vega/vg_context.c b/src/gallium/state_trackers/vega/vg_context.c
deleted file mode 100644
index 48a03c5a64a..00000000000
--- a/src/gallium/state_trackers/vega/vg_context.c
+++ /dev/null
@@ -1,537 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "vg_context.h"
-
-#include "paint.h"
-#include "renderer.h"
-#include "shaders_cache.h"
-#include "shader.h"
-#include "vg_manager.h"
-#include "api.h"
-#include "mask.h"
-#include "handle.h"
-
-#include "pipe/p_context.h"
-#include "util/u_inlines.h"
-
-#include "cso_cache/cso_context.h"
-
-#include "util/u_memory.h"
-#include "util/u_sampler.h"
-#include "util/u_surface.h"
-#include "util/u_format.h"
-
-struct vg_context *_vg_context = 0;
-
-struct vg_context * vg_current_context(void)
-{
- return _vg_context;
-}
-
-/**
- * A depth/stencil rb will be needed regardless of what the visual says.
- */
-static boolean
-choose_depth_stencil_format(struct vg_context *ctx)
-{
- struct pipe_screen *screen = ctx->pipe->screen;
- enum pipe_format formats[] = {
- PIPE_FORMAT_Z24_UNORM_S8_UINT,
- PIPE_FORMAT_S8_UINT_Z24_UNORM,
- PIPE_FORMAT_NONE
- };
- enum pipe_format *fmt;
-
- for (fmt = formats; *fmt != PIPE_FORMAT_NONE; fmt++) {
- if (screen->is_format_supported(screen, *fmt,
- PIPE_TEXTURE_2D, 0, PIPE_BIND_DEPTH_STENCIL))
- break;
- }
-
- ctx->ds_format = *fmt;
-
- return (ctx->ds_format != PIPE_FORMAT_NONE);
-}
-
-void vg_set_current_context(struct vg_context *ctx)
-{
- _vg_context = ctx;
- api_make_dispatch_current((ctx) ? ctx->dispatch : NULL);
-}
-
-struct vg_context * vg_create_context(struct pipe_context *pipe,
- const void *visual,
- struct vg_context *share)
-{
- struct vg_context *ctx;
-
- ctx = CALLOC_STRUCT(vg_context);
-
- ctx->pipe = pipe;
- if (!choose_depth_stencil_format(ctx)) {
- FREE(ctx);
- return NULL;
- }
-
- ctx->dispatch = api_create_dispatch();
-
- vg_init_state(&ctx->state.vg);
- ctx->state.dirty = ALL_DIRTY;
-
- ctx->cso_context = cso_create_context(pipe);
-
- ctx->default_paint = paint_create(ctx);
- ctx->state.vg.stroke_paint = ctx->default_paint;
- ctx->state.vg.fill_paint = ctx->default_paint;
-
-
- ctx->mask.sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- ctx->mask.sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- ctx->mask.sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- ctx->mask.sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
- ctx->mask.sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
- ctx->mask.sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
- ctx->mask.sampler.normalized_coords = 0;
-
- ctx->blend_sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- ctx->blend_sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- ctx->blend_sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
- ctx->blend_sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
- ctx->blend_sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
- ctx->blend_sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
- ctx->blend_sampler.normalized_coords = 0;
-
- vg_set_error(ctx, VG_NO_ERROR);
-
- ctx->owned_objects[VG_OBJECT_PAINT] = cso_hash_create();
- ctx->owned_objects[VG_OBJECT_IMAGE] = cso_hash_create();
- ctx->owned_objects[VG_OBJECT_MASK] = cso_hash_create();
- ctx->owned_objects[VG_OBJECT_FONT] = cso_hash_create();
- ctx->owned_objects[VG_OBJECT_PATH] = cso_hash_create();
-
- ctx->renderer = renderer_create(ctx);
- ctx->sc = shaders_cache_create(ctx);
- ctx->shader = shader_create(ctx);
-
- return ctx;
-}
-
-void vg_destroy_context(struct vg_context *ctx)
-{
- struct pipe_resource **cbuf = &ctx->mask.cbuf;
-
- renderer_destroy(ctx->renderer);
- shaders_cache_destroy(ctx->sc);
- shader_destroy(ctx->shader);
- paint_destroy(ctx->default_paint);
-
- if (*cbuf)
- pipe_resource_reference(cbuf, NULL);
-
- if (ctx->mask.union_fs)
- vg_shader_destroy(ctx, ctx->mask.union_fs);
- if (ctx->mask.intersect_fs)
- vg_shader_destroy(ctx, ctx->mask.intersect_fs);
- if (ctx->mask.subtract_fs)
- vg_shader_destroy(ctx, ctx->mask.subtract_fs);
- if (ctx->mask.set_fs)
- vg_shader_destroy(ctx, ctx->mask.set_fs);
-
- cso_destroy_context(ctx->cso_context);
-
- cso_hash_delete(ctx->owned_objects[VG_OBJECT_PAINT]);
- cso_hash_delete(ctx->owned_objects[VG_OBJECT_IMAGE]);
- cso_hash_delete(ctx->owned_objects[VG_OBJECT_MASK]);
- cso_hash_delete(ctx->owned_objects[VG_OBJECT_FONT]);
- cso_hash_delete(ctx->owned_objects[VG_OBJECT_PATH]);
-
- api_destroy_dispatch(ctx->dispatch);
-
- FREE(ctx);
-}
-
-void vg_init_object(struct vg_object *obj, struct vg_context *ctx, enum vg_object_type type)
-{
- obj->type = type;
- obj->ctx = ctx;
- obj->handle = create_handle(obj);
-}
-
-/** free object resources, but not the object itself */
-void vg_free_object(struct vg_object *obj)
-{
- obj->type = 0;
- obj->ctx = NULL;
- destroy_handle(obj->handle);
-}
-
-VGboolean vg_context_is_object_valid(struct vg_context *ctx,
- enum vg_object_type type,
- VGHandle handle)
-{
- if (ctx) {
- struct cso_hash *hash = ctx->owned_objects[type];
- if (!hash)
- return VG_FALSE;
- return cso_hash_contains(hash, (unsigned) handle);
- }
- return VG_FALSE;
-}
-
-void vg_context_add_object(struct vg_context *ctx,
- struct vg_object *obj)
-{
- if (ctx) {
- struct cso_hash *hash = ctx->owned_objects[obj->type];
- if (!hash)
- return;
- cso_hash_insert(hash, (unsigned) obj->handle, obj);
- }
-}
-
-void vg_context_remove_object(struct vg_context *ctx,
- struct vg_object *obj)
-{
- if (ctx) {
- struct cso_hash *hash = ctx->owned_objects[obj->type];
- if (!hash)
- return;
- cso_hash_take(hash, (unsigned) obj->handle);
- }
-}
-
-static struct pipe_resource *
-create_texture(struct pipe_context *pipe, enum pipe_format format,
- VGint width, VGint height)
-{
- struct pipe_resource templ;
-
- memset(&templ, 0, sizeof(templ));
-
- if (format != PIPE_FORMAT_NONE) {
- templ.format = format;
- }
- else {
- templ.format = PIPE_FORMAT_B8G8R8A8_UNORM;
- }
-
- templ.target = PIPE_TEXTURE_2D;
- templ.width0 = width;
- templ.height0 = height;
- templ.depth0 = 1;
- templ.array_size = 1;
- templ.last_level = 0;
-
- if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1)) {
- templ.bind = PIPE_BIND_DEPTH_STENCIL;
- } else {
- templ.bind = (PIPE_BIND_DISPLAY_TARGET |
- PIPE_BIND_RENDER_TARGET |
- PIPE_BIND_SAMPLER_VIEW);
- }
-
- return pipe->screen->resource_create(pipe->screen, &templ);
-}
-
-static struct pipe_sampler_view *
-create_tex_and_view(struct pipe_context *pipe, enum pipe_format format,
- VGint width, VGint height)
-{
- struct pipe_resource *texture;
- struct pipe_sampler_view view_templ;
- struct pipe_sampler_view *view;
-
- texture = create_texture(pipe, format, width, height);
-
- if (!texture)
- return NULL;
-
- u_sampler_view_default_template(&view_templ, texture, texture->format);
- view = pipe->create_sampler_view(pipe, texture, &view_templ);
- /* want the texture to go away if the view is freed */
- pipe_resource_reference(&texture, NULL);
-
- return view;
-}
-
-static void
-vg_context_update_surface_mask_view(struct vg_context *ctx,
- uint width, uint height)
-{
- struct st_framebuffer *stfb = ctx->draw_buffer;
- struct pipe_sampler_view *old_sampler_view = stfb->surface_mask_view;
- struct pipe_context *pipe = ctx->pipe;
-
- if (old_sampler_view &&
- old_sampler_view->texture->width0 == width &&
- old_sampler_view->texture->height0 == height)
- return;
-
- /*
- we use PIPE_FORMAT_B8G8R8A8_UNORM because we want to render to
- this texture and use it as a sampler, so while this wastes some
- space it makes both of those a lot simpler
- */
- stfb->surface_mask_view = create_tex_and_view(pipe,
- PIPE_FORMAT_B8G8R8A8_UNORM, width, height);
-
- if (!stfb->surface_mask_view) {
- if (old_sampler_view)
- pipe_sampler_view_reference(&old_sampler_view, NULL);
- return;
- }
-
- /* XXX could this call be avoided? */
- vg_validate_state(ctx);
-
- /* alpha mask starts with 1.f alpha */
- mask_fill(0, 0, width, height, 1.f);
-
- /* if we had an old surface copy it over */
- if (old_sampler_view) {
- struct pipe_box src_box;
- u_box_origin_2d(MIN2(old_sampler_view->texture->width0,
- stfb->surface_mask_view->texture->width0),
- MIN2(old_sampler_view->texture->height0,
- stfb->surface_mask_view->texture->height0),
- &src_box);
-
- pipe->resource_copy_region(pipe,
- stfb->surface_mask_view->texture,
- 0, 0, 0, 0,
- old_sampler_view->texture,
- 0, &src_box);
- }
-
- /* Free the old texture
- */
- if (old_sampler_view)
- pipe_sampler_view_reference(&old_sampler_view, NULL);
-}
-
-static void
-vg_context_update_blend_texture_view(struct vg_context *ctx,
- uint width, uint height)
-{
- struct pipe_context *pipe = ctx->pipe;
- struct st_framebuffer *stfb = ctx->draw_buffer;
- struct pipe_sampler_view *old = stfb->blend_texture_view;
-
- if (old &&
- old->texture->width0 == width &&
- old->texture->height0 == height)
- return;
-
- stfb->blend_texture_view = create_tex_and_view(pipe,
- PIPE_FORMAT_B8G8R8A8_UNORM, width, height);
-
- pipe_sampler_view_reference(&old, NULL);
-}
-
-static boolean
-vg_context_update_depth_stencil_rb(struct vg_context * ctx,
- uint width, uint height)
-{
- struct st_renderbuffer *dsrb = ctx->draw_buffer->dsrb;
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_surface surf_tmpl;
-
- if ((dsrb->width == width && dsrb->height == height) && dsrb->texture)
- return FALSE;
-
- /* unreference existing ones */
- pipe_surface_reference(&dsrb->surface, NULL);
- pipe_resource_reference(&dsrb->texture, NULL);
- dsrb->width = dsrb->height = 0;
-
- dsrb->texture = create_texture(pipe, dsrb->format, width, height);
- if (!dsrb->texture)
- return TRUE;
-
- u_surface_default_template(&surf_tmpl, dsrb->texture);
- dsrb->surface = pipe->create_surface(pipe,
- dsrb->texture,
- &surf_tmpl);
- if (!dsrb->surface) {
- pipe_resource_reference(&dsrb->texture, NULL);
- return TRUE;
- }
-
- dsrb->width = width;
- dsrb->height = height;
-
- assert(dsrb->surface->width == width);
- assert(dsrb->surface->height == height);
-
- return TRUE;
-}
-
-void vg_validate_state(struct vg_context *ctx)
-{
- struct st_framebuffer *stfb = ctx->draw_buffer;
-
- vg_manager_validate_framebuffer(ctx);
-
- if (vg_context_update_depth_stencil_rb(ctx, stfb->width, stfb->height))
- ctx->state.dirty |= DEPTH_STENCIL_DIRTY;
-
- /* blend state depends on fb format and paint color */
- if ((ctx->state.dirty & FRAMEBUFFER_DIRTY) ||
- (ctx->state.dirty & PAINT_DIRTY))
- ctx->state.dirty |= BLEND_DIRTY;
-
- renderer_validate(ctx->renderer, ctx->state.dirty,
- ctx->draw_buffer, &ctx->state.vg);
-
- ctx->state.dirty = 0;
-
- shader_set_masking(ctx->shader, ctx->state.vg.masking);
- shader_set_image_mode(ctx->shader, ctx->state.vg.image_mode);
- shader_set_color_transform(ctx->shader, ctx->state.vg.color_transform);
-}
-
-VGboolean vg_object_is_valid(VGHandle object, enum vg_object_type type)
-{
- struct vg_object *obj = handle_to_object(object);
- if (obj && is_aligned(obj) && obj->type == type)
- return VG_TRUE;
- else
- return VG_FALSE;
-}
-
-void vg_set_error(struct vg_context *ctx,
- VGErrorCode code)
-{
- /*vgGetError returns the oldest error code provided by
- * an API call on the current context since the previous
- * call to vgGetError on that context (or since the creation
- of the context).*/
- if (ctx->_error == VG_NO_ERROR)
- ctx->_error = code;
-}
-
-static void vg_prepare_blend_texture(struct vg_context *ctx,
- struct pipe_sampler_view *src)
-{
- struct st_framebuffer *stfb = ctx->draw_buffer;
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_blit_info info;
-
- vg_context_update_blend_texture_view(ctx, stfb->width, stfb->height);
-
- memset(&info, 0, sizeof info);
- info.dst.resource = stfb->blend_texture_view->texture;
- info.dst.level = 0;
- info.dst.box.x = 0;
- info.dst.box.y = 0;
- info.dst.box.z = 0;
- info.dst.box.width = stfb->width;
- info.dst.box.height = stfb->height;
- info.dst.box.depth = 1;
- info.dst.format = stfb->blend_texture_view->format;
- info.src.resource = src->texture;
- info.src.level = src->u.tex.first_level;
- info.src.box.x = 0;
- info.src.box.y = 0;
- info.src.box.z = src->u.tex.first_layer;
- info.src.box.width = stfb->width;
- info.src.box.height = stfb->height;
- info.src.box.depth = 1;
- info.src.format = src->format;
- info.mask = PIPE_MASK_RGBA;
- info.filter = PIPE_TEX_MIPFILTER_NEAREST;
- info.scissor_enable = 0;
-
- pipe->blit(pipe, &info);
-}
-
-struct pipe_sampler_view *vg_prepare_blend_surface(struct vg_context *ctx)
-{
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_sampler_view *view;
- struct pipe_sampler_view view_templ;
- struct st_framebuffer *stfb = ctx->draw_buffer;
- struct st_renderbuffer *strb = stfb->strb;
-
- vg_validate_state(ctx);
-
- u_sampler_view_default_template(&view_templ, strb->texture, strb->texture->format);
- view = pipe->create_sampler_view(pipe, strb->texture, &view_templ);
-
- vg_prepare_blend_texture(ctx, view);
-
- pipe_sampler_view_reference(&view, NULL);
-
- return stfb->blend_texture_view;
-}
-
-
-struct pipe_sampler_view *vg_prepare_blend_surface_from_mask(struct vg_context *ctx)
-{
- struct st_framebuffer *stfb = ctx->draw_buffer;
-
- vg_validate_state(ctx);
-
- vg_context_update_surface_mask_view(ctx, stfb->width, stfb->height);
- vg_prepare_blend_texture(ctx, stfb->surface_mask_view);
-
- return stfb->blend_texture_view;
-}
-
-struct pipe_sampler_view *vg_get_surface_mask(struct vg_context *ctx)
-{
- struct st_framebuffer *stfb = ctx->draw_buffer;
-
- vg_context_update_surface_mask_view(ctx, stfb->width, stfb->height);
-
- return stfb->surface_mask_view;
-}
-
-/**
- * A transformation from window coordinates to paint coordinates.
- */
-VGboolean vg_get_paint_matrix(struct vg_context *ctx,
- const struct matrix *paint_to_user,
- const struct matrix *user_to_surface,
- struct matrix *mat)
-{
- struct matrix tmp;
-
- /* get user-to-paint matrix */
- memcpy(mat, paint_to_user, sizeof(*paint_to_user));
- if (!matrix_invert(mat))
- return VG_FALSE;
-
- /* get surface-to-user matrix */
- memcpy(&tmp, user_to_surface, sizeof(*user_to_surface));
- if (!matrix_invert(&tmp))
- return VG_FALSE;
-
- matrix_mult(mat, &tmp);
-
- return VG_TRUE;
-}
diff --git a/src/gallium/state_trackers/vega/vg_context.h b/src/gallium/state_trackers/vega/vg_context.h
deleted file mode 100644
index 5a2a322743d..00000000000
--- a/src/gallium/state_trackers/vega/vg_context.h
+++ /dev/null
@@ -1,280 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef VG_CONTEXT_H
-#define VG_CONTEXT_H
-
-#include "vg_state.h"
-
-#include "pipe/p_format.h"
-#include "pipe/p_state.h"
-#include "util/u_pointer.h"
-#include "util/u_math.h"
-#include "state_tracker/st_api.h"
-
-#include "cso_cache/cso_hash.h"
-#include "cso_cache/cso_context.h"
-
-struct renderer;
-struct shaders_cache;
-struct shader;
-struct vg_shader;
-struct mapi_table;
-
-struct st_renderbuffer {
- enum pipe_format format;
- struct pipe_surface *surface;
- struct pipe_resource *texture;
- VGint width, height;
-};
-
-struct st_framebuffer {
- VGint width, height;
- struct st_renderbuffer *strb;
- struct st_renderbuffer *dsrb;
-
- struct pipe_sampler_view *surface_mask_view;
-
- struct pipe_sampler_view *blend_texture_view;
-
-
- struct st_framebuffer_iface *iface;
- enum st_attachment_type strb_att;
-
- void *privateData;
- int32_t stamp;
- int32_t iface_stamp;
-};
-
-enum vg_object_type {
- VG_OBJECT_UNKNOWN = 0,
- VG_OBJECT_PAINT,
- VG_OBJECT_IMAGE,
- VG_OBJECT_MASK,
- VG_OBJECT_FONT,
- VG_OBJECT_PATH,
-
- VG_OBJECT_LAST
-};
-enum dirty_state {
- BLEND_DIRTY = 1 << 0,
- FRAMEBUFFER_DIRTY = 1 << 1,
- DEPTH_STENCIL_DIRTY = 1 << 2,
- PAINT_DIRTY = 1 << 3,
-
- ALL_DIRTY = BLEND_DIRTY |
- FRAMEBUFFER_DIRTY |
- DEPTH_STENCIL_DIRTY |
- PAINT_DIRTY
-};
-
-struct vg_context
-{
- struct st_context_iface iface;
- struct mapi_table *dispatch;
-
- struct pipe_context *pipe;
- enum pipe_format ds_format;
-
- struct {
- struct vg_state vg;
- VGbitfield dirty;
- } state;
-
- VGErrorCode _error;
-
- struct st_framebuffer *draw_buffer;
-
- struct cso_hash *owned_objects[VG_OBJECT_LAST];
-
- struct {
- struct pipe_resource *cbuf;
- struct pipe_sampler_state sampler;
-
- struct vg_shader *union_fs;
- struct vg_shader *intersect_fs;
- struct vg_shader *subtract_fs;
- struct vg_shader *set_fs;
- } mask;
-
- struct cso_context *cso_context;
-
- struct renderer *renderer;
- struct shaders_cache *sc;
- struct shader *shader;
-
- struct pipe_sampler_state blend_sampler;
- struct vg_paint *default_paint;
-
- int32_t draw_stamp;
-};
-
-
-/**
- * Base class for VG objects like paths, images, fonts.
- */
-struct vg_object {
- enum vg_object_type type;
- VGHandle handle;
- struct vg_context *ctx;
-};
-
-
-void vg_init_object(struct vg_object *obj, struct vg_context *ctx, enum vg_object_type type);
-void vg_free_object(struct vg_object *obj);
-
-VGboolean vg_object_is_valid(VGHandle object, enum vg_object_type type);
-
-struct vg_context *vg_create_context(struct pipe_context *pipe,
- const void *visual,
- struct vg_context *share);
-void vg_destroy_context(struct vg_context *ctx);
-struct vg_context *vg_current_context(void);
-void vg_set_current_context(struct vg_context *ctx);
-
-VGboolean vg_context_is_object_valid(struct vg_context *ctx,
- enum vg_object_type type,
- VGHandle object);
-void vg_context_add_object(struct vg_context *ctx,
- struct vg_object *obj);
-void vg_context_remove_object(struct vg_context *ctx,
- struct vg_object *obj);
-
-void vg_validate_state(struct vg_context *ctx);
-
-void vg_set_error(struct vg_context *ctx,
- VGErrorCode code);
-
-struct pipe_sampler_view *vg_prepare_blend_surface(struct vg_context *ctx);
-struct pipe_sampler_view *vg_prepare_blend_surface_from_mask(struct vg_context *ctx);
-
-struct pipe_sampler_view *vg_get_surface_mask(struct vg_context *ctx);
-
-VGboolean vg_get_paint_matrix(struct vg_context *ctx,
- const struct matrix *paint_to_user,
- const struct matrix *user_to_surface,
- struct matrix *mat);
-
-static INLINE VGboolean is_aligned_to(const void *ptr, VGbyte alignment)
-{
- void *aligned = align_pointer(ptr, alignment);
- return (ptr == aligned) ? VG_TRUE : VG_FALSE;
-}
-
-static INLINE VGboolean is_aligned(const void *ptr)
-{
- return is_aligned_to(ptr, 4);
-}
-
-static INLINE void vg_shift_rectx(VGfloat coords[4],
- const VGfloat *bounds,
- const VGfloat shift)
-{
- coords[0] += shift;
- coords[2] -= shift;
- if (bounds) {
- coords[2] = MIN2(coords[2], bounds[2]);
- /* bound x/y + width/height */
- if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) {
- coords[2] = (bounds[0] + bounds[2]) - coords[0];
- }
- }
-}
-
-static INLINE void vg_shift_recty(VGfloat coords[4],
- const VGfloat *bounds,
- const VGfloat shift)
-{
- coords[1] += shift;
- coords[3] -= shift;
- if (bounds) {
- coords[3] = MIN2(coords[3], bounds[3]);
- if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) {
- coords[3] = (bounds[1] + bounds[3]) - coords[1];
- }
- }
-}
-
-static INLINE void vg_bound_rect(VGfloat coords[4],
- const VGfloat bounds[4],
- VGfloat shift[4])
-{
- /* if outside the bounds */
- if (coords[0] > (bounds[0] + bounds[2]) ||
- coords[1] > (bounds[1] + bounds[3]) ||
- (coords[0] + coords[2]) < bounds[0] ||
- (coords[1] + coords[3]) < bounds[1]) {
- coords[0] = 0.f;
- coords[1] = 0.f;
- coords[2] = 0.f;
- coords[3] = 0.f;
- shift[0] = 0.f;
- shift[1] = 0.f;
- return;
- }
-
- /* bound x */
- if (coords[0] < bounds[0]) {
- shift[0] = bounds[0] - coords[0];
- coords[2] -= shift[0];
- coords[0] = bounds[0];
- } else
- shift[0] = 0.f;
-
- /* bound y */
- if (coords[1] < bounds[1]) {
- shift[1] = bounds[1] - coords[1];
- coords[3] -= shift[1];
- coords[1] = bounds[1];
- } else
- shift[1] = 0.f;
-
- shift[2] = bounds[2] - coords[2];
- shift[3] = bounds[3] - coords[3];
- /* bound width/height */
- coords[2] = MIN2(coords[2], bounds[2]);
- coords[3] = MIN2(coords[3], bounds[3]);
-
- /* bound x/y + width/height */
- if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) {
- coords[2] = (bounds[0] + bounds[2]) - coords[0];
- }
- if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) {
- coords[3] = (bounds[1] + bounds[3]) - coords[1];
- }
-
- /* if outside the bounds */
- if ((coords[0] + coords[2]) < bounds[0] ||
- (coords[1] + coords[3]) < bounds[1]) {
- coords[0] = 0.f;
- coords[1] = 0.f;
- coords[2] = 0.f;
- coords[3] = 0.f;
- return;
- }
-}
-
-#endif
diff --git a/src/gallium/state_trackers/vega/vg_manager.c b/src/gallium/state_trackers/vega/vg_manager.c
deleted file mode 100644
index 7960b0692c3..00000000000
--- a/src/gallium/state_trackers/vega/vg_manager.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Mesa 3-D graphics library
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- * Copyright (C) 2010 LunarG Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- * Chia-I Wu <olv@lunarg.com>
- */
-
-#include "state_tracker/st_api.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_screen.h"
-#include "util/u_memory.h"
-#include "util/u_inlines.h"
-#include "util/u_box.h"
-#include "util/u_surface.h"
-
-#include "vg_api.h"
-#include "vg_manager.h"
-#include "vg_context.h"
-#include "api.h"
-#include "handle.h"
-
-static boolean
-vg_context_update_color_rb(struct vg_context *ctx, struct pipe_resource *pt)
-{
- struct st_renderbuffer *strb = ctx->draw_buffer->strb;
- struct pipe_context *pipe = ctx->pipe;
- struct pipe_surface surf_tmpl;
-
- if (strb->texture == pt) {
- pipe_resource_reference(&pt, NULL);
- return FALSE;
- }
-
- /* unreference existing ones */
- pipe_surface_reference(&strb->surface, NULL);
- pipe_resource_reference(&strb->texture, NULL);
- strb->width = strb->height = 0;
-
- strb->texture = pt;
-
- u_surface_default_template(&surf_tmpl, strb->texture);
- strb->surface = pipe->create_surface(pipe, strb->texture, &surf_tmpl);
-
- if (!strb->surface) {
- pipe_resource_reference(&strb->texture, NULL);
- return TRUE;
- }
-
- strb->width = pt->width0;
- strb->height = pt->height0;
-
- return TRUE;
-}
-
-/**
- * Flush the front buffer if the current context renders to the front buffer.
- */
-void
-vg_manager_flush_frontbuffer(struct vg_context *ctx)
-{
- struct st_framebuffer *stfb = ctx->draw_buffer;
-
- if (!stfb)
- return;
-
- switch (stfb->strb_att) {
- case ST_ATTACHMENT_FRONT_LEFT:
- case ST_ATTACHMENT_FRONT_RIGHT:
- stfb->iface->flush_front(&ctx->iface, stfb->iface, stfb->strb_att);
- break;
- default:
- break;
- }
-}
-
-/**
- * Re-validate the framebuffer.
- */
-void
-vg_manager_validate_framebuffer(struct vg_context *ctx)
-{
- struct st_framebuffer *stfb = ctx->draw_buffer;
- struct pipe_resource *pt;
- int32_t new_stamp;
-
- /* no binding surface */
- if (!stfb)
- return;
-
- new_stamp = p_atomic_read(&stfb->iface->stamp);
- if (stfb->iface_stamp != new_stamp) {
- do {
- /* validate the fb */
- if (!stfb->iface->validate((struct st_context_iface *)ctx,
- stfb->iface, &stfb->strb_att,
- 1, &pt) || !pt)
- return;
-
- stfb->iface_stamp = new_stamp;
- new_stamp = p_atomic_read(&stfb->iface->stamp);
-
- } while (stfb->iface_stamp != new_stamp);
-
- if (vg_context_update_color_rb(ctx, pt) ||
- stfb->width != pt->width0 ||
- stfb->height != pt->height0)
- ++stfb->stamp;
-
- stfb->width = pt->width0;
- stfb->height = pt->height0;
- }
-
- if (ctx->draw_stamp != stfb->stamp) {
- ctx->state.dirty |= FRAMEBUFFER_DIRTY;
- ctx->draw_stamp = stfb->stamp;
- }
-}
-
-static void
-vg_context_flush(struct st_context_iface *stctxi, unsigned flags,
- struct pipe_fence_handle **fence)
-{
- struct vg_context *ctx = (struct vg_context *) stctxi;
- unsigned pipe_flags = 0;
-
- if (flags & ST_FLUSH_END_OF_FRAME) {
- pipe_flags |= PIPE_FLUSH_END_OF_FRAME;
- }
-
- ctx->pipe->flush(ctx->pipe, fence, pipe_flags);
- if (flags & ST_FLUSH_FRONT)
- vg_manager_flush_frontbuffer(ctx);
-}
-
-static void
-vg_context_destroy(struct st_context_iface *stctxi)
-{
- struct vg_context *ctx = (struct vg_context *) stctxi;
- struct pipe_context *pipe = ctx->pipe;
-
- vg_destroy_context(ctx);
- pipe->destroy(pipe);
-}
-
-static struct st_context_iface *
-vg_api_create_context(struct st_api *stapi, struct st_manager *smapi,
- const struct st_context_attribs *attribs,
- enum st_context_error *error,
- struct st_context_iface *shared_stctxi)
-{
- struct vg_context *shared_ctx = (struct vg_context *) shared_stctxi;
- struct vg_context *ctx;
- struct pipe_context *pipe;
-
- if (!(stapi->profile_mask & (1 << attribs->profile))) {
- *error = ST_CONTEXT_ERROR_BAD_API;
- return NULL;
- }
-
- /* only 1.0 is supported */
- if (attribs->major > 1 || (attribs->major == 1 && attribs->minor > 0)) {
- *error = ST_CONTEXT_ERROR_BAD_VERSION;
- return NULL;
- }
-
- /* for VGHandle / pointer lookups */
- init_handles();
-
- pipe = smapi->screen->context_create(smapi->screen, NULL);
- if (!pipe) {
- *error = ST_CONTEXT_ERROR_NO_MEMORY;
- return NULL;
- }
- ctx = vg_create_context(pipe, NULL, shared_ctx);
- if (!ctx) {
- pipe->destroy(pipe);
- *error = ST_CONTEXT_ERROR_NO_MEMORY;
- return NULL;
- }
-
- ctx->iface.destroy = vg_context_destroy;
-
- ctx->iface.flush = vg_context_flush;
-
- ctx->iface.teximage = NULL;
- ctx->iface.copy = NULL;
-
- ctx->iface.st_context_private = (void *) smapi;
-
- return &ctx->iface;
-}
-
-static struct st_renderbuffer *
-create_renderbuffer(enum pipe_format format)
-{
- struct st_renderbuffer *strb;
-
- strb = CALLOC_STRUCT(st_renderbuffer);
- if (strb)
- strb->format = format;
-
- return strb;
-}
-
-static void
-destroy_renderbuffer(struct st_renderbuffer *strb)
-{
- pipe_surface_reference(&strb->surface, NULL);
- pipe_resource_reference(&strb->texture, NULL);
- FREE(strb);
-}
-
-/**
- * Decide the buffer to render to.
- */
-static enum st_attachment_type
-choose_attachment(struct st_framebuffer_iface *stfbi)
-{
- enum st_attachment_type statt;
-
- statt = stfbi->visual->render_buffer;
- if (statt != ST_ATTACHMENT_INVALID) {
- /* use the buffer given by the visual, unless it is unavailable */
- if (!st_visual_have_buffers(stfbi->visual, 1 << statt)) {
- switch (statt) {
- case ST_ATTACHMENT_BACK_LEFT:
- statt = ST_ATTACHMENT_FRONT_LEFT;
- break;
- case ST_ATTACHMENT_BACK_RIGHT:
- statt = ST_ATTACHMENT_FRONT_RIGHT;
- break;
- default:
- break;
- }
-
- if (!st_visual_have_buffers(stfbi->visual, 1 << statt))
- statt = ST_ATTACHMENT_INVALID;
- }
- }
-
- return statt;
-}
-
-/**
- * Bind the context to the given framebuffers.
- */
-static boolean
-vg_context_bind_framebuffers(struct st_context_iface *stctxi,
- struct st_framebuffer_iface *stdrawi,
- struct st_framebuffer_iface *streadi)
-{
- struct vg_context *ctx = (struct vg_context *) stctxi;
- struct st_framebuffer *stfb;
- enum st_attachment_type strb_att;
-
- /* the draw and read framebuffers must be the same */
- if (stdrawi != streadi)
- return FALSE;
-
- strb_att = (stdrawi) ? choose_attachment(stdrawi) : ST_ATTACHMENT_INVALID;
-
- if (ctx->draw_buffer) {
- stfb = ctx->draw_buffer;
-
- /* free the existing fb */
- if (!stdrawi ||
- stfb->strb_att != strb_att ||
- stfb->strb->format != stdrawi->visual->color_format) {
- destroy_renderbuffer(stfb->strb);
- destroy_renderbuffer(stfb->dsrb);
- FREE(stfb);
-
- ctx->draw_buffer = NULL;
- }
- }
-
- if (!stdrawi)
- return TRUE;
-
- if (strb_att == ST_ATTACHMENT_INVALID)
- return FALSE;
-
- /* create a new fb */
- if (!ctx->draw_buffer) {
- stfb = CALLOC_STRUCT(st_framebuffer);
- if (!stfb)
- return FALSE;
-
- stfb->strb = create_renderbuffer(stdrawi->visual->color_format);
- if (!stfb->strb) {
- FREE(stfb);
- return FALSE;
- }
-
- stfb->dsrb = create_renderbuffer(ctx->ds_format);
- if (!stfb->dsrb) {
- FREE(stfb->strb);
- FREE(stfb);
- return FALSE;
- }
-
- stfb->width = 0;
- stfb->height = 0;
- stfb->strb_att = strb_att;
- stfb->stamp = 1;
- stfb->iface_stamp = p_atomic_read(&stdrawi->stamp) - 1;
-
- ctx->draw_buffer = stfb;
- }
-
- ctx->draw_buffer->iface = stdrawi;
- ctx->draw_stamp = ctx->draw_buffer->stamp - 1;
-
- return TRUE;
-}
-
-static boolean
-vg_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
- struct st_framebuffer_iface *stdrawi,
- struct st_framebuffer_iface *streadi)
-{
- struct vg_context *ctx = (struct vg_context *) stctxi;
-
- if (stctxi)
- vg_context_bind_framebuffers(stctxi, stdrawi, streadi);
- vg_set_current_context(ctx);
-
- return TRUE;
-}
-
-static struct st_context_iface *
-vg_api_get_current(struct st_api *stapi)
-{
- struct vg_context *ctx = vg_current_context();
-
- return (ctx) ? &ctx->iface : NULL;
-}
-
-static st_proc_t
-vg_api_get_proc_address(struct st_api *stapi, const char *procname)
-{
- return api_get_proc_address(procname);
-}
-
-static void
-vg_api_destroy(struct st_api *stapi)
-{
-}
-
-static void
-vg_api_query_versions(struct st_api *stapi, struct st_manager *sm,
- struct st_config_options *options,
- int *gl_core_version,
- int *gl_compat_version,
- int *gl_es1_version,
- int *gl_es2_version)
-{
-}
-
-static const struct st_api vg_api = {
- "Vega " PACKAGE_VERSION,
- ST_API_OPENVG,
- ST_PROFILE_DEFAULT_MASK,
- 0,
- vg_api_destroy,
- vg_api_query_versions,
- vg_api_get_proc_address,
- vg_api_create_context,
- vg_api_make_current,
- vg_api_get_current,
-};
-
-const struct st_api *
-vg_api_get(void)
-{
- return &vg_api;
-}
diff --git a/src/gallium/state_trackers/vega/vg_manager.h b/src/gallium/state_trackers/vega/vg_manager.h
deleted file mode 100644
index 02b4842b288..00000000000
--- a/src/gallium/state_trackers/vega/vg_manager.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Mesa 3-D graphics library
- *
- * Copyright (C) 2010 LunarG Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- * Chia-I Wu <olv@lunarg.com>
- */
-
-#ifndef VG_MANAGER_H
-#define VG_MANAGER_H
-
-#include "state_tracker/st_api.h"
-#include "vg_context.h"
-
-void
-vg_manager_flush_frontbuffer(struct vg_context *ctx);
-
-void
-vg_manager_validate_framebuffer(struct vg_context *ctx);
-
-#endif /* VG_MANAGER_H */
diff --git a/src/gallium/state_trackers/vega/vg_state.c b/src/gallium/state_trackers/vega/vg_state.c
deleted file mode 100644
index 6f6bfdaf7a2..00000000000
--- a/src/gallium/state_trackers/vega/vg_state.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "vg_state.h"
-
-#include <string.h>
-
-void vg_init_state(struct vg_state *state)
-{
- state->matrix_mode = VG_MATRIX_PATH_USER_TO_SURFACE;
- state->fill_rule = VG_EVEN_ODD;
- state->image_quality = VG_IMAGE_QUALITY_FASTER;
- state->rendering_quality = VG_RENDERING_QUALITY_BETTER;
- state->blend_mode = VG_BLEND_SRC_OVER;
- state->image_mode = VG_DRAW_IMAGE_NORMAL;
-
- memset(state->scissor_rects, 0, sizeof(state->scissor_rects));
- state->scissor_rects_num = 0;
-
- state->color_transform = VG_FALSE;
- state->color_transform_values[0] = 1.0f;
- state->color_transform_values[1] = 1.0f;
- state->color_transform_values[2] = 1.0f;
- state->color_transform_values[3] = 1.0f;
- state->color_transform_values[4] = 0.0f;
- state->color_transform_values[5] = 0.0f;
- state->color_transform_values[6] = 0.0f;
- state->color_transform_values[7] = 0.0f;
-
- /* Stroke parameters */
- state->stroke.line_width.f = 1.0f;
- state->stroke.line_width.i = 1;
- state->stroke.cap_style = VG_CAP_BUTT;
- state->stroke.join_style = VG_JOIN_MITER;
- state->stroke.miter_limit.f = 4.0f;
- state->stroke.miter_limit.i = 4;
- state->stroke.dash_pattern_num = 0;
- state->stroke.dash_phase.f = 0.0f;
- state->stroke.dash_phase.i = 0;
- state->stroke.dash_phase_reset = VG_FALSE;
-
- /* Edge fill color for VG_TILE_FILL tiling mode */
- state->tile_fill_color[0] = 0.0f;
- state->tile_fill_color[1] = 0.0f;
- state->tile_fill_color[2] = 0.0f;
- state->tile_fill_color[3] = 0.0f;
-
- /* Color for vgClear */
- state->clear_color[0] = 0.0f;
- state->clear_color[1] = 0.0f;
- state->clear_color[2] = 0.0f;
- state->clear_color[3] = 0.0f;
-
- /* Glyph origin */
- state->glyph_origin[0].f = 0.0f;
- state->glyph_origin[1].f = 0.0f;
- state->glyph_origin[0].i = 0;
- state->glyph_origin[1].i = 0;
-
- /* Enable/disable alpha masking and scissoring */
- state->masking = VG_FALSE;
- state->scissoring = VG_FALSE;
-
- /* Pixel layout information */
- state->pixel_layout = VG_PIXEL_LAYOUT_UNKNOWN;
- state->screen_layout = VG_PIXEL_LAYOUT_UNKNOWN;
-
- /* Source format selection for image filters */
- state->filter_format_linear = VG_FALSE;
- state->filter_format_premultiplied = VG_FALSE;
-
- /* Destination write enable mask for image filters */
- state->filter_channel_mask = (VG_RED | VG_GREEN | VG_BLUE | VG_ALPHA);
-
- matrix_load_identity(&state->path_user_to_surface_matrix);
- matrix_load_identity(&state->image_user_to_surface_matrix);
- matrix_load_identity(&state->fill_paint_to_user_matrix);
- matrix_load_identity(&state->stroke_paint_to_user_matrix);
- matrix_load_identity(&state->glyph_user_to_surface_matrix);
-}
-
-struct matrix *vg_state_matrix(struct vg_state *state)
-{
- switch(state->matrix_mode) {
- case VG_MATRIX_PATH_USER_TO_SURFACE:
- return &state->path_user_to_surface_matrix;
- case VG_MATRIX_IMAGE_USER_TO_SURFACE:
- return &state->image_user_to_surface_matrix;
- case VG_MATRIX_FILL_PAINT_TO_USER:
- return &state->fill_paint_to_user_matrix;
- case VG_MATRIX_STROKE_PAINT_TO_USER:
- return &state->stroke_paint_to_user_matrix;
-#ifdef OPENVG_VERSION_1_1
- case VG_MATRIX_GLYPH_USER_TO_SURFACE:
- return &state->glyph_user_to_surface_matrix;
-#endif
- default:
- break;
- }
- return NULL;
-}
diff --git a/src/gallium/state_trackers/vega/vg_state.h b/src/gallium/state_trackers/vega/vg_state.h
deleted file mode 100644
index ed90689f917..00000000000
--- a/src/gallium/state_trackers/vega/vg_state.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef VG_STATE_H
-#define VG_STATE_H
-
-#include "VG/openvg.h"
-
-#include "api_consts.h"
-#include "matrix.h"
-
-struct vg_value
-{
- VGfloat f;
- VGint i;
-};
-
-struct vg_state {
- /* Mode settings */
- VGMatrixMode matrix_mode;
- VGFillRule fill_rule;
- VGImageQuality image_quality;
- VGRenderingQuality rendering_quality;
- VGBlendMode blend_mode;
- VGImageMode image_mode;
-
- /* Scissoring rectangles */
- struct vg_value scissor_rects[32*4];
- VGint scissor_rects_num;
-
- /* Color Transformation */
- VGboolean color_transform;
- VGfloat color_transform_values[8];
-
- /* Stroke parameters */
- struct {
- struct vg_value line_width;
- VGCapStyle cap_style;
- VGJoinStyle join_style;
- struct vg_value miter_limit;
- struct vg_value dash_pattern[VEGA_MAX_DASH_COUNT];
- VGint dash_pattern_num;
- struct vg_value dash_phase;
- VGboolean dash_phase_reset;
- } stroke;
-
- /* Edge fill color for VG_TILE_FILL tiling mode */
- VGfloat tile_fill_color[4];
- VGint tile_fill_colori[4];
-
- /* Color for vgClear */
- VGfloat clear_color[4];
- VGint clear_colori[4];
-
- /* Glyph origin */
- struct vg_value glyph_origin[2];
-
- /* Enable/disable alpha masking and scissoring */
- VGboolean masking;
- VGboolean scissoring;
-
- /* Pixel layout information */
- VGPixelLayout pixel_layout;
- VGPixelLayout screen_layout;
-
- /* Source format selection for image filters */
- VGboolean filter_format_linear;
- VGboolean filter_format_premultiplied;
-
- /* Destination write enable mask for image filters */
- VGbitfield filter_channel_mask;
-
- struct matrix path_user_to_surface_matrix;
- struct matrix image_user_to_surface_matrix;
- struct matrix fill_paint_to_user_matrix;
- struct matrix stroke_paint_to_user_matrix;
- struct matrix glyph_user_to_surface_matrix;
-
- struct vg_paint *stroke_paint;
- struct vg_paint *fill_paint;
-};
-
-void vg_init_state(struct vg_state *state);
-struct matrix * vg_state_matrix(struct vg_state *state);
-
-#endif
diff --git a/src/gallium/state_trackers/vega/vg_translate.c b/src/gallium/state_trackers/vega/vg_translate.c
deleted file mode 100644
index 4aad8991bdd..00000000000
--- a/src/gallium/state_trackers/vega/vg_translate.c
+++ /dev/null
@@ -1,1097 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "vg_translate.h"
-
-#include "pipe/p_format.h"
-#include "util/u_pack_color.h"
-
-void _vega_pack_rgba_span_float(struct vg_context *ctx,
- VGuint n, VGfloat rgba[][4],
- VGImageFormat dstFormat,
- void *dstAddr)
-{
- VGuint i;
-
- switch (dstFormat) {
- case VG_sRGBX_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = 255;
- dst[i] = r << 24 | g << 16 | b << 8 | a;
- }
- return;
- }
- break;
- case VG_sRGBA_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = r << 24 | g << 16 | b << 8 | a;
- }
- return;
- }
- break;
- case VG_sRGBA_8888_PRE: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = r << 24 | g << 16 | b << 8 | a;
- }
- return;
- }
- break;
- case VG_sRGB_565: {
- VGshort *dst = (VGshort *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- r = (r / 255.0) * 32;
- g = (g / 255.0) * 32;
- b = (b / 255.0) * 32;
-
- dst[i] = b | g << 5 | r << 11;
- }
- return;
- }
- break;
- case VG_sRGBA_5551: {
- VGshort *dst = (VGshort *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b, a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- r = (r / 255.0) * 32;
- g = (g / 255.0) * 32;
- b = (b / 255.0) * 32;
- a = (a / 255.0);
-
- dst[i] = a | b << 1 | g << 6 | r << 11;
- }
- return;
- }
- break;
- case VG_sRGBA_4444: {
- VGshort *dst = (VGshort *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b, a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- r = (r / 255.0) * 16;
- g = (g / 255.0) * 16;
- b = (b / 255.0) * 16;
- a = (a / 255.0) * 16;
-
- dst[i] = a | b << 4 | g << 8 | r << 12;
- }
- return;
- }
- break;
- case VG_sL_8: {
- VGubyte *dst = (VGubyte *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte a;
- a = float_to_ubyte(rgba[i][3]);
-
- dst[i] = a;
- }
- return;
- }
- break;
- case VG_lRGBX_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = 255;
- dst[i] = r << 24 | g << 16 | b << 8 | a;
- }
- return;
- }
- break;
- case VG_lRGBA_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = r << 24 | g << 16 | b << 8 | a;
- }
- return;
- }
- case VG_lRGBA_8888_PRE: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = r << 24 | g << 16 | b << 8 | a;
- }
- return;
- }
- break;
- case VG_lL_8: {
- VGubyte *dst = (VGubyte *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte a;
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = a;
- }
- return;
- }
- break;
- case VG_A_8: {
- VGubyte *dst = (VGubyte *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte a;
- a = float_to_ubyte(rgba[i][3]);
-
- dst[i] = a;
- }
- return;
- }
- break;
- case VG_BW_1: {
- VGshort *dst = (VGshort *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b, a;
- VGubyte res;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
-
- res = (r + g + b + a)/4;
- dst[i] = (res & (128));
- }
- return;
- }
- break;
-#ifdef OPENVG_VERSION_1_1
- case VG_A_1: {
- VGshort *dst = (VGshort *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte a;
- a = float_to_ubyte(rgba[i][3]);
-
- dst[i] = (a & (128));
- }
- return;
- }
- break;
- case VG_A_4: {
- VGshort *dst = (VGshort *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte a;
- VGubyte res;
- a = float_to_ubyte(rgba[i][3]);
-
- res = a/4;
- dst[i] = (res & (128));
- }
- return;
- }
- break;
-#endif
- case VG_sXRGB_8888:
- break;
- case VG_sARGB_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = a << 24 | r << 16 | g << 8 | b;
- }
- return;
- }
- break;
- case VG_sARGB_8888_PRE: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = a << 24 | r << 16 | g << 8 | b;
- }
- return;
- }
- break;
- case VG_sARGB_1555:
- break;
- case VG_sARGB_4444:
- break;
- case VG_lXRGB_8888:
- break;
- case VG_lARGB_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = a << 24 | r << 16 | g << 8 | b;
- }
- return;
- }
- break;
- case VG_lARGB_8888_PRE: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = a << 24 | r << 16 | g << 8 | b;
- }
- return;
- }
- break;
- case VG_sBGRX_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = 0xff;
- dst[i] = b << 24 | g << 16 | r << 8 | a;
- }
- return;
- }
- break;
- case VG_sBGRA_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = b << 24 | g << 16 | r << 8 | a;
- }
- return;
- }
- break;
- case VG_sBGRA_8888_PRE: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = b << 24 | g << 16 | r << 8 | a;
- }
- return;
- }
- break;
- case VG_sBGR_565:
- break;
- case VG_sBGRA_5551:
- break;
- case VG_sBGRA_4444:
- break;
- case VG_lBGRX_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = 0xff;
- dst[i] = b << 24 | g << 16 | r << 8 | a;
- }
- return;
- }
- break;
- case VG_lBGRA_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = b << 24 | g << 16 | r << 8 | a;
- }
- return;
- }
- break;
- case VG_lBGRA_8888_PRE: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = b << 24 | g << 16 | r << 8 | a;
- }
- return;
- }
- break;
- case VG_sXBGR_8888:
- break;
- case VG_sABGR_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = a << 24 | b << 16 | g << 8 | r;
- }
- return;
- }
- break;
- case VG_sABGR_8888_PRE: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = a << 24 | b << 16 | g << 8 | r;
- }
- return;
- }
- break;
- case VG_sABGR_1555:
- break;
- case VG_sABGR_4444:
- break;
- case VG_lXBGR_8888:
- break;
- case VG_lABGR_8888: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = a << 24 | b << 16 | g << 8 | r;
- }
- return;
- }
- break;
- case VG_lABGR_8888_PRE: {
- VGint *dst = (VGint *)dstAddr;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = float_to_ubyte(rgba[i][0]);
- g = float_to_ubyte(rgba[i][1]);
- b = float_to_ubyte(rgba[i][2]);
- a = float_to_ubyte(rgba[i][3]);
- dst[i] = a << 24 | b << 16 | g << 8 | r;
- }
- return;
- }
- break;
- default:
- assert(!"Unknown ReadPixels format");
- break;
- }
- assert(!"Not implemented ReadPixels format");
-}
-
-void _vega_unpack_float_span_rgba(struct vg_context *ctx,
- VGuint n,
- VGuint offset,
- const void * data,
- VGImageFormat dataFormat,
- VGfloat rgba[][4])
-{
- VGuint i;
- union util_color uc;
-
- switch (dataFormat) {
- case VG_sRGBX_8888: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- b = (*src >> 8) & 0xff;
- a = 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- }
- return;
- case VG_sRGBA_8888: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- b = (*src >> 8) & 0xff;
- a = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sRGBA_8888_PRE: {
- VGint *src = (VGint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- b = (*src >> 8) & 0xff;
- a = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sRGB_565: {
- VGshort *src = (VGshort *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGfloat clr[4];
- clr[0] = ((*src >> 11) & 31)/31.;
- clr[1] = ((*src >> 5) & 63)/63.;
- clr[2] = ((*src >> 0) & 31)/31.;
- clr[3] = 1.f;
-
- util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- }
- return;
- case VG_sRGBA_5551: {
- VGshort *src = (VGshort *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGfloat clr[4];
- clr[0] = ((*src >> 10) & 31)/31.;
- clr[1] = ((*src >> 5) & 31)/31.;
- clr[2] = ((*src >> 1) & 31)/31.;
- clr[3] = ((*src >> 0) & 1)/1.;
-
- util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- }
- return;
- case VG_sRGBA_4444: {
- VGshort *src = (VGshort *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGfloat clr[4];
- clr[0] = ((*src >> 12) & 15)/15.;
- clr[1] = ((*src >> 8) & 15)/15.;
- clr[2] = ((*src >> 4) & 15)/15.;
- clr[3] = ((*src >> 0) & 15)/15.;
-
- util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- }
- return;
- case VG_sL_8: {
- VGubyte *src = (VGubyte *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- util_pack_color_ub(0xff, 0xff, 0xff, *src, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- }
- return;
- case VG_lRGBX_8888: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- b = (*src >> 8) & 0xff;
- a = 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- }
- return;
- case VG_lRGBA_8888: {
- VGint *src = (VGint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- b = (*src >> 8) & 0xff;
- a = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_lRGBA_8888_PRE: {
- VGint *src = (VGint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- r = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- b = (*src >> 8) & 0xff;
- a = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_lL_8: {
- VGubyte *src = (VGubyte *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- util_pack_color_ub(0xff, 0xff, 0xff, *src, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- }
- return;
- case VG_A_8: {
- VGubyte *src = (VGubyte *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- util_pack_color_ub(0xff, 0xff, 0xff, *src, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- }
- return;
- case VG_BW_1: {
- VGubyte *src = (VGubyte *)data;
- src += offset;
- for (i = 0; i < n; i += 8) {
- VGfloat clr[4];
- VGuint j;
- for (j = 0; j < 8 && j < n ; ++j) {
- VGint shift = j;
- clr[0] = (((*src) & (1<<shift)) >> shift);
- clr[1] = clr[0];
- clr[2] = clr[0];
- clr[3] = 1.f;
-
- util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i+j][0] = uc.f[0];
- rgba[i+j][1] = uc.f[1];
- rgba[i+j][2] = uc.f[2];
- rgba[i+j][3] = uc.f[3];
- }
- ++src;
- }
- }
- return;
-#ifdef OPENVG_VERSION_1_1
- case VG_A_1: {
- VGubyte *src = (VGubyte *)data;
- src += offset;
- for (i = 0; i < n; i += 8) {
- VGfloat clr[4];
- VGuint j;
- for (j = 0; j < 8 && j < n ; ++j) {
- VGint shift = j;
- clr[0] = 0.f;
- clr[1] = 0.f;
- clr[2] = 0.f;
- clr[3] = (((*src) & (1<<shift)) >> shift);
-
- util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i+j][0] = uc.f[0];
- rgba[i+j][1] = uc.f[1];
- rgba[i+j][2] = uc.f[2];
- rgba[i+j][3] = uc.f[3];
- }
- ++src;
- }
- }
- return;
- case VG_A_4: {
- VGubyte *src = (VGubyte *)data;
- src += offset/2;
- for (i = 0; i < n; i += 2) {
- VGfloat clr[4];
- VGuint j;
- for (j = 0; j < n && j < 2; ++j) {
- VGint bitter, shift;
- if (j == 0) {
- bitter = 0x0f;
- shift = 0;
- } else {
- bitter = 0xf0;
- shift = 4;
- }
- clr[0] = 0.f;
- clr[1] = 0.f;
- clr[2] = 0.f;
- clr[3] = ((*src) & (bitter)) >> shift;
-
- util_pack_color(clr, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i+j][0] = uc.f[0];
- rgba[i+j][1] = uc.f[1];
- rgba[i+j][2] = uc.f[2];
- rgba[i+j][3] = uc.f[3];
- }
- ++src;
- }
- }
- return;
-#endif
- case VG_sXRGB_8888:
- break;
- case VG_sARGB_8888: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- a = (*src >> 24) & 0xff;
- r = (*src >> 16) & 0xff;
- g = (*src >> 8) & 0xff;
- b = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sARGB_8888_PRE: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- a = (*src >> 24) & 0xff;
- r = (*src >> 16) & 0xff;
- g = (*src >> 8) & 0xff;
- b = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sARGB_1555:
- break;
- case VG_sARGB_4444:
- break;
- case VG_lXRGB_8888:
- break;
- case VG_lARGB_8888: {
- VGint *src = (VGint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- a = (*src >> 24) & 0xff;
- r = (*src >> 16) & 0xff;
- g = (*src >> 8) & 0xff;
- b = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_lARGB_8888_PRE: {
- VGint *src = (VGint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- a = (*src >> 24) & 0xff;
- r = (*src >> 16) & 0xff;
- g = (*src >> 8) & 0xff;
- b = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sBGRX_8888:
- break;
- case VG_sBGRA_8888: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- b = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- r = (*src >> 8) & 0xff;
- a = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sBGRA_8888_PRE: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- b = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- r = (*src >> 8) & 0xff;
- a = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sBGR_565:
- break;
- case VG_sBGRA_5551:
- break;
- case VG_sBGRA_4444:
- break;
- case VG_lBGRX_8888:
- break;
- case VG_lBGRA_8888: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- b = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- r = (*src >> 8) & 0xff;
- a = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_lBGRA_8888_PRE: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- b = (*src >> 24) & 0xff;
- g = (*src >> 16) & 0xff;
- r = (*src >> 8) & 0xff;
- a = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sXBGR_8888:
- break;
- case VG_sABGR_8888: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- a = (*src >> 24) & 0xff;
- b = (*src >> 16) & 0xff;
- g = (*src >> 8) & 0xff;
- r = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sABGR_8888_PRE: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- a = (*src >> 24) & 0xff;
- b = (*src >> 16) & 0xff;
- g = (*src >> 8) & 0xff;
- r = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_sABGR_1555:
- break;
- case VG_sABGR_4444:
- break;
- case VG_lXBGR_8888:
- break;
- case VG_lABGR_8888: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- a = (*src >> 24) & 0xff;
- b = (*src >> 16) & 0xff;
- g = (*src >> 8) & 0xff;
- r = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- case VG_lABGR_8888_PRE: {
- VGuint *src = (VGuint *)data;
- src += offset;
- for (i = 0; i < n; ++i) {
- VGubyte r, g, b ,a;
- a = (*src >> 24) & 0xff;
- b = (*src >> 16) & 0xff;
- g = (*src >> 8) & 0xff;
- r = (*src >> 0) & 0xff;
-
- util_pack_color_ub(r, g, b, a, PIPE_FORMAT_R32G32B32A32_FLOAT, &uc);
- rgba[i][0] = uc.f[0];
- rgba[i][1] = uc.f[1];
- rgba[i][2] = uc.f[2];
- rgba[i][3] = uc.f[3];
- ++src;
- }
- return;
- }
- break;
- default:
- assert(!"Unknown ReadPixels format");
- break;
- }
- assert(!"Not implemented ReadPixels format");
-}
-
-VGint _vega_size_for_format(VGImageFormat dataFormat)
-{
- switch (dataFormat) {
- case VG_sRGBX_8888:
- case VG_sRGBA_8888:
- case VG_sRGBA_8888_PRE:
- return 4;
- case VG_sRGB_565:
- case VG_sRGBA_5551:
- case VG_sRGBA_4444:
- return 2;
- case VG_sL_8:
- return 1;
- case VG_lRGBX_8888:
- case VG_lRGBA_8888:
- case VG_lRGBA_8888_PRE:
- return 4;
- case VG_lL_8:
- return 1;
- case VG_A_8:
- return 1;
- case VG_BW_1:
- return 1;
-#ifdef OPENVG_VERSION_1_1
- case VG_A_1:
- break;
- case VG_A_4:
- break;
-#endif
- case VG_sXRGB_8888:
- case VG_sARGB_8888:
- case VG_sARGB_8888_PRE:
- return 4;
- case VG_sARGB_1555:
- case VG_sARGB_4444:
- return 2;
- case VG_lXRGB_8888:
- case VG_lARGB_8888:
- case VG_lARGB_8888_PRE:
- case VG_sBGRX_8888:
- case VG_sBGRA_8888:
- case VG_sBGRA_8888_PRE:
- return 4;
- case VG_sBGR_565:
- case VG_sBGRA_5551:
- case VG_sBGRA_4444:
- return 2;
- case VG_lBGRX_8888:
- case VG_lBGRA_8888:
- case VG_lBGRA_8888_PRE:
- case VG_sXBGR_8888:
- case VG_sABGR_8888:
- case VG_sABGR_8888_PRE:
- return 4;
- case VG_sABGR_1555:
- case VG_sABGR_4444:
- return 2;
- case VG_lXBGR_8888:
- case VG_lABGR_8888:
- case VG_lABGR_8888_PRE:
- return 4;
- default:
- assert(!"Unknown ReadPixels format");
- break;
- }
- assert(!"Not implemented ReadPixels format");
- return 0;
-}
diff --git a/src/gallium/state_trackers/vega/vg_translate.h b/src/gallium/state_trackers/vega/vg_translate.h
deleted file mode 100644
index 70815bacbcb..00000000000
--- a/src/gallium/state_trackers/vega/vg_translate.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef VG_TRANSLATE_H
-#define VG_TRANSLATE_H
-
-#include "VG/openvg.h"
-#include "vg_context.h"
-
-/*FIXME: we really should be using translate module
- * but pipe_format can't express some of the VG formats
- * (the premultiplied ones) so currently it won't work */
-
-void _vega_pack_rgba_span_float(struct vg_context *ctx,
- VGuint n, VGfloat rgba[][4],
- VGImageFormat dstFormat,
- void *dstAddr);
-void _vega_unpack_float_span_rgba(struct vg_context *ctx,
- VGuint n,
- VGuint offset,
- const void * data,
- VGImageFormat dataFormat,
- VGfloat rgba[][4]);
-VGint _vega_size_for_format(VGImageFormat format);
-
-#endif
diff --git a/src/gallium/state_trackers/vega/vgu.c b/src/gallium/state_trackers/vega/vgu.c
deleted file mode 100644
index 4206a91e006..00000000000
--- a/src/gallium/state_trackers/vega/vgu.c
+++ /dev/null
@@ -1,441 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "VG/openvg.h"
-#include "VG/vgu.h"
-
-#include "matrix.h"
-#include "path.h"
-#include "handle.h"
-
-#include "util/u_debug.h"
-#include "util/u_pointer.h"
-
-#include <math.h>
-#include <assert.h>
-
-
-static void vgu_append_float_coords(VGPath path,
- const VGubyte *cmds,
- VGint num_cmds,
- const VGfloat *coords,
- VGint num_coords)
-{
- VGubyte common_data[40 * sizeof(VGfloat)];
- struct path *p = handle_to_path(path);
-
- vg_float_to_datatype(path_datatype(p), common_data, coords, num_coords);
- vgAppendPathData(path, num_cmds, cmds, common_data);
-}
-
-VGUErrorCode vguLine(VGPath path,
- VGfloat x0, VGfloat y0,
- VGfloat x1, VGfloat y1)
-{
- static const VGubyte cmds[] = {VG_MOVE_TO_ABS, VG_LINE_TO_ABS};
- VGfloat coords[4];
- VGbitfield caps;
-
- if (path == VG_INVALID_HANDLE) {
- return VGU_BAD_HANDLE_ERROR;
- }
- caps = vgGetPathCapabilities(path);
- if (!(caps & VG_PATH_CAPABILITY_APPEND_TO)) {
- return VGU_PATH_CAPABILITY_ERROR;
- }
-
- coords[0] = x0;
- coords[1] = y0;
- coords[2] = x1;
- coords[3] = y1;
-
- vgu_append_float_coords(path, cmds, 2, coords, 4);
-
- return VGU_NO_ERROR;
-}
-
-VGUErrorCode vguPolygon(VGPath path,
- const VGfloat * points,
- VGint count,
- VGboolean closed)
-{
- VGubyte *cmds;
- VGfloat *coords;
- VGbitfield caps;
- VGint i;
-
- if (path == VG_INVALID_HANDLE) {
- return VGU_BAD_HANDLE_ERROR;
- }
-
- if (!points || count <= 0 || !is_aligned(points)) {
- return VGU_ILLEGAL_ARGUMENT_ERROR;
- }
-
- caps = vgGetPathCapabilities(path);
- if (!(caps & VG_PATH_CAPABILITY_APPEND_TO)) {
- return VGU_PATH_CAPABILITY_ERROR;
- }
-
- cmds = malloc(sizeof(VGubyte) * count + 1);
- coords = malloc(sizeof(VGfloat) * count * 2);
-
- cmds[0] = VG_MOVE_TO_ABS;
- coords[0] = points[0];
- coords[1] = points[1];
- for (i = 1; i < count; ++i) {
- cmds[i] = VG_LINE_TO_ABS;
- coords[2*i + 0] = points[2*i + 0];
- coords[2*i + 1] = points[2*i + 1];
- }
-
- if (closed) {
- cmds[i] = VG_CLOSE_PATH;
- ++i;
- }
-
- vgu_append_float_coords(path, cmds, i, coords, 2*i);
-
- free(cmds);
- free(coords);
-
- return VGU_NO_ERROR;
-}
-
-VGUErrorCode vguRect(VGPath path,
- VGfloat x, VGfloat y,
- VGfloat width, VGfloat height)
-{
- static const VGubyte cmds[] = {VG_MOVE_TO_ABS,
- VG_HLINE_TO_REL,
- VG_VLINE_TO_REL,
- VG_HLINE_TO_REL,
- VG_CLOSE_PATH
- };
- VGfloat coords[5];
- VGbitfield caps;
-
- if (path == VG_INVALID_HANDLE) {
- return VGU_BAD_HANDLE_ERROR;
- }
- caps = vgGetPathCapabilities(path);
- if (!(caps & VG_PATH_CAPABILITY_APPEND_TO)) {
- return VGU_PATH_CAPABILITY_ERROR;
- }
- if (width <= 0 || height <= 0) {
- return VGU_ILLEGAL_ARGUMENT_ERROR;
- }
-
- coords[0] = x;
- coords[1] = y;
- coords[2] = width;
- coords[3] = height;
- coords[4] = -width;
-
- vgu_append_float_coords(path, cmds, 5, coords, 5);
-
- return VGU_NO_ERROR;
-}
-
-VGUErrorCode vguRoundRect(VGPath path,
- VGfloat x, VGfloat y,
- VGfloat width,
- VGfloat height,
- VGfloat arcWidth,
- VGfloat arcHeight)
-{
- static const VGubyte cmds[] = {VG_MOVE_TO_ABS,
- VG_HLINE_TO_REL,
- VG_SCCWARC_TO_REL,
- VG_VLINE_TO_REL,
- VG_SCCWARC_TO_REL,
- VG_HLINE_TO_REL,
- VG_SCCWARC_TO_REL,
- VG_VLINE_TO_REL,
- VG_SCCWARC_TO_REL,
- VG_CLOSE_PATH
- };
- VGfloat c[26];
- VGbitfield caps;
-
- if (path == VG_INVALID_HANDLE) {
- return VGU_BAD_HANDLE_ERROR;
- }
- caps = vgGetPathCapabilities(path);
- if (!(caps & VG_PATH_CAPABILITY_APPEND_TO)) {
- return VGU_PATH_CAPABILITY_ERROR;
- }
- if (width <= 0 || height <= 0) {
- return VGU_ILLEGAL_ARGUMENT_ERROR;
- }
-
- c[0] = x + arcWidth/2; c[1] = y;
-
- c[2] = width - arcWidth;
-
- c[3] = arcWidth/2; c[4] = arcHeight/2; c[5] = 0;
- c[6] = arcWidth/2; c[7] = arcHeight/2;
-
- c[8] = height - arcHeight;
-
- c[9] = arcWidth/2; c[10] = arcHeight/2; c[11] = 0;
- c[12] = -arcWidth/2; c[13] = arcHeight/2;
-
- c[14] = -(width - arcWidth);
-
- c[15] = arcWidth/2; c[16] = arcHeight/2; c[17] = 0;
- c[18] = -arcWidth/2; c[19] = -arcHeight/2;
-
- c[20] = -(height - arcHeight);
-
- c[21] = arcWidth/2; c[22] = arcHeight/2; c[23] = 0;
- c[24] = arcWidth/2; c[25] = -arcHeight/2;
-
- vgu_append_float_coords(path, cmds, 10, c, 26);
-
- return VGU_NO_ERROR;
-}
-
-VGUErrorCode vguEllipse(VGPath path,
- VGfloat cx, VGfloat cy,
- VGfloat width,
- VGfloat height)
-{
- static const VGubyte cmds[] = {VG_MOVE_TO_ABS,
- VG_SCCWARC_TO_REL,
- VG_SCCWARC_TO_REL,
- VG_CLOSE_PATH
- };
- VGfloat coords[12];
- VGbitfield caps;
-
- if (path == VG_INVALID_HANDLE) {
- return VGU_BAD_HANDLE_ERROR;
- }
- caps = vgGetPathCapabilities(path);
- if (!(caps & VG_PATH_CAPABILITY_APPEND_TO)) {
- return VGU_PATH_CAPABILITY_ERROR;
- }
- if (width <= 0 || height <= 0) {
- return VGU_ILLEGAL_ARGUMENT_ERROR;
- }
-
- coords[0] = cx + width/2; coords[1] = cy;
-
- coords[2] = width/2; coords[3] = height/2; coords[4] = 0;
- coords[5] = -width; coords[6] = 0;
-
- coords[7] = width/2; coords[8] = height/2; coords[9] = 0;
- coords[10] = width; coords[11] = 0;
-
- vgu_append_float_coords(path, cmds, 4, coords, 11);
-
- return VGU_NO_ERROR;
-}
-
-VGUErrorCode vguArc(VGPath path,
- VGfloat x, VGfloat y,
- VGfloat width, VGfloat height,
- VGfloat startAngle,
- VGfloat angleExtent,
- VGUArcType arcType)
-{
- VGubyte cmds[11];
- VGfloat coords[40];
- VGbitfield caps;
- VGfloat last = startAngle + angleExtent;
- VGint i, c = 0;
-
- if (path == VG_INVALID_HANDLE) {
- return VGU_BAD_HANDLE_ERROR;
- }
- caps = vgGetPathCapabilities(path);
- if (!(caps & VG_PATH_CAPABILITY_APPEND_TO)) {
- return VGU_PATH_CAPABILITY_ERROR;
- }
- if (width <= 0 || height <= 0) {
- return VGU_ILLEGAL_ARGUMENT_ERROR;
- }
- if (arcType != VGU_ARC_OPEN &&
- arcType != VGU_ARC_CHORD &&
- arcType != VGU_ARC_PIE) {
- return VGU_ILLEGAL_ARGUMENT_ERROR;
- }
-
- cmds[c] = VG_MOVE_TO_ABS; ++c;
- coords[0] = x+cos(DEGREES_TO_RADIANS(startAngle))*width/2;
- coords[1] = y+sin(DEGREES_TO_RADIANS(startAngle))*height/2;
-#ifdef DEBUG_VGUARC
- debug_printf("start [%f, %f]\n", coords[0], coords[1]);
-#endif
- i = 2;
- if (angleExtent > 0) {
- VGfloat angle = startAngle + 180;
- while (angle < last) {
- cmds[c] = VG_SCCWARC_TO_ABS; ++c;
- coords[i] = width/2; coords[i+1] = height/2; coords[i+2] = 0;
- coords[i+3] = x + cos(DEGREES_TO_RADIANS(angle))*width/2;
- coords[i+4] = y + sin(DEGREES_TO_RADIANS(angle))*height/2;
-#ifdef DEBUG_VGUARC
- debug_printf("1 [%f, %f]\n", coords[i+3],
- coords[i+4]);
-#endif
- i += 5;
- angle += 180;
- }
- cmds[c] = VG_SCCWARC_TO_ABS; ++c;
- coords[i] = width/2; coords[i+1] = height/2; coords[i+2] = 0;
- coords[i+3] = x+cos(DEGREES_TO_RADIANS(last))*width/2;
- coords[i+4] = y+sin(DEGREES_TO_RADIANS(last))*height/2;
-#ifdef DEBUG_VGUARC
- debug_printf("2 [%f, %f]\n", coords[i+3],
- coords[i+4]);
-#endif
- i += 5;
- } else {
- VGfloat angle = startAngle - 180;
- while (angle > last) {
- cmds[c] = VG_SCWARC_TO_ABS; ++c;
- coords[i] = width/2; coords[i+1] = height/2; coords[i+2] = 0;
- coords[i+3] = x + cos(DEGREES_TO_RADIANS(angle)) * width/2;
- coords[i+4] = y + sin(DEGREES_TO_RADIANS(angle)) * height/2;
-#ifdef DEBUG_VGUARC
- debug_printf("3 [%f, %f]\n", coords[i+3],
- coords[i+4]);
-#endif
- angle -= 180;
- i += 5;
- }
- cmds[c] = VG_SCWARC_TO_ABS; ++c;
- coords[i] = width/2; coords[i+1] = height/2; coords[i+2] = 0;
- coords[i+3] = x + cos(DEGREES_TO_RADIANS(last)) * width/2;
- coords[i+4] = y + sin(DEGREES_TO_RADIANS(last)) * height/2;
-#ifdef DEBUG_VGUARC
- debug_printf("4 [%f, %f]\n", coords[i+3],
- coords[i+4]);
-#endif
- i += 5;
- }
-
- if (arcType == VGU_ARC_PIE) {
- cmds[c] = VG_LINE_TO_ABS; ++c;
- coords[i] = x; coords[i + 1] = y;
- i += 2;
- }
- if (arcType == VGU_ARC_PIE || arcType == VGU_ARC_CHORD) {
- cmds[c] = VG_CLOSE_PATH;
- ++c;
- }
-
- assert(c < 11);
-
- vgu_append_float_coords(path, cmds, c, coords, i);
-
- return VGU_NO_ERROR;
-}
-
-VGUErrorCode vguComputeWarpQuadToSquare(VGfloat sx0, VGfloat sy0,
- VGfloat sx1, VGfloat sy1,
- VGfloat sx2, VGfloat sy2,
- VGfloat sx3, VGfloat sy3,
- VGfloat * matrix)
-{
- struct matrix mat;
-
- if (!matrix || !is_aligned(matrix))
- return VGU_ILLEGAL_ARGUMENT_ERROR;
-
- if (!matrix_quad_to_square(sx0, sy0,
- sx1, sy1,
- sx2, sy2,
- sx3, sy3,
- &mat))
- return VGU_BAD_WARP_ERROR;
-
- if (!matrix_is_invertible(&mat))
- return VGU_BAD_WARP_ERROR;
-
- memcpy(matrix, mat.m, sizeof(VGfloat) * 9);
-
- return VGU_NO_ERROR;
-}
-
-VGUErrorCode vguComputeWarpSquareToQuad(VGfloat dx0, VGfloat dy0,
- VGfloat dx1, VGfloat dy1,
- VGfloat dx2, VGfloat dy2,
- VGfloat dx3, VGfloat dy3,
- VGfloat * matrix)
-{
- struct matrix mat;
-
- if (!matrix || !is_aligned(matrix))
- return VGU_ILLEGAL_ARGUMENT_ERROR;
-
- if (!matrix_square_to_quad(dx0, dy0,
- dx1, dy1,
- dx2, dy2,
- dx3, dy3,
- &mat))
- return VGU_BAD_WARP_ERROR;
-
- if (!matrix_is_invertible(&mat))
- return VGU_BAD_WARP_ERROR;
-
- memcpy(matrix, mat.m, sizeof(VGfloat) * 9);
-
- return VGU_NO_ERROR;
-}
-
-VGUErrorCode vguComputeWarpQuadToQuad(VGfloat dx0, VGfloat dy0,
- VGfloat dx1, VGfloat dy1,
- VGfloat dx2, VGfloat dy2,
- VGfloat dx3, VGfloat dy3,
- VGfloat sx0, VGfloat sy0,
- VGfloat sx1, VGfloat sy1,
- VGfloat sx2, VGfloat sy2,
- VGfloat sx3, VGfloat sy3,
- VGfloat * matrix)
-{
- struct matrix mat;
-
- if (!matrix || !is_aligned(matrix))
- return VGU_ILLEGAL_ARGUMENT_ERROR;
-
- if (!matrix_quad_to_quad(dx0, dy0,
- dx1, dy1,
- dx2, dy2,
- dx3, dy3,
- sx0, sy0,
- sx1, sy1,
- sx2, sy2,
- sx3, sy3,
- &mat))
- return VGU_BAD_WARP_ERROR;
-
- memcpy(matrix, mat.m, sizeof(VGfloat) * 9);
-
- return VGU_NO_ERROR;
-}