aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/hardcopy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/hardcopy.c')
-rw-r--r--src/nvim/hardcopy.c109
1 files changed, 61 insertions, 48 deletions
diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c
index 32b471efb0..575b239f5a 100644
--- a/src/nvim/hardcopy.c
+++ b/src/nvim/hardcopy.c
@@ -22,6 +22,7 @@
#include "nvim/fileio.h"
#include "nvim/garray.h"
#include "nvim/hardcopy.h"
+#include "nvim/highlight_group.h"
#include "nvim/mbyte.h"
#include "nvim/memline.h"
#include "nvim/memory.h"
@@ -386,30 +387,46 @@ static uint32_t prt_get_term_color(int colorindex)
return cterm_color_8[colorindex % 8];
}
-static void prt_get_attr(int hl_id, prt_text_attr_T *pattr, int modec)
+static uint32_t prt_get_color(int hl_id, int modec)
{
int colorindex;
uint32_t fg_color;
+ const char *color = highlight_color(hl_id, "fg#", 'g');
+ if (color != NULL) {
+ RgbValue rgb = name_to_color(color);
+ if (rgb != -1) {
+ return (uint32_t)rgb;
+ }
+ }
+
+ color = highlight_color(hl_id, "fg", modec);
+ if (color == NULL) {
+ colorindex = 0;
+ } else {
+ colorindex = atoi(color);
+ }
+
+ if (colorindex >= 0 && colorindex < t_colors) {
+ fg_color = prt_get_term_color(colorindex);
+ } else {
+ fg_color = PRCOLOR_BLACK;
+ }
+
+ return fg_color;
+}
+
+static void prt_get_attr(int hl_id, prt_text_attr_T *pattr, int modec)
+{
pattr->bold = (highlight_has_attr(hl_id, HL_BOLD, modec) != NULL);
pattr->italic = (highlight_has_attr(hl_id, HL_ITALIC, modec) != NULL);
pattr->underline = (highlight_has_attr(hl_id, HL_UNDERLINE, modec) != NULL);
+ pattr->underlineline = (highlight_has_attr(hl_id, HL_UNDERLINELINE, modec) != NULL);
pattr->undercurl = (highlight_has_attr(hl_id, HL_UNDERCURL, modec) != NULL);
+ pattr->underdot = (highlight_has_attr(hl_id, HL_UNDERDOT, modec) != NULL);
+ pattr->underdash = (highlight_has_attr(hl_id, HL_UNDERDASH, modec) != NULL);
- {
- const char *color = highlight_color(hl_id, "fg", modec);
- if (color == NULL) {
- colorindex = 0;
- } else {
- colorindex = atoi(color);
- }
-
- if (colorindex >= 0 && colorindex < t_colors) {
- fg_color = prt_get_term_color(colorindex);
- } else {
- fg_color = PRCOLOR_BLACK;
- }
- }
+ uint32_t fg_color = prt_get_color(hl_id, modec);
if (fg_color == PRCOLOR_WHITE) {
fg_color = PRCOLOR_BLACK;
@@ -986,8 +1003,7 @@ static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T
#define PRT_PS_DEFAULT_DPI (72) // Default user space resolution
#define PRT_PS_DEFAULT_FONTSIZE (10)
-#define PRT_MEDIASIZE_LEN (sizeof(prt_mediasize) / \
- sizeof(struct prt_mediasize_S))
+#define PRT_MEDIASIZE_LEN ARRAY_SIZE(prt_mediasize)
static struct prt_mediasize_S prt_mediasize[] =
{
@@ -1254,7 +1270,7 @@ static struct prt_dsc_comment_S prt_dsc_table[] =
* Variables for the output PostScript file.
*/
static FILE *prt_ps_fd;
-static int prt_file_error;
+static bool prt_file_error;
static char_u *prt_ps_file_name = NULL;
/*
@@ -1330,7 +1346,7 @@ static void prt_write_file_raw_len(char_u *buffer, size_t bytes)
if (!prt_file_error
&& fwrite(buffer, sizeof(char_u), bytes, prt_ps_fd) != bytes) {
emsg(_("E455: Error writing to PostScript output file"));
- prt_file_error = TRUE;
+ prt_file_error = true;
}
}
@@ -1982,7 +1998,7 @@ void mch_print_cleanup(void)
if (prt_ps_fd != NULL) {
fclose(prt_ps_fd);
prt_ps_fd = NULL;
- prt_file_error = FALSE;
+ prt_file_error = false;
}
if (prt_ps_file_name != NULL) {
XFREE_CLEAR(prt_ps_file_name);
@@ -2204,7 +2220,7 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
// Check encoding and character set are compatible
if ((p_mbenc->needs_charset & p_mbchar->has_charset) == 0) {
emsg(_("E673: Incompatible multi-byte encoding and character set."));
- return FALSE;
+ return false;
}
// Add charset name if not empty
@@ -2216,7 +2232,7 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
// Add custom CMap character set name
if (*p_pmcs == NUL) {
emsg(_("E674: printmbcharset cannot be empty with multi-byte encoding."));
- return FALSE;
+ return false;
}
STRLCPY(prt_cmap, p_pmcs, sizeof(prt_cmap) - 2);
STRCAT(prt_cmap, "-");
@@ -2232,7 +2248,7 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
if (!mbfont_opts[OPT_MBFONT_REGULAR].present) {
emsg(_("E675: No default font specified for multi-byte printing."));
- return FALSE;
+ return false;
}
// Derive CID font names with fallbacks if not defined
@@ -2426,12 +2442,12 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
prt_need_bgcol = false;
prt_need_underline = false;
- prt_file_error = FALSE;
+ prt_file_error = false;
return OK;
}
-static int prt_add_resource(struct prt_ps_resource_S *resource)
+static bool prt_add_resource(struct prt_ps_resource_S *resource)
{
FILE *fd_resource;
char_u resource_buffer[512];
@@ -2440,7 +2456,7 @@ static int prt_add_resource(struct prt_ps_resource_S *resource)
fd_resource = os_fopen((char *)resource->filename, READBIN);
if (fd_resource == NULL) {
semsg(_("E456: Can't open file \"%s\""), resource->filename);
- return FALSE;
+ return false;
}
switch (resource->type) {
case PRT_RESOURCE_TYPE_PROCSET:
@@ -2450,7 +2466,7 @@ static int prt_add_resource(struct prt_ps_resource_S *resource)
(char *)resource->title);
break;
default:
- return FALSE;
+ return false;
}
prt_dsc_textline("BeginDocument", (char *)resource->filename);
@@ -2462,7 +2478,7 @@ static int prt_add_resource(struct prt_ps_resource_S *resource)
semsg(_("E457: Can't read PostScript resource file \"%s\""),
resource->filename);
fclose(fd_resource);
- return FALSE;
+ return false;
}
if (bytes_read == 0) {
break;
@@ -2470,7 +2486,7 @@ static int prt_add_resource(struct prt_ps_resource_S *resource)
prt_write_file_raw_len(resource_buffer, bytes_read);
if (prt_file_error) {
fclose(fd_resource);
- return FALSE;
+ return false;
}
}
fclose(fd_resource);
@@ -2479,10 +2495,10 @@ static int prt_add_resource(struct prt_ps_resource_S *resource)
prt_dsc_noarg("EndResource");
- return TRUE;
+ return true;
}
-int mch_print_begin(prt_settings_T *psettings)
+bool mch_print_begin(prt_settings_T *psettings)
{
int bbox[4];
double left;
@@ -2496,7 +2512,6 @@ int mch_print_begin(prt_settings_T *psettings)
char_u *p;
struct prt_ps_resource_S res_cidfont;
struct prt_ps_resource_S res_cmap;
- int retval = FALSE;
/*
* PS DSC Header comments - no PS code!
@@ -2568,25 +2583,25 @@ int mch_print_begin(prt_settings_T *psettings)
// Search for external resources VIM supplies
if (!prt_find_resource("prolog", &res_prolog)) {
emsg(_("E456: Can't find PostScript resource file \"prolog.ps\""));
- return FALSE;
+ return false;
}
if (!prt_open_resource(&res_prolog)) {
- return FALSE;
+ return false;
}
if (!prt_check_resource(&res_prolog, PRT_PROLOG_VERSION)) {
- return FALSE;
+ return false;
}
if (prt_out_mbyte) {
// Look for required version of multi-byte printing procset
if (!prt_find_resource("cidfont", &res_cidfont)) {
emsg(_("E456: Can't find PostScript resource file \"cidfont.ps\""));
- return FALSE;
+ return false;
}
if (!prt_open_resource(&res_cidfont)) {
- return FALSE;
+ return false;
}
if (!prt_check_resource(&res_cidfont, PRT_CID_PROLOG_VERSION)) {
- return FALSE;
+ return false;
}
}
@@ -2611,12 +2626,12 @@ int mch_print_begin(prt_settings_T *psettings)
if (!prt_find_resource(p_encoding, &res_encoding)) {
semsg(_("E456: Can't find PostScript resource file \"%s.ps\""),
p_encoding);
- return FALSE;
+ return false;
}
}
}
if (!prt_open_resource(&res_encoding)) {
- return FALSE;
+ return false;
}
// For the moment there are no checks on encoding resource files to
// perform
@@ -2630,10 +2645,10 @@ int mch_print_begin(prt_settings_T *psettings)
if (!prt_find_resource(prt_ascii_encoding, &res_encoding)) {
semsg(_("E456: Can't find PostScript resource file \"%s.ps\""),
prt_ascii_encoding);
- return FALSE;
+ return false;
}
if (!prt_open_resource(&res_encoding)) {
- return FALSE;
+ return false;
}
// For the moment there are no checks on encoding resource files to
// perform
@@ -2656,10 +2671,10 @@ int mch_print_begin(prt_settings_T *psettings)
if (!prt_find_resource(prt_cmap, &res_cmap)) {
semsg(_("E456: Can't find PostScript resource file \"%s.ps\""),
prt_cmap);
- return FALSE;
+ return false;
}
if (!prt_open_resource(&res_cmap)) {
- return FALSE;
+ return false;
}
}
@@ -2737,7 +2752,7 @@ int mch_print_begin(prt_settings_T *psettings)
// There will be only one Roman font encoding to be included in the PS
// file.
if (!prt_add_resource(&res_encoding)) {
- return FALSE;
+ return false;
}
}
@@ -2847,9 +2862,7 @@ int mch_print_begin(prt_settings_T *psettings)
prt_dsc_noarg("EndSetup");
// Fail if any problems writing out to the PS file
- retval = !prt_file_error;
-
- return retval;
+ return !prt_file_error;
}
void mch_print_end(prt_settings_T *psettings)