📄 surface.c
字号:
} 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 + -