--- title: "C API" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{C API} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ```{r setup} library(colorfast) ``` `{colorfast}` exports three C functions for use in other packages. To use these functions: * In your package `DESCRIPTION` * Add `LinkingTo: colorfast` * Add `Depends: colorfast (>= 1.0.1)` * In your C code * Add `#include ` * Call the functions below ``` void col_to_rgb(const char *col, uint8_t ptr[4]); uint32_t col_to_int(const char *col); void int_to_col(uint32_t icol, char buf[10]); ``` ## String color to vector of RGBA values `void col_to_rgb(const char *col, uint8_t ptr[4])` * `const char *col` is a pointer to a null-terminated C string containing either a hex color, or the name of a standard R color: E.g. `"#1287Af"`, `"hotpink"` * `uint8_t ptr[4]` holds the values returned from the function i.e. RGBA color component values The R call `col_to_rgb('red')`, can be called via the C api as: ``` c #include #include void convert_col_to_rgb(const char *col) { uint8_t values[4]; col_to_rgb(col, values); for (int i = 0; i < 4; ++i) { printf("%i ", values[i]); } } ``` ```{r echo=FALSE, eval=FALSE} library(callme) code = r"( #include #include void convert_col_to_rgb(const char *col) { uint8_t values[4]; col_to_rgb(col, values); for (int i = 0; i < 4; ++i) { printf("%i ", values[i]); } } SEXP test() { convert_col_to_rgb("red"); return R_NilValue; } )" #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Find the location of nara.h and include its directory in the search path # using C Pre-Processor flags (PKG_CPPFLAGS) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nara_h <- system.file("include", "colorfast.h", package = "colorfast", mustWork = TRUE) cpp_include = paste0("-I", dirname(nara_h)) callme::compile(code, PKG_CPPFLAGS = cpp_include) test() ``` ## String color to packed integer color `void col_to_int(const char *col)` * `const char *col` is a pointer to a null-terminated C string containing either a hex color, or the name of a standard R color: E.g. `"#1287Af"`, `"hotpink"` ``` c #include #include void convert_col_to_int(const char *col) { uint32_t value = col_to_int(col); printf("%i ", value); } ``` ```{r echo=FALSE, eval=FALSE} library(callme) code = r"( #include #include void convert_col_to_int(const char *col) { uint32_t value = col_to_int(col); printf("%i ", value); } SEXP test() { convert_col_to_int("red"); return R_NilValue; } )" #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Find the location of nara.h and include its directory in the search path # using C Pre-Processor flags (PKG_CPPFLAGS) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nara_h <- system.file("include", "colorfast.h", package = "colorfast", mustWork = TRUE) cpp_include = paste0("-I", dirname(nara_h)) callme::compile(code, PKG_CPPFLAGS = cpp_include) test() ``` ## Packed integer color to hexadecimal color `void int_to_col(uint32_t icol, char buf[10])` * `uint32_t icol` unsigned integer holding the 4 RGBA color values * `char buf[10]` a character buffer into which the hex color will be written e.g. `#1154EE00` ``` c #include #include void convert_int_to_col(uint32_t icol) { char buf[10]; int_to_col(icol, buf); printf("%s\n", buf); } ``` ```{r echo=FALSE, eval=FALSE} library(callme) code = r"( #include #include void convert_int_to_col(uint32_t icol) { char buf[10]; int_to_col(icol, buf); printf("%s\n", buf); } SEXP test() { convert_int_to_col(123456); return R_NilValue; } )" #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Find the location of nara.h and include its directory in the search path # using C Pre-Processor flags (PKG_CPPFLAGS) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nara_h <- system.file("include", "colorfast.h", package = "colorfast", mustWork = TRUE) cpp_include = paste0("-I", dirname(nara_h)) callme::compile(code, PKG_CPPFLAGS = cpp_include) test() ```