⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 surface.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
		}		if (surf->clipper.y <=0) {			if (surf->clipper.y + (s32) surf->clipper.height < 0) return GF_BAD_PARAM;			surf->clipper.height += surf->clipper.y;			surf->clipper.y = 0;		}		if (surf->clipper.x + surf->clipper.width > (s32) surf->width) {			surf->clipper.width = surf->width - surf->clipper.x;		}		if (surf->clipper.y + surf->clipper.height > (s32) surf->height) {			surf->clipper.height = surf->height - surf->clipper.y;		}	} else {		surf->useClipper = 0;	}	return GF_OK;}static Bool setup_grey_callback(EVGSurface *surf){	u32 col, a;	Bool use_const = 1;	if (surf->sten->type == GF_STENCIL_SOLID) {		col = surf->fill_col = ((EVG_Brush *)surf->sten)->color;		a = GF_COL_A(surf->fill_col);	} else {		col = a = 0;		use_const = 0;	}		if (surf->raster_cbk) {		if (use_const) {			if (!a) return 0;			if (a!=0xFF) {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_user_fill_const_a;			} else {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_user_fill_const;			}		} else {			surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_user_fill_var;		}		return 1;	}	switch (surf->pixelFormat) {	case GF_PIXEL_ARGB:		if (use_const) {			if (!a) return 0;			if (a!=0xFF) {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_argb_fill_const_a;			} else {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_argb_fill_const;			}		} else {			surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_argb_fill_var;		}		break;	case GF_PIXEL_RGB_32:		if (use_const) {			if (!a) return 0;			if (a!=0xFF) {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_rgb32_fill_const_a;			} else {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_rgb32_fill_const;			}		} else {			surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_rgb32_fill_var;		}		break;	case GF_PIXEL_RGB_24:		if (use_const) {			if (!a) return 0;			if (a!=0xFF) {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_rgb_fill_const_a;			} else {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_rgb_fill_const;			}		} else {			surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_rgb_fill_var;		}		break;	case GF_PIXEL_BGR_24:		if (use_const) {			if (!a) return 0;			if (a!=0xFF) {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_bgr_fill_const_a;			} else {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_bgr_fill_const;			}		} else {			surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_bgr_fill_var;		}		break;	case GF_PIXEL_RGB_565:		if (use_const) {			surf->fill_565 = GF_COL_TO_565(col);			if (!a) return 0;			if (a!=0xFF) {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_565_fill_const_a;			} else {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_565_fill_const;			}		} else {			surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_565_fill_var;		}		break;#ifdef GF_RGB_444_SUPORT		if (use_const) {			surf->fill_444 = GF_COL_TO_444(col);			if (!a) return 0;			if (a!=0xFF) {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_444_fill_const_a;			} else {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_444_fill_const;			}		} else {			surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_444_fill_var;		}		break;#endif#ifdef GF_RGB_555_SUPORT	case GF_PIXEL_RGB_555:		if (use_const) {			surf->fill_555 = GF_COL_TO_555(col);			if (!a) return 0;			if (a!=0xFF) {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_555_fill_const_a;			} else {				surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_555_fill_const;			}		} else {			surf->ftparams.gray_spans = (EVG_Raster_Span_Func) evg_555_fill_var;		}		break;#endif	}	return 1;}GF_Err evg_surface_set_path(GF_SURFACE _this, GF_Path *gp){#ifndef INLINE_POINT_CONVERSION	u32 i;	GF_Point2D pt;#endif	EVGSurface *surf = (EVGSurface *)_this;	if (!surf) return GF_BAD_PARAM;	if (!gp || !gp->n_points) {		surf->ftoutline.n_points = 0;		surf->ftoutline.n_contours = 0;		return GF_OK;	}	gf_path_flatten(gp);	surf->ftoutline.n_points = gp->n_points;	surf->ftoutline.n_contours = gp->n_contours;	surf->ftoutline.tags = gp->tags;	surf->ftoutline.contours = (s32*) gp->contours;	/*store path bounds for gradient/textures*/	gf_path_get_bounds(gp, &surf->path_bounds);	/*invert Y (ft uses min Y)*/	surf->path_bounds.y -= surf->path_bounds.height;	surf->ftoutline.flags = 0;	if (gp->flags & GF_PATH_FILL_ZERO_NONZERO) surf->ftoutline.flags = GF_PATH_FILL_ZERO_NONZERO;#ifdef INLINE_POINT_CONVERSION	surf->ftoutline.n_points = gp->n_points;	surf->ftoutline.points = gp->points;	surf->ftparams.mx = &surf->mat;#else	if (surf->pointlen < gp->n_points) {		surf->points = realloc(surf->points, sizeof(EVG_Vector) * gp->n_points);		if (surf->points == NULL) {			surf->pointlen = 0;			return GF_OUT_OF_MEM;		}		surf->pointlen = gp->n_points;	}	surf->ftoutline.points = surf->points;		for (i=0; i<gp->n_points; i++) {		pt = gp->points[i];		gf_mx2d_apply_point(&surf->mat, &pt);#ifdef GPAC_FIXED_POINT		surf->points[i].x = pt.x;		surf->points[i].y = pt.y;#else		/*move to 16.16 representation*/		surf->points[i].x = (u32) (pt.x * 0x10000L);		surf->points[i].y = (u32) (pt.y * 0x10000L);#endif	}#endif	return GF_OK;}GF_Err evg_surface_fill(GF_SURFACE _this, GF_STENCIL stencil){	GF_Rect rc;	GF_Matrix2D mat, st_mat;	Bool restore_filter;	EVGSurface *surf = (EVGSurface *)_this;	EVGStencil *sten = (EVGStencil *)stencil;	if (!surf || !stencil) return GF_BAD_PARAM;	if (!surf->ftoutline.n_points) return GF_OK;	surf->sten = sten;	/*setup ft raster calllbacks*/	if (!setup_grey_callback(surf)) return GF_OK;	get_surface_world_matrix(surf, &mat);	restore_filter = 0;	/*get path frame for texture convertion */	if (sten->type != GF_STENCIL_SOLID) {		rc = surf->path_bounds;		gf_mx2d_apply_rect(&mat, &rc);		rc.x = rc.y = 0;		/*assign target frame and matrix*/		sten->frame = rc;		gf_mx2d_copy(sten->pmat, surf->mat);		gf_mx2d_inverse(&sten->pmat);		gf_mx2d_copy(st_mat, sten->smat);		gf_mx2d_init(sten->smat);		switch (sten->type) {		case GF_STENCIL_TEXTURE:			if (! ((EVG_Texture *)sten)->pixels) return GF_BAD_PARAM;			if (surf->center_coords) gf_mx2d_add_scale(&sten->smat, FIX_ONE, -FIX_ONE);			evg_set_texture_active(sten);			gf_mx2d_add_matrix(&sten->smat, &st_mat);			gf_mx2d_add_matrix(&sten->smat, &mat);			gf_mx2d_inverse(&sten->smat);			evg_bmp_init(sten);			if (((EVG_Texture *)sten)->filter == GF_TEXTURE_FILTER_DEFAULT) {				restore_filter = 1;				((EVG_Texture *)sten)->filter = surf->texture_filter;			}			break;		case GF_STENCIL_LINEAR_GRADIENT:		{			EVG_LinearGradient *lin = (EVG_LinearGradient *)sten;			gf_mx2d_add_matrix(&sten->smat, &st_mat);			gf_mx2d_add_matrix(&sten->smat, &mat);			gf_mx2d_inverse(&sten->smat);			/*and finalize matrix in gradient coord system*/			gf_mx2d_add_matrix(&sten->smat, &lin->vecmat);			gf_mx2d_add_scale(&sten->smat, INT2FIX(1<<EVGGRADIENTSCALEBITS), INT2FIX(1<<EVGGRADIENTSCALEBITS));		}			break;		case GF_STENCIL_RADIAL_GRADIENT:		{			EVG_RadialGradient *rad = (EVG_RadialGradient*)sten;			gf_mx2d_copy(sten->smat, st_mat);			gf_mx2d_add_matrix(&sten->smat, &mat);			gf_mx2d_inverse(&sten->smat);			gf_mx2d_add_translation(&sten->smat, -rad->center.x, -rad->center.y);			gf_mx2d_add_scale(&sten->smat, gf_divfix(FIX_ONE, rad->radius.x), gf_invfix(rad->radius.y));			rad->d_f.x = gf_divfix(rad->focus.x - rad->center.x, rad->radius.x);			rad->d_f.y = gf_divfix(rad->focus.y - rad->center.y, rad->radius.y);			/*init*/			evg_radial_init(rad);		}			break;		}	}	if (surf->useClipper) {		surf->ftparams.clip_xMin = surf->clipper.x;		surf->ftparams.clip_yMin = surf->clipper.y;		surf->ftparams.clip_xMax = (surf->clipper.x + surf->clipper.width);		surf->ftparams.clip_yMax = (surf->clipper.y + surf->clipper.height);	} else {		surf->ftparams.clip_xMin = 0;		surf->ftparams.clip_yMin = 0;		surf->ftparams.clip_xMax = (surf->width);		surf->ftparams.clip_yMax = (surf->height);	}	/*and call the raster*/	evg_raster_render(surf->raster, &surf->ftparams);	/*restore stencil matrix*/	if (sten->type != GF_STENCIL_SOLID) {		gf_mx2d_copy(sten->smat, st_mat);		if (restore_filter) ((EVG_Texture *)sten)->filter = GF_TEXTURE_FILTER_DEFAULT;	}	surf->sten = 0L;	return GF_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -