13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/************************************************************************** 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright 2009 VMware, Inc. All Rights Reserved. 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * "Software"), to deal in the Software without restriction, including 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * permit persons to whom the Software is furnished to do so, subject to 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the following conditions: 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * next paragraph) shall be included in all copies or substantial portions 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * of the Software. 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org **************************************************************************/ 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "VG/openvg.h" 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "vg_context.h" 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "matrix.h" 32760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "api.h" 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 34760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgvoid vegaLoadIdentity(void) 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vg_context *ctx = vg_current_context(); 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct matrix *mat = vg_state_matrix(&ctx->state.vg); 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_load_identity(mat); 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 41760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgvoid vegaLoadMatrix(const VGfloat * m) 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vg_context *ctx = vg_current_context(); 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct matrix *mat; 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!ctx) 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!m || !is_aligned(m)) { 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org mat = vg_state_matrix(&ctx->state.vg); 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_init(mat, m); 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!matrix_is_affine(mat)) { 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (ctx->state.vg.matrix_mode != VG_MATRIX_IMAGE_USER_TO_SURFACE) { 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_make_affine(mat); 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 63760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgvoid vegaGetMatrix(VGfloat * m) 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vg_context *ctx = vg_current_context(); 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct matrix *mat; 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!ctx) 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!m || !is_aligned(m)) { 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org mat = vg_state_matrix(&ctx->state.vg); 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org memcpy(m, mat->m, sizeof(VGfloat)*9); 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 80760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgvoid vegaMultMatrix(const VGfloat * m) 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vg_context *ctx = vg_current_context(); 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct matrix *dst, src; 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!ctx) 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!m || !is_aligned(m)) { 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org vg_set_error(ctx, VG_ILLEGAL_ARGUMENT_ERROR); 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return; 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_init(&src, m); 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org dst = vg_state_matrix(&ctx->state.vg); 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (!matrix_is_affine(&src)) { 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (ctx->state.vg.matrix_mode != VG_MATRIX_IMAGE_USER_TO_SURFACE) { 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_make_affine(&src); 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_mult(dst, &src); 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 103760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgvoid vegaTranslate(VGfloat tx, VGfloat ty) 1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vg_context *ctx = vg_current_context(); 1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct matrix *dst = vg_state_matrix(&ctx->state.vg); 1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_translate(dst, tx, ty); 1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 110760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgvoid vegaScale(VGfloat sx, VGfloat sy) 1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vg_context *ctx = vg_current_context(); 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct matrix *dst = vg_state_matrix(&ctx->state.vg); 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_scale(dst, sx, sy); 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 117760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgvoid vegaShear(VGfloat shx, VGfloat shy) 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vg_context *ctx = vg_current_context(); 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct matrix *dst = vg_state_matrix(&ctx->state.vg); 1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_shear(dst, shx, shy); 1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 124760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgvoid vegaRotate(VGfloat angle) 1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vg_context *ctx = vg_current_context(); 1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct matrix *dst = vg_state_matrix(&ctx->state.vg); 1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org matrix_rotate(dst, angle); 1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 130