Skip to content

Conversation

jetrotal
Copy link
Contributor

@jetrotal jetrotal commented Oct 8, 2025

This PR uses base64.hpp from https://github.com/tobiaslocker/base64/ under its MIT license.

Data URI is the most common format for encoding/decoding files as strings. This implementation uses Base64 encoder and can load files through commads such as:

@pic[11].show {
    "data:image/png;base64,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"
    .pos 160, 120 .center
}

This PR uses `base64.hpp`  from https://github.com/tobiaslocker/base64/
under its  MIT license.

Data URI is the most common format for encoding/decoding files as strings.
This implementation uses Base64 encoder and can load files through commads such as:

```cpp
@pic[11].show {
    "data:image/png;base64,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"
    .pos 160, 120 .center
}

```
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds support for loading Data URI files by implementing Base64 decoding functionality. It integrates a third-party base64 library from https://github.com/tobiaslocker/base64/ under MIT license to enable loading files encoded as data URIs in base64 format.

  • Adds base64 encoding/decoding library with comprehensive lookup tables for both little and big endian systems
  • Implements Data URI parsing logic to extract mime type and decode base64 payload
  • Integrates Data URI support into existing file loading infrastructure

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 9 comments.

File Description
src/base64.h Adds complete base64 encoding/decoding library with endianness support
src/filefinder.cpp Implements Data URI parsing and integrates it into file finding/opening logic
Makefile.am Adds base64.h header to build system
CMakeLists.txt Adds base64.h header to CMake build system

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@carstene1ns
Copy link
Member

disgusted

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

2 participants