class PvrtcColorRgb {
  int r;
  int g;
  int b;

  PvrtcColorRgb([this.r = 0, this.g = 0, this.b = 0]);

  PvrtcColorRgb.from(PvrtcColorRgb other)
      : r = other.r
      , g = other.g
      , b = other.b;

  PvrtcColorRgb copy() => new PvrtcColorRgb.from(this);

  PvrtcColorRgb operator *(int x) =>
    new PvrtcColorRgb(r * x, g * x, b * x);

  PvrtcColorRgb operator +(PvrtcColorRgb x) =>
      new PvrtcColorRgb(r + x.r, g + x.g, b + x.b);

  PvrtcColorRgb operator -(PvrtcColorRgb x) =>
      new PvrtcColorRgb(r - x.r, g - x.g, b - x.b);

  int dotProd(PvrtcColorRgb x) => r * x.r + g * x.g + b * x.b;

  void setMin(PvrtcColorRgb c) {
    if (c.r < r) {
      r = c.r;
    }
    if (c.g < g) {
      g = c.g;
    }
    if (c.b < b) {
      b = c.b;
    }
  }

  void setMax(PvrtcColorRgb c) {
    if (c.r > r) {
      r = c.r;
    }
    if (c.g > g) {
      g = c.g;
    }
    if (c.b > b) {
      b = c.b;
    }
  }
}

class PvrtcColorRgba {
  int r;
  int g;
  int b;
  int a;

  PvrtcColorRgba([this.r = 0, this.g = 0, this.b = 0, this.a = 0]);

  PvrtcColorRgba.from(PvrtcColorRgba other)
      : r = other.r
      , g = other.g
      , b = other.b
      , a = other.a;

  PvrtcColorRgba copy() => new PvrtcColorRgba.from(this);

  PvrtcColorRgba operator *(int x) =>
    new PvrtcColorRgba(r * x, g * x, b * x, a * x);

  PvrtcColorRgba operator +(PvrtcColorRgba x) =>
      new PvrtcColorRgba(r + x.r, g + x.g, b + x.b, a + x.a);

  PvrtcColorRgba operator -(PvrtcColorRgba x) =>
      new PvrtcColorRgba(r - x.r, g - x.g, b - x.b, a - x.a);

  int dotProd(PvrtcColorRgba x) => r * x.r + g * x.g + b * x.b + a * x.a;

  void setMin(PvrtcColorRgba c) {
    if (c.r < r) {
      r = c.r;
    }
    if (c.g < g) {
      g = c.g;
    }
    if (c.b < b) {
      b = c.b;
    }
    if (c.a < a) {
      a = c.a;
    }
  }

  void setMax(PvrtcColorRgba c) {
    if (c.r > r) {
      r = c.r;
    }
    if (c.g > g) {
      g = c.g;
    }
    if (c.b > b) {
      b = c.b;
    }
    if (c.a > a) {
      a = c.a;
    }
  }
}
