{"id":34627742,"url":"https://github.com/gogpu/gg","last_synced_at":"2026-04-25T15:01:36.794Z","repository":{"id":328356513,"uuid":"1110695603","full_name":"gogpu/gg","owner":"gogpu","description":"Enterprise-grade 2D graphics library for Go. Pure Go, zero CGO. Part of GoGPU ecosystem.","archived":false,"fork":false,"pushed_at":"2026-04-21T11:47:00.000Z","size":8544,"stargazers_count":93,"open_issues_count":5,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-21T13:30:52.619Z","etag":null,"topics":["2d-graphics","canvas","creative-coding","drawing","enterprise","go","golang","gpu","graphics","pure-go","rendering"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gogpu.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-05T15:25:05.000Z","updated_at":"2026-04-21T11:47:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/gogpu/gg","commit_stats":null,"previous_names":["gogpu/gg"],"tags_count":112,"template":false,"template_full_name":null,"purl":"pkg:github/gogpu/gg","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gogpu","download_url":"https://codeload.github.com/gogpu/gg/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgg/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32265977,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T09:15:33.318Z","status":"ssl_error","status_checked_at":"2026-04-25T09:15:31.997Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2d-graphics","canvas","creative-coding","drawing","enterprise","go","golang","gpu","graphics","pure-go","rendering"],"created_at":"2025-12-24T16:10:59.742Z","updated_at":"2026-04-25T15:01:36.784Z","avatar_url":"https://github.com/gogpu.png","language":"Go","readme":"\u003ch1 align=\"center\"\u003egg\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003e2D Graphics Library for Go\u003c/strong\u003e\u003cbr\u003e\n  Pure Go | GPU Accelerated | Production Ready\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/gogpu/gg/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/gogpu/gg/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/gogpu/gg\"\u003e\u003cimg src=\"https://codecov.io/gh/gogpu/gg/branch/main/graph/badge.svg\" alt=\"codecov\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pkg.go.dev/github.com/gogpu/gg\"\u003e\u003cimg src=\"https://pkg.go.dev/badge/github.com/gogpu/gg.svg\" alt=\"Go Reference\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://goreportcard.com/report/github.com/gogpu/gg\"\u003e\u003cimg src=\"https://goreportcard.com/badge/github.com/gogpu/gg\" alt=\"Go Report Card\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/gogpu/gg/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/gogpu/gg\" alt=\"Latest Release\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/gogpu/gg\"\u003e\u003cimg src=\"https://img.shields.io/badge/Go-1.25+-00ADD8?logo=go\" alt=\"Go Version\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003ePart of the \u003ca href=\"https://github.com/gogpu\"\u003eGoGPU\u003c/a\u003e ecosystem\u003c/sub\u003e\n\u003c/p\u003e\n\n---\n\n## Overview\n\n**gg** is a 2D graphics library for Go designed to power IDEs, browsers, and graphics-intensive applications. Built with modern patterns inspired by [vello](https://github.com/linebender/vello) and [tiny-skia](https://github.com/RazrFalcon/tiny-skia), it delivers production-grade rendering with zero CGO dependencies.\n\n\u003cp align=\"center\"\u003e\n  \u003cvideo src=\"https://github.com/user-attachments/assets/34243cff-5434-411c-a17c-3e52a80f1d57\" width=\"100%\" autoplay loop muted playsinline\u003e\n    Seven-Tier GPU Rendering: SDF shapes, convex polygons, stencil+cover paths, MSDF text, Vello compute pipeline, glyph mask cache\n  \u003c/video\u003e\n  \u003cbr\u003e\n  \u003csub\u003eSix-tier GPU rendering: SDF shapes, convex polygons, stencil+cover paths, MSDF text, Vello compute, and glyph mask cache.\n  Pure Go, Vulkan/DX12/GLES backends, zero CGO. (\u003ca href=\"examples/gogpu_integration/\"\u003esource\u003c/a\u003e)\u003c/sub\u003e\n\u003c/p\u003e\n\n### Key Features\n\n| Category | Capabilities |\n|----------|--------------|\n| **Rendering** | Immediate and retained mode, seven-tier GPU acceleration (SDF, Convex, Stencil+Cover, Textured Quad, MSDF Text, Compute, Glyph Mask), per-context GPU isolation (Skia GrContext pattern), scene GPU auto-select, Skia AAA pixel-perfect rasterizer, CPU fallback |\n| **Shapes** | Rectangles, circles, ellipses, arcs, bezier curves, polygons, stars |\n| **Text** | TrueType fonts, MSDF + glyph mask dual-strategy rendering, TextMode auto-selection, DPI-aware HiDPI text, ClearType LCD subpixel rendering, font hinting (auto-hinter), transform-aware CPU text (scale/rotate/shear), glyph outline caching, emoji support, bidirectional text, HarfBuzz shaping |\n| **Compositing** | 29 blend modes (Porter-Duff, Advanced, HSL), layer isolation, alpha masks (per-shape, per-layer, luminance, post-process) |\n| **Images** | 7 pixel formats, PNG/JPEG/WebP I/O, mipmaps, affine transforms |\n| **SVG** | Full SVG renderer (`gg/svg`): parse + render SVG XML with color override for theming, SVG path data parser (`ParseSVGPath`), transform-aware `FillPath`/`StrokePath` |\n| **Vector Export** | Recording system with PDF and SVG backends |\n| **Rasterizer** | Smart per-path algorithm selection (scanline, 4×4 tiles, 16×16 tiles, SDF, compute), text-aware area-based routing |\n| **Performance** | Tile-based parallel rendering, LRU caching |\n\n---\n\n## Installation\n\n```bash\ngo get github.com/gogpu/gg\n```\n\n**Requirements:** Go 1.25+\n\n---\n\n## Quick Start\n\n```go\npackage main\n\nimport (\n    \"github.com/gogpu/gg\"\n    \"github.com/gogpu/gg/text\"\n)\n\nfunc main() {\n    // Create drawing context\n    dc := gg.NewContext(512, 512)\n    defer dc.Close()\n\n    dc.ClearWithColor(gg.White)\n\n    // Draw shapes\n    dc.SetHexColor(\"#3498db\")\n    dc.DrawCircle(256, 256, 100)\n    dc.Fill()\n\n    // Render text\n    source, _ := text.NewFontSourceFromFile(\"arial.ttf\")\n    defer source.Close()\n\n    dc.SetFont(source.Face(32))\n    dc.SetColor(gg.Black)\n    dc.DrawString(\"Hello, GoGPU!\", 180, 260)\n\n    dc.SavePNG(\"output.png\")\n}\n```\n\n---\n\n## Rendering\n\n### Software Rendering (Default)\n\nThe CPU rasterizer automatically selects the optimal algorithm per-path:\n\n| Algorithm | Tiles | Best For |\n|-----------|-------|----------|\n| **AnalyticFiller** (Skia AAA) | — | Simple paths, small shapes (\u003c 32px). Pixel-perfect with Skia Chrome/Android. |\n| **AnalyticFiller Convex** | — | Convex shapes (rect, circle, triangle). 1.6x faster, kSnapDigit X snapping. |\n| **SparseStrips** | 4×4 | Complex paths, CPU/SIMD workloads |\n| **TileCompute** | 16×16 | Extreme complexity (10K+ segments) |\n\n```go\ndc := gg.NewContext(800, 600)\ndefer dc.Close()\n\n// Auto-selection (default) — optimal algorithm per-path\ndc.DrawCircle(400, 300, 100)\ndc.Fill()\n\n// Force specific algorithm for benchmarking\ndc.SetRasterizerMode(gg.RasterizerSparseStrips)\n```\n\n### GPU Acceleration (Optional)\n\ngg supports optional GPU acceleration through the `GPUAccelerator` interface with\na seven-tier rendering pipeline:\n\n| Tier | Method | Best For |\n|------|--------|----------|\n| **1. SDF** | Signed Distance Field | Circles, ellipses, rectangles, rounded rects |\n| **2a. Convex** | Direct vertex emission | Convex polygons, single draw call |\n| **2b. Stencil+Cover** | Fan tessellation + stencil buffer | Arbitrary complex paths, EvenOdd/NonZero fill |\n| **3. Textured Quad** | GPU image sampling | DrawImage, DrawGPUTexture (zero-readback compositing) |\n| **4. MSDF Text** | Multi-channel Signed Distance Field | Dynamic/animated text, resolution-independent |\n| **5. Compute** | 9-stage Vello compute pipeline | Full scenes with many paths (GPU parallel rasterization) |\n| **6. Glyph Mask** | CPU-rasterized R8 alpha atlas | Static UI text ≤48px, pixel-perfect quality |\n\nTiers 1–4, 6 use a render-pass pipeline; Tier 5 uses compute shaders dispatched\nvia `PipelineMode` (Auto/RenderPass/Compute). Text auto-selection routes horizontal\ntext ≤48px to Glyph Mask (Skia/Chrome pattern), else MSDF.\n\nWhen no GPU is registered, rendering uses the high-quality CPU rasterizer (default).\n\n```go\nimport (\n    \"github.com/gogpu/gg\"\n    _ \"github.com/gogpu/gg/gpu\" // opt-in GPU acceleration\n)\n\nfunc main() {\n    // GPU automatically used when available, falls back to CPU\n    dc := gg.NewContext(800, 600)\n    defer dc.Close()\n\n    dc.DrawCircle(400, 300, 100)\n    dc.Fill() // tries GPU first, falls back to CPU transparently\n}\n```\n\nFor zero-copy rendering directly to a GPU surface (e.g., in a gogpu window),\nuse [`ggcanvas.Canvas.RenderDirect`](integration/ggcanvas/) — see the\n[gogpu integration example](examples/gogpu_integration/). The example uses\nevent-driven rendering with `AnimationToken` for power-efficient VSync (0% CPU when idle).\n\n### Custom Pixmap\n\n```go\n// Use existing pixmap\npm := gg.NewPixmap(800, 600)\ndc := gg.NewContext(800, 600, gg.WithPixmap(pm))\n```\n\n---\n\n## Architecture\n\n```\n                        gg (Public API)\n                             │\n         ┌───────────────────┼───────────────────┐\n         │                   │                   │\n   Immediate Mode       Retained Mode        Resources\n   (Context API)        (Scene Graph)     (Images, Fonts)\n         │                   │                   │\n         └───────────────────┼───────────────────┘\n                             │\n              ┌──────────────┴──────────────┐\n              │                             │\n         CPU Raster                   GPUAccelerator\n      (always available)            (opt-in via gg/gpu)\n              │                             │\n    internal/raster              ┌──────────┼──────────┐\n                                 │          │          │\n                           Render Pass   MSDF Text   Compute\n                         (Tiers 1-4,6)  (Tier 4)   (Tier 5)\n```\n\n### Rendering Structure\n\n| Component | Location | Description |\n|-----------|----------|-------------|\n| **CPU Raster** | `internal/raster/` | Skia AAA analytic anti-aliasing (pixel-perfect port of Chrome/Android rasterizer). General + convex fast path. |\n| **Tile Rasterizers** | `internal/gpu/` (4×4), `internal/gpu/tilecompute/` (16×16) | SparseStrips + TileCompute, both ported from Vello |\n| **GPU Accelerator** | `internal/gpu` | Seven-tier GPU pipeline (SDF, Convex, Stencil+Cover, Textured Quad, MSDF Text, Compute, Glyph Mask) |\n| **GPU + Tiles** | `gpu/` | Opt-in via `import _ \"github.com/gogpu/gg/gpu\"` (GPU + tile rasterizers) |\n| **Tiles Only** | `raster/` | Opt-in via `import _ \"github.com/gogpu/gg/raster\"` (CPU-only tiles) |\n| **Software** | Root `gg` package | Default CPU renderer with smart algorithm selection |\n\n---\n\n## Core APIs\n\n### Immediate Mode (Context)\n\nCanvas-style drawing with transformation stack:\n\n```go\ndc := gg.NewContext(800, 600)\ndefer dc.Close()\n\n// Transforms\ndc.Push()\ndc.Translate(400, 300)\ndc.Rotate(math.Pi / 4)\ndc.DrawRectangle(-50, -50, 100, 100)\ndc.SetRGB(0.2, 0.5, 0.8)\ndc.Fill()\ndc.Pop()\n\n// Bezier paths\ndc.MoveTo(100, 100)\ndc.QuadraticTo(200, 50, 300, 100)\ndc.CubicTo(350, 150, 350, 250, 300, 300)\ndc.SetLineWidth(3)\ndc.Stroke()\n```\n\n### Fluent Path Builder\n\nType-safe path construction with method chaining:\n\n```go\npath := gg.BuildPath().\n    MoveTo(100, 100).\n    LineTo(200, 100).\n    QuadTo(250, 150, 200, 200).\n    CubicTo(150, 250, 100, 250, 50, 200).\n    Close().\n    Circle(300, 150, 50).\n    Star(400, 150, 40, 20, 5).\n    Build()\n\ndc.SetPath(path)\ndc.Fill()\n```\n\n### Retained Mode (Scene Graph)\n\nGPU-optimized scene graph for complex applications:\n\n```go\nimport \"github.com/gogpu/gg/render\"\n\ns := render.NewScene()\n\ns.SetFillColor(color.RGBA{R: 255, A: 200})\ns.Circle(150, 200, 100)\ns.Fill()\n\ns.SetFillColor(color.RGBA{B: 255, A: 200})\ns.Circle(250, 200, 100)\ns.Fill()\n\nrenderer := render.NewSoftwareRenderer()\ntarget := render.NewPixmapTarget(800, 600)\nrenderer.Render(target, s)\n```\n\n### Text Rendering\n\nFull Unicode support with font fallback and optional HarfBuzz-level shaping:\n\n```go\n// Font composition\nmainFont, _ := text.NewFontSourceFromFile(\"Roboto.ttf\")\nemojiFont, _ := text.NewFontSourceFromFile(\"NotoEmoji.ttf\")\ndefer mainFont.Close()\ndefer emojiFont.Close()\n\nmultiFace, _ := text.NewMultiFace(\n    mainFont.Face(24),\n    text.NewFilteredFace(emojiFont.Face(24), text.RangeEmoji),\n)\n\ndc.SetFont(multiFace)\ndc.DrawString(\"Hello World! Nice day!\", 50, 100)\n\n// Optional: enable HarfBuzz shaping for ligatures, kerning, complex scripts\nshaper := text.NewGoTextShaper()\ntext.SetShaper(shaper)\ndefer text.SetShaper(nil)\n\n// Text layout with wrapping\nopts := text.LayoutOptions{\n    MaxWidth:  400,\n    WrapMode:  text.WrapWordChar,\n    Alignment: text.AlignCenter,\n}\nlayout := text.LayoutText(\"Long text...\", face, opts)\n```\n\n#### Transform-Aware Text\n\nText rendering respects the full transformation matrix (scale, rotation, shear):\n\n```go\ndc.SetFont(source.Face(24))\ndc.SetRGB(0, 0, 0)\n\n// Scaled text — rendered at device resolution (no pixelation)\ndc.Push()\ndc.Scale(2, 2)\ndc.DrawString(\"2x Scale\", 50, 50)\ndc.Pop()\n\n// Rotated text — glyph outlines converted to vector paths\ndc.Push()\ndc.Translate(200, 200)\ndc.Rotate(math.Pi / 6) // 30 degrees\ndc.DrawString(\"Rotated\", 0, 0)\ndc.Pop()\n```\n\nText rendering strategy is selectable per-Context via `SetTextMode()`:\n\n| Mode | Strategy | Best for |\n|------|----------|----------|\n| `TextModeAuto` | Auto-select (default) | General use |\n| `TextModeMSDF` | GPU MSDF atlas | Games, animations, real-time scaling |\n| `TextModeVector` | Glyph outlines as paths | UI labels, quality-critical text |\n| `TextModeBitmap` | CPU bitmap rasterization | PNG/PDF export, static text |\n\nThe CPU text pipeline uses a three-tier strategy (modeled after Skia/Cairo/Vello):\ntranslation-only → bitmap, uniform scale ≤256px → bitmap at device size,\neverything else → glyph outlines as vector paths with cached outlines via `GlyphCache`.\n\n### Color Emoji\n\nFull color emoji support with CBDT/CBLC (bitmap) and COLR/CPAL (vector) formats:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/colr_palette.png\" alt=\"COLR Color Palette\" width=\"512\"\u003e\n  \u003cbr\u003e\n  \u003csub\u003e175 colors from Segoe UI Emoji COLR/CPAL palette\u003c/sub\u003e\n\u003c/p\u003e\n\n```go\n// Extract color emoji from font\nextractor, _ := emoji.NewCBDTExtractor(cbdtData, cblcData)\nglyph, _ := extractor.GetGlyph(glyphID, ppem)\nimg, _ := png.Decode(bytes.NewReader(glyph.Data))\n\n// Parse COLR/CPAL vector layers\nparser, _ := emoji.NewCOLRParser(colrData, cpalData)\nglyph, _ := parser.GetGlyph(glyphID, paletteIndex)\nfor _, layer := range glyph.Layers {\n    // Render each layer with layer.Color\n}\n```\n\nSee [`examples/color_emoji/`](examples/color_emoji/) for a complete example.\n\n### Layer Compositing\n\n29 blend modes with isolated layers:\n\n```go\ndc.PushLayer(gg.BlendOverlay, 0.7)\n\ndc.SetRGB(1, 0, 0)\ndc.DrawCircle(150, 200, 100)\ndc.Fill()\n\ndc.SetRGB(0, 0, 1)\ndc.DrawCircle(250, 200, 100)\ndc.Fill()\n\ndc.PopLayer()\n```\n\n### Alpha Masks\n\nPer-shape masking — each draw individually masked:\n\n```go\n// Create a circular mask\ndc.DrawCircle(200, 200, 100)\nmask := dc.AsMask() // capture path as mask (before Fill!)\ndc.ClearPath()\n\n// Apply mask: only the circle area is visible\ndc.SetMask(mask)\ndc.SetRGB(0, 0, 1)\ndc.DrawRectangle(0, 0, 400, 400)\ndc.Fill() // blue only inside the circle\n```\n\nPer-layer masking — mask an entire group of draws:\n\n```go\nmask := gg.NewMask(400, 400)\n// ... fill mask with desired shape ...\n\ndc.PushMaskLayer(mask)\ndc.DrawCircle(100, 100, 50)\ndc.Fill()\ndc.DrawRectangle(200, 200, 80, 80)\ndc.Fill()\ndc.PopLayer() // entire layer masked, then composited\n```\n\n### Recording \u0026 Vector Export\n\nRecord drawing operations and export to PDF or SVG:\n\n```go\nimport (\n    \"github.com/gogpu/gg/recording\"\n    _ \"github.com/gogpu/gg-pdf\" // Register PDF backend\n    _ \"github.com/gogpu/gg-svg\" // Register SVG backend\n)\n\n// Create recorder\nrec := recording.NewRecorder(800, 600)\n\n// Draw using familiar API\nrec.SetColor(gg.Blue)\nrec.DrawCircle(400, 300, 100)\nrec.Fill()\n\n// Finish recording and play back to a raster backend\nr := rec.FinishRecording()\nbackend := raster.NewBackend()\nr.Playback(backend)\nbackend.SaveToFile(\"output.png\")\n```\n\n---\n\n## Why \"Context\" Instead of \"Canvas\"?\n\nThe drawing type is named `Context` following industry conventions:\n\n| Library | Drawing Type |\n|---------|-------------|\n| HTML5 Canvas | `CanvasRenderingContext2D` |\n| Cairo | `cairo_t` (context) |\n| Apple CoreGraphics | `CGContext` |\n| piet (Rust) | `RenderContext` |\n\nIn HTML5, Canvas is the element while **Context** performs drawing (`canvas.getContext(\"2d\")`). The `Context` contains drawing state and provides the drawing API.\n\n**Convention:** `dc` for drawing context, `ctx` for `context.Context`:\n\n```go\ndc := gg.NewContext(512, 512) // dc = drawing context\n```\n\n---\n\n## Performance\n\n| Operation | Time | Notes |\n|-----------|------|-------|\n| sRGB to Linear | 0.16ns | 260x faster than math.Pow |\n| LayerCache.Get | 90ns | Thread-safe LRU |\n| DirtyRegion.Mark | 10.9ns | Lock-free atomic |\n| MSDF lookup | \u003c10ns | Zero-allocation |\n| Path iteration | 23ns | SOA Iterate(), 0 allocs |\n| FillRect | 77µs | **0 allocs** (zero-alloc pipeline) |\n| FillCircle r100 | 2ms | **0 allocs** (zero-alloc pipeline) |\n| Gradient ColorAt | 33ns | 0 allocs (pre-sorted stops) |\n\n---\n\n## Ecosystem\n\n**gg** is part of the [GoGPU](https://github.com/gogpu) ecosystem.\n\n| Project | Description |\n|---------|-------------|\n| [gogpu/gogpu](https://github.com/gogpu/gogpu) | GPU framework with windowing and input |\n| [gogpu/wgpu](https://github.com/gogpu/wgpu) | Pure Go WebGPU implementation |\n| [gogpu/naga](https://github.com/gogpu/naga) | Shader compiler (WGSL to SPIR-V, MSL, GLSL) |\n| **gogpu/gg** | **2D graphics (this repo)** |\n| [gogpu/gg-pdf](https://github.com/gogpu/gg-pdf) | PDF export backend for recording |\n| [gogpu/gg-svg](https://github.com/gogpu/gg-svg) | SVG export backend for recording |\n| [gogpu/ui](https://github.com/gogpu/ui) | GUI toolkit (planned) |\n\n---\n\n## Documentation\n\n- **[ARCHITECTURE.md](docs/ARCHITECTURE.md)** — System architecture\n- **[ROADMAP.md](ROADMAP.md)** — Development milestones\n- **[CHANGELOG.md](CHANGELOG.md)** — Release notes\n- **[CONTRIBUTING.md](CONTRIBUTING.md)** — Contribution guidelines\n- **[pkg.go.dev](https://pkg.go.dev/github.com/gogpu/gg)** — API reference\n\n### Articles\n\n- [GoGPU: From Idea to 100K Lines in Two Weeks](https://dev.to/kolkov/gogpu-from-idea-to-100k-lines-in-two-weeks-building-gos-gpu-ecosystem-3b2)\n- [Pure Go 2D Graphics Library with GPU Acceleration](https://dev.to/kolkov/pure-go-2d-graphics-library-with-gpu-acceleration-introducing-gogpugg-538h)\n- [GoGPU Announcement](https://dev.to/kolkov/gogpu-a-pure-go-graphics-library-for-gpu-programming-2j5d)\n\n---\n\n## Contributing\n\nContributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n**Priority areas:**\n- API feedback and testing\n- Examples and documentation\n- Performance benchmarks\n- Cross-platform testing\n\n---\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003egg\u003c/strong\u003e — 2D Graphics for Go\n\u003c/p\u003e\n","funding_links":[],"categories":["Images"],"sub_categories":["Search and Analytic Databases"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgogpu%2Fgg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgogpu%2Fgg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgogpu%2Fgg/lists"}