Chapter 74 · SVG 引擎

SVG 尺寸与 viewBox

SetSize 控制渲染尺寸,viewBox 定义内部坐标系,SetOrigin 调整绘制原点。

74

API 速查

函数说明
int xgeSvgSetSize(xge_svg pSvg, float fWidth, float fHeight)设置渲染尺寸
int xgeSvgGetSize(xge_svg pSvg, float* pWidth, float* pHeight)获取尺寸
int xgeSvgSetOrigin(xge_svg pSvg, float fX, float fY)设置绘制原点
int xgeSvgGetOrigin(xge_svg pSvg, float* pX, float* pY)获取原点
int xgeSvgGetViewBox(xge_svg pSvg, xge_rect_t* pViewBox)获取 viewBox

编译本章示例

gcc -O2 -I. -o ch74.exe ch74_main.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch74.exe

示例:缩放 SVG 图标

xge_svg icon = NULL;
xgeSvgCreate(&icon);
xgeSvgLoad(icon, "assets/star.svg");

// 查看原始 viewBox
xge_rect_t vb;
xgeSvgGetViewBox(icon, &vb);
// vb = {0, 0, 24, 24} — 典型 24px 图标

// 缩放到 48x48 绘制
xgeSvgSetSize(icon, 48.0f, 48.0f);

// 设置绘制原点(左上角位置)
xgeSvgSetOrigin(icon, 100.0f, 50.0f);

// 获取当前尺寸确认
float w, h;
xgeSvgGetSize(icon, &w, &h);
// w=48, h=48

完整代码

将以下代码保存为 ch74_main.c,编译后运行即可看到同一 SVG 以不同尺寸绘制的效果:

#include "xge.h"

static xge_svg g_icon = NULL;
static int g_iFrame = 0;

static int onFrame(void* pUser) {
    (void)pUser;
    xgeClear(0x081114FF);
    g_iFrame++;

    // 动画缩放:32 → 128 → 32
    float sz = 80.0f + 48.0f * (float)sin(g_iFrame * 0.03f);

    // 绘制 3 个不同尺寸
    float sizes[] = { 48.0f, sz, 128.0f };
    float xPos[]  = { 100.0f, 350.0f, 580.0f };
    for (int i = 0; i < 3; i++) {
        xgeSvgSetSize(g_icon, sizes[i], sizes[i]);
        xgeSvgSetOrigin(g_icon, xPos[i], 250.0f);
        xgeSvgDraw(g_icon, 0.25f);
    }
    return XGE_OK;
}

int main(void) {
    xge_desc_t d = {0};
    d.iWidth  = 800;
    d.iHeight = 600;
    d.sTitle  = "ch74 - SVG Size & viewBox";
    d.iFlags  = XGE_INIT_VSYNC;
    xgeInit(&d);

    xgeSvgCreate(&g_icon);
    xgeSvgLoad(g_icon, "assets/icon.svg");

    // 查看原始 viewBox
    xge_rect_t vb;
    xgeSvgGetViewBox(g_icon, &vb);

    xgeRun(onFrame, NULL);
    xgeSvgDestroy(g_icon);
    xgeUnit();
    return 0;
}

代码讲解

  • SetSize:控制 SVG 渲染尺寸,viewBox 内部坐标自动映射到目标尺寸。
  • SetOrigin:设置绘制原点(左上角),动态定位 SVG 在屏幕上的位置。
  • 动画缩放:中间图标用 sin 函数动态改变尺寸,展示矢量图无损缩放特性。
  • GetViewBox:获取 SVG 文件定义的原始坐标系,用于计算宽高比。

要点与陷阱

  • viewBox 只读:由 SVG 文件定义,不可修改;通过 SetSize 控制实际渲染大小。
  • SetSize 与 Draw dst:Draw 的 tDst 参数优先级高于 SetSize。
  • Origin:默认 (0,0),设置后绘制位置偏移,适合动态定位。
  • 无 viewBox 的 SVG:GetViewBox 返回 {0,0,width,height}。

进阶练习

  1. 实现图标组件:根据容器大小自动 SetSize 适配。
  2. 读取 viewBox 计算宽高比,保持等比缩放。
SVG 尺寸与 viewBox效果
图:SVG 尺寸与 viewBox渲染效果