~xzfc/libvterm/libvterm

« back to all changes in this revision

Viewing changes to src/pen.c

  • Committer: Albert Safin
  • Date: 2017-10-25 09:41:50 UTC
  • Revision ID: xzfcpw@gmail.com-20171025094150-wq78wsd1fwwiju4a
Export color indexes

Show diffs side-by-side

added added

removed removed

Lines of Context:
73
73
  return false;
74
74
}
75
75
 
76
 
static int lookup_colour(const VTermState *state, int palette, const long args[], int argcount, VTermColor *col, int *index)
 
76
static int lookup_colour(const VTermState *state, int palette, const long args[], int argcount, VTermColor *col, int16_t *index)
77
77
{
78
78
  switch(palette) {
79
79
  case 2: // RGB mode - 3 args contain colour values directly
80
80
    if(argcount < 3)
81
81
      return argcount;
82
82
 
 
83
    if(index)
 
84
      *index = -2;
 
85
 
83
86
    col->red   = CSI_ARG(args[0]);
84
87
    col->green = CSI_ARG(args[1]);
85
88
    col->blue  = CSI_ARG(args[2]);
162
165
  state->pen.strike = 0;    setpenattr_bool(state, VTERM_ATTR_STRIKE, 0);
163
166
  state->pen.font = 0;      setpenattr_int( state, VTERM_ATTR_FONT, 0);
164
167
 
165
 
  state->fg_index = -1;
166
 
  state->bg_index = -1;
 
168
  state->pen.fg_index = -1; setpenattr_int( state, VTERM_ATTR_FOREGROUND_INDEX, -1);
 
169
  state->pen.bg_index = -1; setpenattr_int( state, VTERM_ATTR_BACKGROUND_INDEX, -1);
167
170
  state->pen.fg = state->default_fg;  setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->default_fg);
168
171
  state->pen.bg = state->default_bg;  setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->default_bg);
169
172
}
238
241
    case 1: // Bold on
239
242
      state->pen.bold = 1;
240
243
      setpenattr_bool(state, VTERM_ATTR_BOLD, 1);
241
 
      if(state->fg_index > -1 && state->fg_index < 8 && state->bold_is_highbright)
242
 
        set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, state->fg_index + (state->pen.bold ? 8 : 0));
 
244
      if(state->pen.fg_index > -1 && state->pen.fg_index < 8 && state->bold_is_highbright)
 
245
        set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, state->pen.fg_index + (state->pen.bold ? 8 : 0));
243
246
      break;
244
247
 
245
248
    case 3: // Italic on
311
314
    case 30: case 31: case 32: case 33:
312
315
    case 34: case 35: case 36: case 37: // Foreground colour palette
313
316
      value = CSI_ARG(args[argi]) - 30;
314
 
      state->fg_index = value;
 
317
      state->pen.fg_index = value;
315
318
      if(state->pen.bold && state->bold_is_highbright)
316
319
        value += 8;
317
320
      set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
 
321
      setpenattr_int(state, VTERM_ATTR_FOREGROUND_INDEX, state->pen.fg_index);
318
322
      break;
319
323
 
320
324
    case 38: // Foreground colour alternative palette
321
 
      state->fg_index = -1;
 
325
      state->pen.fg_index = -1;
322
326
      if(argcount - argi < 1)
323
327
        return;
324
 
      argi += 1 + lookup_colour(state, CSI_ARG(args[argi+1]), args+argi+2, argcount-argi-2, &state->pen.fg, &state->fg_index);
 
328
      argi += 1 + lookup_colour(state, CSI_ARG(args[argi+1]), args+argi+2, argcount-argi-2, &state->pen.fg, &state->pen.fg_index);
325
329
      setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
 
330
      setpenattr_int(state, VTERM_ATTR_FOREGROUND_INDEX, state->pen.fg_index);
326
331
      break;
327
332
 
328
333
    case 39: // Foreground colour default
329
 
      state->fg_index = -1;
 
334
      state->pen.fg_index = -1;
330
335
      state->pen.fg = state->default_fg;
331
336
      setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
 
337
      setpenattr_int(state, VTERM_ATTR_FOREGROUND_INDEX, state->pen.fg_index);
332
338
      break;
333
339
 
334
340
    case 40: case 41: case 42: case 43:
335
341
    case 44: case 45: case 46: case 47: // Background colour palette
336
342
      value = CSI_ARG(args[argi]) - 40;
337
 
      state->bg_index = value;
 
343
      state->pen.bg_index = value;
338
344
      set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
 
345
      setpenattr_int(state, VTERM_ATTR_BACKGROUND_INDEX, state->pen.bg_index);
339
346
      break;
340
347
 
341
348
    case 48: // Background colour alternative palette
342
 
      state->bg_index = -1;
 
349
      state->pen.bg_index = -1;
343
350
      if(argcount - argi < 1)
344
351
        return;
345
 
      argi += 1 + lookup_colour(state, CSI_ARG(args[argi+1]), args+argi+2, argcount-argi-2, &state->pen.bg, &state->bg_index);
 
352
      argi += 1 + lookup_colour(state, CSI_ARG(args[argi+1]), args+argi+2, argcount-argi-2, &state->pen.bg, &state->pen.bg_index);
346
353
      setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
 
354
      setpenattr_int(state, VTERM_ATTR_BACKGROUND_INDEX, state->pen.bg_index);
347
355
      break;
348
356
 
349
357
    case 49: // Default background
350
 
      state->bg_index = -1;
 
358
      state->pen.bg_index = -1;
351
359
      state->pen.bg = state->default_bg;
352
360
      setpenattr_col(state, VTERM_ATTR_BACKGROUND, state->pen.bg);
 
361
      setpenattr_int(state, VTERM_ATTR_BACKGROUND_INDEX, state->pen.bg_index);
353
362
      break;
354
363
 
355
364
    case 90: case 91: case 92: case 93:
356
365
    case 94: case 95: case 96: case 97: // Foreground colour high-intensity palette
357
366
      value = CSI_ARG(args[argi]) - 90 + 8;
358
 
      state->fg_index = value;
 
367
      state->pen.fg_index = value;
359
368
      set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
 
369
      setpenattr_int(state, VTERM_ATTR_FOREGROUND_INDEX, state->pen.fg_index);
360
370
      break;
361
371
 
362
372
    case 100: case 101: case 102: case 103:
363
373
    case 104: case 105: case 106: case 107: // Background colour high-intensity palette
364
374
      value = CSI_ARG(args[argi]) - 100 + 8;
365
 
      state->bg_index = value;
 
375
      state->pen.bg_index = value;
366
376
      set_pen_col_ansi(state, VTERM_ATTR_BACKGROUND, value);
 
377
      setpenattr_int(state, VTERM_ATTR_BACKGROUND_INDEX, state->pen.bg_index);
367
378
      break;
368
379
 
369
380
    default:
406
417
  if(state->pen.underline == 2)
407
418
    args[argi++] = 21;
408
419
 
409
 
  if(state->fg_index >= 0 && state->fg_index < 8)
410
 
    args[argi++] = 30 + state->fg_index;
411
 
  else if(state->fg_index >= 8 && state->fg_index < 16)
412
 
    args[argi++] = 90 + state->fg_index - 8;
413
 
  else if(state->fg_index >= 16 && state->fg_index < 256) {
 
420
  if(state->pen.fg_index >= 0 && state->pen.fg_index < 8)
 
421
    args[argi++] = 30 + state->pen.fg_index;
 
422
  else if(state->pen.fg_index >= 8 && state->pen.fg_index < 16)
 
423
    args[argi++] = 90 + state->pen.fg_index - 8;
 
424
  else if(state->pen.fg_index >= 16 && state->pen.fg_index < 256) {
414
425
    args[argi++] = CSI_ARG_FLAG_MORE|38;
415
426
    args[argi++] = CSI_ARG_FLAG_MORE|5;
416
 
    args[argi++] = state->fg_index;
 
427
    args[argi++] = state->pen.fg_index;
417
428
  }
418
 
  else if(state->fg_index == -1) {
 
429
  else if(state->pen.fg_index == -2) {
419
430
    // Send palette 2 if the actual FG colour is not default
420
431
    if(state->pen.fg.red   != state->default_fg.red   ||
421
432
       state->pen.fg.green != state->default_fg.green ||
428
439
    }
429
440
  }
430
441
 
431
 
  if(state->bg_index >= 0 && state->bg_index < 8)
432
 
    args[argi++] = 40 + state->bg_index;
433
 
  else if(state->bg_index >= 8 && state->bg_index < 16)
434
 
    args[argi++] = 100 + state->bg_index - 8;
435
 
  else if(state->bg_index >= 16 && state->bg_index < 256) {
 
442
  if(state->pen.bg_index >= 0 && state->pen.bg_index < 8)
 
443
    args[argi++] = 40 + state->pen.bg_index;
 
444
  else if(state->pen.bg_index >= 8 && state->pen.bg_index < 16)
 
445
    args[argi++] = 100 + state->pen.bg_index - 8;
 
446
  else if(state->pen.bg_index >= 16 && state->pen.bg_index < 256) {
436
447
    args[argi++] = CSI_ARG_FLAG_MORE|48;
437
448
    args[argi++] = CSI_ARG_FLAG_MORE|5;
438
 
    args[argi++] = state->bg_index;
 
449
    args[argi++] = state->pen.bg_index;
439
450
  }
440
 
  else if(state->bg_index == -1) {
 
451
  else if(state->pen.bg_index == -2) {
441
452
    // Send palette 2 if the actual BG colour is not default
442
453
    if(state->pen.bg.red   != state->default_bg.red   ||
443
454
       state->pen.bg.green != state->default_bg.green ||
492
503
    val->color = state->pen.bg;
493
504
    return 1;
494
505
 
 
506
  case VTERM_ATTR_FOREGROUND_INDEX:
 
507
    val->number = state->pen.fg_index;
 
508
    return 1;
 
509
 
 
510
  case VTERM_ATTR_BACKGROUND_INDEX:
 
511
    val->number = state->pen.bg_index;
 
512
    return 1;
 
513
 
495
514
  case VTERM_N_ATTRS:
496
515
    return 0;
497
516
  }