[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81916":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":15,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":16,"rankGlobal":10,"rankLanguage":10,"license":17,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":20,"topics":21,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":36,"discoverSource":37},81916,"fastchart","iliaal\u002Ffastchart","iliaal","Fast chart rendering for PHP as a native extension. SVG-canonical, 26 chart families + barcodes (Code128, QrCode). PNG\u002FJPEG\u002FWebP","https:\u002F\u002Filiaal.github.io\u002Ffastchart\u002F",null,"C",29,3,2,0,41.81,"BSD 3-Clause \"New\" or \"Revised\" License",false,"master",true,[22,23,24,25,26,27,28,29,30,31,32],"barcode","chart","charts","code128","graph","graphics","php","php-extension","qrcode","svg","visualization","2026-06-12 04:01:36","# fastchart\n\n[![Tests](https:\u002F\u002Fgithub.com\u002Filiaal\u002Ffastchart\u002Factions\u002Fworkflows\u002Ftests.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Filiaal\u002Ffastchart\u002Factions\u002Fworkflows\u002Ftests.yml)\n[![Version](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Ftag\u002Filiaal\u002Ffastchart?label=version&sort=semver)](https:\u002F\u002Fgithub.com\u002Filiaal\u002Ffastchart\u002Freleases)\n[![License: BSD-3-Clause](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-BSD--3--Clause-green.svg)](https:\u002F\u002Fopensource.org\u002Flicenses\u002FBSD-3-Clause)\n[![Follow @iliaa](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FFollow-@iliaa-000000?style=flat&logo=x&logoColor=white)](https:\u002F\u002Fx.com\u002Fintent\u002Ffollow?screen_name=iliaa)\n\nNative C PHP extension. 26 chart types behind a modern OO API with\nfluent setters and `final` classes. Line, area, bar, scatter, bubble,\npie, radar, polar, surface, contour, gauge, gantt, box-plot, treemap,\nfunnel, waterfall, heatmap, linear meter, plus a deep `StockChart`\n(seven candle styles, SMA \u002F EMA \u002F WMA overlays, volume + indicator\npanes).\n\nSVG is the canonical render format. PNG \u002F JPG \u002F WebP outputs flatten\ntext to glyph paths, run plutovg over the resulting SVG, and encode\nthe RGBA buffer with libpng \u002F libjpeg-turbo \u002F libwebp. The same chart\nobject serves a sharp `\u003Csvg>` for dashboards or a PNG for emails\nwithout rebuilding state. `renderToFile()` picks the encoder from the\nextension; `renderPng()` \u002F `renderJpeg()` \u002F `renderWebp()` \u002F\n`renderSvg()` return bytes in-process.\n\n![fastchart: 26 chart types in one PHP extension](images\u002Ffastchart-hero.jpg)\n\n**[Live gallery →](https:\u002F\u002Filiaal.github.io\u002Ffastchart\u002Fv1-gallery.html)**. Side-by-side SVG \u002F PNG \u002F JPG \u002F WebP renders for every chart family, with the source PHP shown above each row.\n\n## Status\n\nv1.1: confidence-band area charts, cone-style funnels, smooth polar\ncurves with overlay vectors, log-scale bubble plots, HTML image-map\nhot-spots on Bar \u002F Pie \u002F Scatter (`setImageMap` + `getImageMap`).\nv1.0 dropped libgd as a runtime dependency, rebuilt rasterization\naround vendored plutovg, and replaced `draw($canvas)` with\n`renderSvg\u002FPng\u002FJpeg\u002FWebp` + `renderToFile`. 26 chart types, 2-class\nSymbol family, 138 phpt tests. See [`CHANGELOG.md`](CHANGELOG.md)\nfor the full breaking-change list.\n\n## Install\n\n### Via PIE (recommended)\n\n[PIE](https:\u002F\u002Fgithub.com\u002Fphp\u002Fpie) handles the configure \u002F make \u002F\ninstall cycle for you against your active PHP install:\n\n```sh\npie install iliaal\u002Ffastchart\n```\n\nPIE picks up the latest tagged release from Packagist and respects\nyour platform's `pkg-config` for the FreeType \u002F libpng \u002F\nlibjpeg-turbo \u002F libwebp probes. After install, enable the\nextension via your distribution's mechanism (e.g.\n`docker-php-ext-enable fastchart` on the official PHP images, or\nadd `extension=fastchart` to `php.ini`).\n\n### From source\n\nBuild manually against the PHP install you want to extend:\n\n```sh\nphpize\n.\u002Fconfigure --enable-fastchart\nmake -j\nmake test\n```\n\nStrict-warnings dev build (recommended for contributors):\n\n```sh\n.\u002Fconfigure --enable-fastchart --enable-fastchart-dev\n```\n\nRuntime check:\n\n```sh\nphp -d extension=.\u002Fmodules\u002Ffastchart.so \\\n  -r 'echo FastChart\\Chart::version(), PHP_EOL;'\n```\n\n## Requirements\n\n- PHP 8.3 or later (NTS or ZTS).\n- **FreeType** development headers (`libfreetype-dev` \u002F\n  `freetype-devel`). Required, since text rendering depends on FreeType.\n- **libpng \u002F libjpeg-turbo \u002F libwebp** development headers. Each is\n  optional; config.m4 probes them independently via pkg-config and\n  the corresponding `renderPng()` \u002F `renderJpeg()` \u002F `renderWebp()`\n  is wired up only for libs that resolve at build time. A missing\n  lib turns the matching method into a \"format not compiled in\"\n  Error at call time; SVG output stays available regardless.\n  `phpinfo()` reports the resolved version of each lib (or `(not\n  compiled in)`) so you can audit a build.\n- plutovg + plutosvg are vendored under `vendor\u002F`; no separate install\n  required.\n\n## Quick start\n\nThe shortest path is the `renderToFile()` helper, which picks the\nencoder from the file extension:\n\n```php\n(new FastChart\\LineChart(640, 320))\n    ->setTitle('Daily active users')\n    ->setSeries([['data' => [820, 940, 870, 1020, 1180, 1250, 1340]]])\n    ->setCategoryLabels(['Mon','Tue','Wed','Thu','Fri','Sat','Sun'])\n    ->renderToFile('\u002Ftmp\u002Fdau.png');\n```\n\n`renderPng()`, `renderJpeg()`, and `renderWebp()` return the encoded\nbytes if you need them in memory. Raster compression knobs:\n\n```php\n$chart->setJpegQuality(75);              \u002F\u002F sticks on the chart instance;\n$chart->renderJpeg();                    \u002F\u002F ...used by every render call\n$chart->renderJpeg(95);                  \u002F\u002F per-call override (1..100)\n\n$chart->renderWebp();                    \u002F\u002F default quality 90\n$chart->renderWebp(60);                  \u002F\u002F smaller, lossier (1..100)\n\n$chart->renderToFile('\u002Ftmp\u002Fout.webp');   \u002F\u002F setJpegQuality only affects\n                                         \u002F\u002F .jpg; renderToFile uses the\n                                         \u002F\u002F built-in WebP default\n```\n\nPNG is always lossless; there's no quality knob. The encoder is\nlibpng with default filter selection.\n\nWebP has four encoder modes selectable via `setWebpMode()`. The\ndefault `WEBP_DRAWING` is tuned for chart-shaped content (flat\nfills, sharp edges); see the table in\n[`docs\u002Fexamples\u002F50_webp_modes.php`](docs\u002Fexamples\u002F50_webp_modes.php)\nfor the speed\u002Fsize trade-offs each mode picks.\n\n```php\n$chart->setWebpMode(FastChart\\Chart::WEBP_LOSSLESS);  \u002F\u002F archival\n$chart->setWebpMode(FastChart\\Chart::WEBP_FAST);      \u002F\u002F preview pipelines\n$chart->setWebpMode(FastChart\\Chart::WEBP_PHOTO);     \u002F\u002F photo backgrounds\n$chart->setWebpMode(FastChart\\Chart::WEBP_DRAWING);   \u002F\u002F back to default\n```\n\nCall `renderSvg()` on the same chart object for vector output:\ndashboards, print, anywhere infinite-zoom matters.\n\n```php\n$chart = (new FastChart\\LineChart(640, 320))\n    ->setTitle('Daily active users')\n    ->setSeries([['data' => [820, 940, 870, 1020, 1180, 1250, 1340]]])\n    ->setCategoryLabels(['Mon','Tue','Wed','Thu','Fri','Sat','Sun']);\n\n$svg = $chart->renderSvg();              \u002F\u002F full \u003C?xml ?>\u003Csvg>...\u003C\u002Fsvg>\n$chart->renderToFile('\u002Ftmp\u002Fdau.svg');    \u002F\u002F same, written to disk\n\n\u002F\u002F Stitch several charts into one outer SVG document:\n$fragment = $chart->drawSvgFragment();   \u002F\u002F \u003Cg class=\"fastchart\">...\u003C\u002Fg>\n```\n\nConstruction is identical for every output format; only the final\nrender call differs. By default, SVG text is flattened to glyph\noutline paths (`SVG_TEXT_PATHS` mode). The resulting SVG is self-\ncontained and renders identically in any viewer or rasterizer.\nFor smaller files with selectable text, switch to native `\u003Ctext>`\nmode:\n\n```php\n$chart->setSvgTextMode(FastChart\\Chart::SVG_TEXT_NATIVE);\n$svg = $chart->renderSvg();  \u002F\u002F ~30% smaller; needs consumer text support\n```\n\nRaster outputs (PNG\u002FJPG\u002FWebP) always use the PATHS mode internally;\nplutovg has no text support of its own, so glyph flattening is what\nmakes labels appear in the rasterized output.\n\nThree static methods on `FastChart\\Chart` rasterize caller-supplied\nSVG bytes through the same plutovg + libpng \u002F libjpeg-turbo \u002F\nlibwebp pipeline. Useful for round-tripping `renderSvg()` output, or\nfor stitching multiple `drawSvgFragment()` calls into one outer SVG\nand rasterizing the result, all in-process:\n\n```php\n$png  = FastChart\\Chart::svgToPng($svg);\n$jpg  = FastChart\\Chart::svgToJpeg($svg, 88, 0xFFFFFF);  \u002F\u002F bg + quality\n$webp = FastChart\\Chart::svgToWebp($svg, 90, FastChart\\Chart::WEBP_LOSSLESS);\n```\n\nOutput dimensions come from the SVG's `width` \u002F `height` \u002F `viewBox`.\nSVG `\u003Ctext>` elements render blank because plutovg has no text\nengine, so text must be path-flattened first (fastchart's own SVG\nbuilder does this automatically). See\n[`docs\u002Fexamples\u002F51_svg_to_raster.php`](docs\u002Fexamples\u002F51_svg_to_raster.php)\nfor a runnable demo and\n[`docs\u002Fspecs\u002Fsvg-to-raster.md`](docs\u002Fspecs\u002Fsvg-to-raster.md) for the\nfull contract.\n\n## 📊 Performance\n\nMedian in-memory render time at 1920×1080 on a single core (Intel\ni9-13950HX, PHP 8.4 release build NTS -O2, default font + DPI).\nSVG is the canonical output; PNG \u002F WebP \u002F JPG go through the same\nSVG build, then plutosvg + plutovg rasterize, then the format\nencoder (libpng \u002F libwebp \u002F libjpeg-turbo). The raster columns\ntherefore add the rasterize cost on top of the SVG-only number.\n\n| Chart        | SVG ms | PNG ms | WebP ms | JPG ms |\n|--------------|-------:|-------:|--------:|-------:|\n| AreaChart    |   0.85 |  45.19 |   34.04 |  11.45 |\n| BarChart     |   1.55 |  43.54 |   35.18 |  12.35 |\n| BoxPlot      |   0.62 |  40.26 |   30.74 |   9.95 |\n| BubbleChart  |   0.32 |  52.84 |   44.18 |  14.84 |\n| ContourChart |   0.39 |  48.46 |   41.14 |  12.97 |\n| Funnel       |   0.60 |  40.15 |   31.59 |   9.53 |\n| GanttChart   |   0.82 |  40.08 |   30.98 |  10.22 |\n| GaugeChart   |   0.16 |  44.75 |   33.78 |  10.19 |\n| Heatmap      |   0.21 |  43.28 |   35.62 |  11.85 |\n| LineChart    |   0.69 |  45.45 |   37.23 |  11.81 |\n| LinearMeter  |   0.16 |  38.64 |   29.10 |   8.98 |\n| PieChart     |   0.40 |  44.42 |   33.84 |  11.75 |\n| PolarChart   |   0.17 |  47.60 |   37.10 |  11.48 |\n| RadarChart   |   0.48 |  47.89 |   36.48 |  13.39 |\n| ScatterChart |   0.67 |  43.05 |   32.48 |  10.38 |\n| StockChart   |   1.22 |  46.00 |   40.86 |  14.19 |\n| SurfaceChart |   0.29 |  40.09 |   34.50 |  10.35 |\n| Treemap      |   0.73 |  39.76 |   31.74 |   9.74 |\n| Waterfall    |   0.68 |  39.21 |   32.05 |  10.08 |\n\nSVG is sub-millisecond to ~1.5 ms across the board because there's\nno rasterization; the backend appends strings into a `smart_str`.\nThe raster encoders split into three bands: JPG fastest (9-15 ms,\nlibjpeg-turbo with 4:2:0 subsampling + SSSE3 RGBA-pack), WebP\nmiddle (29-44 ms, libwebp with `WEBP_PRESET_DRAWING` + method=2 +\nmulti-thread), PNG slowest (38-53 ms, libpng's deflate dominates).\nAll four formats stay under 55 ms at 1080p on one thread.\n\nThese numbers reflect the optimization series in v1.1.x (glyph\noutline cache, opaque-detect un-premultiply with SSSE3 shuffle,\ndeferred text overlays, larger FT raster pool); see\n[`optimization.md`](optimization.md) for the per-finding breakdown.\n\nRepro the numbers locally:\n\n```sh\nphp -d extension=.\u002Fmodules\u002Ffastchart.so docs\u002Fbench\u002Fbench.php\n```\n\nIteration count via `FC_BENCH_ITERS` (default 50). Bench source at\n[`docs\u002Fbench\u002Fbench.php`](docs\u002Fbench\u002Fbench.php).\n\n## What you can render\n\n26 chart classes plus a 2-class symbology family, all under the\n`FastChart\\` namespace. Each name links to its rendered example image:\n\n- **Cartesian:** [`LineChart`](docs\u002Fexamples\u002F01_line_basic.png),\n  [`AreaChart`](docs\u002Fexamples\u002F27a_area_stacked.png),\n  [`BarChart`](docs\u002Fexamples\u002F03_bar_grouped.png) (vertical, horizontal,\n  stacked, grouped, floating, layered),\n  [`ScatterChart`](docs\u002Fexamples\u002F06_scatter_trend.png),\n  [`BubbleChart`](docs\u002Fexamples\u002F14_bubble.png).\n- **Financial:** [`StockChart`](docs\u002Fexamples\u002F07_stock_candle_ma.png)\n  with seven candle styles (`STYLE_CANDLE`, `STYLE_BAR`,\n  `STYLE_DIAMOND`, `STYLE_I_CAP`, `STYLE_HOLLOW`, `STYLE_VOLUME`,\n  `STYLE_VECTOR`), SMA \u002F EMA \u002F WMA overlays, optional volume pane and\n  custom indicator panes (RSI, MACD, Bollinger, OBV, stochastic, PSAR).\n- **Non-Cartesian:** [`RadarChart`](docs\u002Fexamples\u002F08_radar.png),\n  [`PolarChart`](docs\u002Fexamples\u002F16_polar.png),\n  [`SurfaceChart`](docs\u002Fexamples\u002F15a_surface.png),\n  [`ContourChart`](docs\u002Fexamples\u002F15b_contour.png).\n- **Specialised:** [`PieChart`](docs\u002Fexamples\u002F05_pie_donut.png) (with\n  optional donut hole + leader lines),\n  [`GaugeChart`](docs\u002Fexamples\u002F10_gauge.png),\n  [`LinearMeter`](docs\u002Fexamples\u002F36a_linear_meter_horizontal.png),\n  [`GanttChart`](docs\u002Fexamples\u002F17_gantt.png),\n  [`BoxPlot`](docs\u002Fexamples\u002F09_boxplot.png),\n  [`Treemap`](docs\u002Fexamples\u002F32_treemap.png),\n  [`Funnel`](docs\u002Fexamples\u002F33_funnel.png),\n  [`Waterfall`](docs\u002Fexamples\u002F34_waterfall.png),\n  [`Heatmap`](docs\u002Fexamples\u002F35_heatmap.png),\n  [`BulletChart`](docs\u002Fexamples\u002F43_bullet.png),\n  [`ParetoChart`](docs\u002Fexamples\u002F44_pareto.png),\n  [`CalendarHeatmap`](docs\u002Fexamples\u002F45_calendar_heatmap.png).\n- **Hierarchical \u002F flow:**\n  [`SunburstChart`](docs\u002Fexamples\u002F46_sunburst.png),\n  [`SankeyChart`](docs\u002Fexamples\u002F47_sankey.png),\n  [`MarimekkoChart`](docs\u002Fexamples\u002F48_marimekko.png),\n  [`VectorChart`](docs\u002Fexamples\u002F49_vector.png).\n- **Symbology:** [`Code128`](docs\u002Fexamples\u002F41a_code128_alphanumeric.png)\n  (1D barcode, ISO\u002FIEC 15417, auto-switching A\u002FB\u002FC subsets, optional\n  human-readable text), [`QrCode`](docs\u002Fexamples\u002F42b_qrcode_ecc_m.png)\n  (2D matrix code, ISO\u002FIEC 18004, ECC L\u002FM\u002FQ\u002FH, versions 1..40).\n\nCross-cutting features available on most chart types:\n\n- TrueType \u002F OpenType labels via `setFontPath()` (and per-role\n  `setTitleFont()`, `setAxisFont()`, `setLabelFont()`).\n- Light and dark themes (`THEME_LIGHT`, `THEME_DARK`); per-series colors\n  via `setSeriesColors()`; full custom palettes via `setPalette()`.\n- Legend positioning (`LEGEND_TOP_RIGHT`, `_TOP_LEFT`, `_BOTTOM_RIGHT`,\n  `_BOTTOM_LEFT`, `_NONE`).\n- Annotations: plot bands, vertical bands, horizontal \u002F vertical lines,\n  text labels, icon plots, error bars, zones.\n- Strict-mode input validation (`setStrict(true)` rejects malformed\n  series with a `TypeError` instead of silently coercing to NaN).\n- Background images, drop shadows, anti-aliased lines and markers.\n- Image map output (`getImageMap()` returns category-aligned\n  rectangles for HTML overlay).\n\n## Examples\n\nA gallery of code + rendered chart pairs lives in\n[`docs\u002FREADME.md`](docs\u002FREADME.md). Forty-two runnable scripts in\n[`docs\u002Fexamples\u002F`](docs\u002Fexamples\u002F) regenerate the images and exercise\nevery public method on the API surface.\n\n## Public classes\n\nAll under the `FastChart\\` namespace:\n\n- `Chart`: abstract base. Carries shared geometry \u002F theme \u002F font \u002F\n  legend \u002F annotation setters, the `version()` static, and the chart-\n  family enums (themes, candle styles, legend positions, line styles,\n  marker styles, MA kinds).\n- `LineChart`, `AreaChart`, `BarChart`, `ScatterChart`,\n  `BubbleChart`: series-based plots.\n- `PieChart`: slice-based, with optional donut hole.\n- `StockChart`: OHLC(V) candlesticks, moving-average overlays,\n  volume + indicator panes.\n- `RadarChart`, `PolarChart`, `SurfaceChart`,\n  `ContourChart`: non-Cartesian plots.\n- `GaugeChart`, `LinearMeter`: single-value readouts with zoned ranges.\n- `GanttChart`: time-axis task bars with dependency links and\n  milestones.\n- `BoxPlot`: five-number summaries with per-category outliers.\n- `Treemap`, `Funnel`, `Waterfall`: value-encoded layouts (rectangle\n  packing, stage drop-off, signed-delta running totals). `Funnel`\n  supports a triangle-with-bands layout via `setStyle(STYLE_PYRAMID)`\n  for callers who want the classic pyramid shape.\n- `Heatmap`: 2D grid with linear color-ramp interpolation.\n\nEvery setter returns `static`, so a single fluent expression configures\nand emits a chart.\n\nThe Symbol family lives parallel to `Chart` (no shared base, since\naxes \u002F palettes \u002F plot rect have no meaning for a barcode):\n\n- `Symbol`: abstract base for all 1D + 2D codes. Carries shared\n  setters: `setSize()`, `setData()`, `setQuietZone()`, `setForeground()`,\n  `setBackground()`, `setTransparentBackground()`, `setDpi()`,\n  `setSvgTextMode()`, `setJpegQuality()`, plus the same `renderPng()`\n  \u002F `renderJpeg()` \u002F `renderWebp()` \u002F `renderSvg()` \u002F\n  `drawSvgFragment()` \u002F `renderToFile()` helpers as `Chart`. Reload\n  via `imagecreatefromstring()` to composite onto an existing canvas.\n- `Barcode`: abstract 1D linear-barcode base.\n- `Code128` (extends `Barcode`): ISO\u002FIEC 15417, alphanumeric, three\n  subsets (A: control + uppercase, B: full ASCII printable, C: digit\n  pairs). Auto-switches between subsets to minimise encoded length;\n  mod-103 checksum appended automatically. `setShowText(true)`\n  renders the human-readable payload below the bars using the\n  auto-detected default font.\n- `QrCode` (extends `Symbol`): ISO\u002FIEC 18004, four error-correction\n  levels (`ECC_L` ~7%, `ECC_M` ~15%, `ECC_Q` ~25%, `ECC_H` ~30%),\n  versions 1..40. Encoder is the vendored nayuki\u002FQR-Code-generator\n  C library. `setMinVersion()` \u002F `setMaxVersion()` pin the symbol\n  size; the encoder picks the smallest version that fits within the\n  range. Input must be valid UTF-8.\n\n## 🔗 PHP Performance Toolkit\n\nCompanion native PHP extensions for high-throughput PHP workloads:\n\n- **[php_excel](https:\u002F\u002Fgithub.com\u002Filiaal\u002Fphp_excel)**: native Excel I\u002FO. 7-10× faster than PhpSpreadsheet, full XLS\u002FXLSX with formulas, formatting, and styling. Powered by LibXL.\n- **[mdparser](https:\u002F\u002Fgithub.com\u002Filiaal\u002Fmdparser)**: native CommonMark + GFM parser. 15-30× faster than pure-PHP alternatives, full CommonMark 0.31 compliance.\n- **[php_clickhouse](https:\u002F\u002Fgithub.com\u002Filiaal\u002Fphp_clickhouse)**: native ClickHouse client speaking the wire protocol directly. Picks up where SeasClick left off.\n\n## License\n\nBSD 3-Clause for the extension itself; see [`LICENSE`](LICENSE).\nVendored third-party code (all MIT):\n\n- `vendor\u002Fplutovg\u002F`: Samuel Ugochukwu's\n  [plutovg](https:\u002F\u002Fgithub.com\u002Fsammycage\u002Fplutovg) 2D rasterizer.\n  See [`vendor\u002Fplutovg\u002FLICENSE`](vendor\u002Fplutovg\u002FLICENSE).\n- `vendor\u002Fplutosvg\u002F`: Samuel Ugochukwu's\n  [plutosvg](https:\u002F\u002Fgithub.com\u002Fsammycage\u002Fplutosvg) SVG document\n  parser. See [`vendor\u002Fplutosvg\u002FLICENSE`](vendor\u002Fplutosvg\u002FLICENSE).\n- `vendor\u002Fqrcodegen\u002F`: nayuki's\n  [QR-Code-generator](https:\u002F\u002Fgithub.com\u002Fnayuki\u002FQR-Code-generator)\n  (C variant). See [`vendor\u002Fqrcodegen\u002FLICENSE`](vendor\u002Fqrcodegen\u002FLICENSE).\n\nSPDX: `(BSD-3-Clause AND MIT)`.\n\n---\n\n[Follow @iliaa on X](https:\u002F\u002Fx.com\u002Filiaa) • [Blog](https:\u002F\u002Filia.ws) • If this saved you a chart-rendering microservice, ⭐ star it!\n","iliaal\u002Ffastchart 是一个为 PHP 设计的原生扩展，用于快速生成图表。它支持 26 种图表类型及两种条形码（Code128 和 QR Code），并能以 SVG、PNG、JPEG 或 WebP 格式输出。该项目采用 C 语言编写，通过现代面向对象 API 提供流畅设置器和最终类来简化图表创建过程。其核心功能包括丰富的图表种类如线图、柱状图、饼图等，以及金融图表的专业绘制能力。此外，fastchart 在处理不同格式输出时能够保持一致的状态，无需重复构建图表对象即可灵活切换渲染方式。此项目适用于需要在 PHP 应用中高效集成可视化数据展示或条形码生成的场景。","2026-06-11 04:07:12","CREATED_QUERY"]