{"id":36782152,"url":"https://github.com/srwiley/scanx","last_synced_at":"2026-01-12T13:17:59.463Z","repository":{"id":57481469,"uuid":"162495417","full_name":"srwiley/scanx","owner":"srwiley","description":"Fast antialiaser supporting image.RGBA and xgraphics.Image types intended for use with rasterx","archived":false,"fork":false,"pushed_at":"2019-03-09T01:04:44.000Z","size":146,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-06-21T14:30:06.290Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/srwiley.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-12-19T22:01:54.000Z","updated_at":"2024-06-21T14:30:06.292Z","dependencies_parsed_at":"2022-09-26T17:50:30.088Z","dependency_job_id":null,"html_url":"https://github.com/srwiley/scanx","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/srwiley/scanx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srwiley%2Fscanx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srwiley%2Fscanx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srwiley%2Fscanx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srwiley%2Fscanx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/srwiley","download_url":"https://codeload.github.com/srwiley/scanx/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srwiley%2Fscanx/sbom","scorecard":{"id":844338,"data":{"date":"2025-08-11","repo":{"name":"github.com/srwiley/scanx","commit":"e945037913887c961de19496c0a0a923628a6b5c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/13 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-23T21:06:34.610Z","repository_id":57481469,"created_at":"2025-08-23T21:06:34.611Z","updated_at":"2025-08-23T21:06:34.611Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28338996,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T12:22:26.515Z","status":"ssl_error","status_checked_at":"2026-01-12T12:22:10.856Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":[],"created_at":"2026-01-12T13:17:58.674Z","updated_at":"2026-01-12T13:17:59.454Z","avatar_url":"https://github.com/srwiley.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# scanx\n\nWarning: Scanx is beta software. There are known bugs being worked on. Please use scanFT or scanGV unless you want to test each svg file your application may use.\n\nScanx is a fast antialiaser supporting the draw.Image interface and image.RGBA and xgraphics.Image types in particular. It is intended for use with the rasterx package.\n\nScanx replaces the Painter interface with the Spanner interface that allows for more direct writing to an underlying image type. Scanx has two types that satisfy the Spanner interface; ImgSpanner and LinkListSpanner.\n\nImgSpanner draw into any image that supports the draw.Image interface. It is optimized for image.RGBA and xgraphics.Image types.\n\nLinkListSpanner supports the same Image types as ImgSpanner, but stores the spans in y linked lists, where y is the height of the image. It is faster than ImgSpanner for svg icons where the paths overlap significantly, since it only writes to the image after all the spans are collected. The increase in speed is particually significant when drawing to a large image, like a high resolution monitor. However, LinkListSpanner does not support gradients, so if you are using them, you should use ImgSpanner instead.\n\n# Example using ImgSpanner:\n```golang\nbounds     = image.Rect(0, 0, w, h)\nimg        = image.NewRGBA(bounds)\nspanner     = scanx.NewImgSpanner(img)\nscanner    = scanx.NewScanner(spanner, w, h)\nraster = rasterx.NewDasher(w, h, scanner)\n//Use the raster to draw and the results go to the img\n``` \n# Example using LinkListSpanner:\n```golang  \nbounds     = image.Rect(0, 0, w, h)\nimg        = image.NewRGBA(bounds)\nspanner    = \u0026scanx.LinkListSpanner{}\nspanner.SetBounds(bounds)\nscanner    = scanx.NewScanner(spanner, w, h)\nraster = rasterx.NewDasher(w, h, scanner)\n//Use the raster to draw ..\n//This draws the accumulated spans onto the image\nspanner.DrawToImage(img)\n//Get the spanner ready for another image\nspanner.Clear()\n``` \n# Test results in comparison to scanFT and scanGV\nImages for the svg files in the test folder have all been generated and compared pixel for pixel using ScanFT, ImgSpanner and LinkListSpanner. ImgSpanner and LinkListSpanner generated images are all identical except in the case of gradients, which LinkListSpanner does not at this time support. ScanFT will differ from ImgScanner and LinkList spanner in some pixel values, usually by one digit, but in cases with multiple semitransparent overlays the effect can be cummulative. The highest difference in the data set is found in the randspot.svg file, where for some pixels the total difference is 4, although it is hard to see any difference visually.\n\nBelow are benchmark results using files in test/lanscapeIcons and the indicated spanner or scanner. They are draw at 0.5, 1, 5, and 15 times native resolution.\n\n```\ngoos: linux\ngoarch: amd64\npkg: github.com/srwiley/scanx\n\nResolution: 0.5x \nBenchmarkLinkListSpanner5-16      \t     100\t  15692425 ns/op\t   37215 B/op\t     634 allocs/op\nBenchmarkImgSpanner5-16           \t     100\t  14352161 ns/op\t    8708 B/op\t     634 allocs/op\nBenchmarkFTScanner5-16            \t      50\t  24019383 ns/op\t    3699 B/op\t     321 allocs/op\nBenchmarkGVScanner5-16            \t       3\t 362814157 ns/op\t    3045 B/op\t     321 allocs/op\n\nResolution: 1x\nBenchmarkLinkListSpanner10-16     \t      50\t  31774480 ns/op\t  128512 B/op\t     634 allocs/op\nBenchmarkImgSpanner10-16          \t      50\t  35224671 ns/op\t   12805 B/op\t     634 allocs/op\nBenchmarkFTScanner10-16           \t      20\t  75619298 ns/op\t   11241 B/op\t     321 allocs/op\nBenchmarkGVScanner10-16           \t       1\t1431206955 ns/op\t    3056 B/op\t     321 allocs/op\n\nResolution: 5x\nBenchmarkLinkListSpanner50-16     \t       5\t 227859937 ns/op\t 6047212 B/op\t     642 allocs/op\nBenchmarkImgSpanner50-16          \t       2\t 513577800 ns/op\t  888680 B/op\t     644 allocs/op\nBenchmarkFTScanner50-16           \t       1\t1644670841 ns/op\t  691184 B/op\t     324 allocs/op\nBenchmarkGVScanner50-16           \t       1\t38052841313 ns/op\t26217456 B/op\t     322 allocs/op\n\nResolution: 15x\nBenchmarkLinkListSpanner150-16    \t       1\t1344679006 ns/op\t93257568 B/op\t     679 allocs/op\nBenchmarkImgSpanner150-16         \t       1\t4173881468 ns/op\t 5826384 B/op\t     665 allocs/op\nBenchmarkFTScanner150-16          \t       1\t10811718931 ns/op\t 2788336 B/op\t     325 allocs/op\nBenchmarkGVScanner150-16          \t       1\t250690083743 ns/op\t235934720 B/op\t     327 allocs/op\n```\nThe results indicate the ImgScanner is consistently faster than scanFT or scanGV. Also LinkListSpanner usually does better with this data set as size of the graphic increases. Also note that some svg files can perform quite badly using the LinkListSpanner, such as rl.svg in the testdata/svg folder. This file consists of lots of random lines that slow the list generation.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrwiley%2Fscanx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrwiley%2Fscanx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrwiley%2Fscanx/lists"}