toRgb method

Map<String, int> toRgb()

to convert ncs code to rgb

Implementation

Map<String,int> toRgb(){

  /// dddd-[char]dd[chart]
  RegExp regExp = RegExp(
    r"^(.* )?\d{4}-[rgby](\d{2}[rgby])?$",
    caseSensitive: false,
    multiLine: false,
  ) ;

  if(!regExp.hasMatch(ncsCode)){
    throw 'NCS color should be in the form\n####-(RGBY)[##(RGBY)]';
  }

  // ignore: prefer_typing_uninitialized_variables
  var black, chroma, bc, percent, black1, chroma1, red1,green1 , factor1, blue1, red2, green2, blue2, max, factor2, grey, r, g, b;
  String ncs = ncsCode;
  List<dynamic> parts = [];
  parts = ncs.split("-");
  black = int.parse(parts[0].toString().substring(0,2));//parseInt(ncs[1], 10);
  chroma = int.parse(parts[0].toString().substring(2));//pa// rseInt(ncs[2], 10);
  bc = parts[1].toString().substring(0,1);
  //if (bc != "N" && bc != "Y" && bc != "R" && bc != "B" && bc != "G") {return false;}
  percent = parts[1].toString().length > 2 ? int.parse(parts[1].toString().substring(1,3)) : 0;
  if (bc != 'N') {
    black1 = (1.05 * black - 5.25);
    chroma1 = chroma;
    if (bc == 'Y' && percent <= 60) {
      red1 = 1;
    } else if (( bc == 'Y' && percent > 60) || ( bc == 'R' && percent <= 80)) {
      if (bc == 'Y') {
        factor1 = percent - 60;
      } else {
        factor1 = percent + 40;
      }
      red1 = ((math.sqrt(14884 - math.pow(factor1, 2))) - 22) / 100;
    } else if ((bc == 'R' && percent > 80) || (bc == 'B')) {
      red1 = 0;
    } else if (bc == 'G') {
      factor1 = (percent - 170);
      red1 = ((math.sqrt(33800 - math.pow(factor1, 2))) - 70) / 100;
    }
    if (bc == 'Y' && percent <= 80) {
      blue1 = 0;
    } else if (( bc == 'Y' && percent > 80) || ( bc == 'R' && percent <= 60)) {
      if (bc =='Y') {
        factor1 = (percent - 80) + 20.5;
      } else {
        factor1 = (percent + 20) + 20.5;
      }
      blue1 = (104 - (math.sqrt(11236 - math.pow(factor1, 2)))) / 100;
    } else if ((bc == 'R' && percent > 60) || ( bc == 'B' && percent <= 80)) {
      if (bc =='R') {
        factor1 = (percent - 60) - 60;
      } else {
        factor1 = (percent + 40) - 60;
      }
      blue1 = ((math.sqrt(10000 - math.pow(factor1, 2))) - 10) / 100;
    } else if (( bc == 'B' && percent > 80) || ( bc == 'G' && percent <= 40)) {
      if (bc == 'B') {
        factor1 = (percent - 80) - 131;
      } else {
        factor1 = (percent + 20) - 131;
      }
      blue1 = (122 - (math.sqrt(19881 - math.pow(factor1, 2)))) / 100;
    } else if (bc == 'G' && percent > 40) {
      blue1 = 0;
    }
    if (bc == 'Y') {
      green1 = (85 - 17/20 * percent) / 100;
    } else if (bc == 'R' && percent <= 60) {
      green1 = 0;
    } else if (bc == 'R' && percent > 60) {
      factor1 = (percent - 60) + 35;
      green1 = (67.5 - (math.sqrt(5776 - math.pow(factor1, 2)))) / 100;
    } else if (bc == 'B' && percent <= 60) {
      factor1 = (1*percent - 68.5);
      green1 = (6.5 + (math.sqrt(7044.5 - math.pow(factor1, 2)))) / 100;
    } else if ((bc == 'B' && percent > 60) || ( bc == 'G' && percent <= 60)) {
      green1 = 0.9;
    } else if (bc == 'G' && percent > 60) {
      factor1 = (percent - 60);
      green1 = (90 - (1/8 * factor1)) / 100;
    }
    factor1 = (red1 + green1 + blue1)/3;
    red2 = ((factor1 - red1) * (100 - chroma1) / 100) + red1;
    green2 = ((factor1 - green1) * (100 - chroma1) / 100) + green1;
    blue2 = ((factor1 - blue1) * (100 - chroma1) / 100) + blue1;
    if (red2 > green2 && red2 > blue2) {
      max = red2;
    } else if (green2 > red2 && green2 > blue2) {
      max = green2;
    } else if (blue2 > red2 && blue2 > green2) {
      max = blue2;
    } else {
      max = (red2 + green2 + blue2) / 3;
    }
    factor2 = 1 / max;
    r = ((red2 * factor2 * (100 - black1) / 100)* 255).toInt();
    g = ((green2 * factor2 * (100 - black1) / 100) * 255).toInt();
    b = ((blue2 * factor2 * (100 - black1) / 100) * 255).toInt();
    if (r > 255) {r = 255;}
    if (g > 255) {g = 255;}
    if (b > 255) {b = 255;}
    if (r < 0) {r = 0;}
    if (g < 0) {g = 0;}
    if (b < 0) {b = 0;}
  } else {
    grey = int.parse(((1 - black / 100) * 255).toString());
    if (grey > 255) {grey = 255;}
    if (grey < 0) {grey = 0;}
    r = grey;
    g = grey;
    b = grey;
  }
  return {
    "r" : r,
    "g" : g,
    "b" : b
  };
}