From 345bb193fe75ddbf2f21bd295869276b6fa87189 Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Tue, 11 Jul 2017 01:59:21 +0200 Subject: vo_opengl: support loading custom user textures Parsing the texture data as raw strings makes the textures the most portable and self-contained. In order to facilitate different types of shaders, the parse_user_shader interaction has been changed to instead have it loop through blocks and call the passed functions for each valid block parsed. This is more modular and also cleaner, with better code separation. Closes #4586. --- misc/bstr.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'misc/bstr.c') diff --git a/misc/bstr.c b/misc/bstr.c index 8c47b447d4..09eb6af25b 100644 --- a/misc/bstr.c +++ b/misc/bstr.c @@ -454,3 +454,40 @@ struct bstr bstr_get_ext(struct bstr s) return (struct bstr){NULL, 0}; return bstr_splice(s, dotpos + 1, s.len); } + +static int h_to_i(unsigned char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + + return -1; // invalid char +} + +bool bstr_decode_hex(void *talloc_ctx, struct bstr hex, struct bstr *out) +{ + if (!out) + return false; + + char *arr = talloc_array(talloc_ctx, char, hex.len / 2); + int len = 0; + + while (hex.len >= 2) { + int a = h_to_i(hex.start[0]); + int b = h_to_i(hex.start[1]); + hex = bstr_splice(hex, 2, hex.len); + + if (a < 0 || b < 0) { + talloc_free(arr); + return false; + } + + arr[len++] = (a << 4) | b; + } + + *out = (struct bstr){ .start = arr, .len = len }; + return true; +} -- cgit v1.2.3