/**************************************************************************
*
* 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
api_params.rar_V2
版权申诉
124 浏览量
2022-09-23
01:06:38
上传
评论
收藏 5KB RAR 举报
weixin_42651887
- 粉丝: 79
- 资源: 1万+
最新资源
- 基于ASMSEdit的输入数据校验
- MySql5.7版本连接Unity需要的mysql.data.dll文件
- 基于Objective-C实现手机共享单车信息管理系统设计与实现
- Firewalls Don't Stop Dragons, 3rd Edition
- rk3588rk3588s使用c++多线程异步等优化c++实现源码(yolov5运行可达到142fps)+项目使用说明.zip
- Jenkins Continuous Integration Cookbook, Second Edition
- 首涂第二十八套-新版海螺M3多功能苹果CMSv10自适应全屏高端模板 (1).zip
- 游戏开发+JavaScript+贪吃蛇+源码
- Extending Jenkins
- yolov5+Deepsort部署于rk3588和rk3399pro开发板C++完整源码(车辆行人跟踪)+模型+部署文档.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈