// Copyright 2016 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "core/fpdfdoc/cpvt_color.h"

#include "core/fpdfapi/parser/cpdf_simple_parser.h"

// Static.
CPVT_Color CPVT_Color::ParseColor(const ByteString& str) {
  CPDF_SimpleParser syntax(str.AsStringView());
  if (syntax.FindTagParamFromStart("g", 1))
    return CPVT_Color(CPVT_Color::kGray, FX_atof(syntax.GetWord()));

  if (syntax.FindTagParamFromStart("rg", 3)) {
    float f1 = FX_atof(syntax.GetWord());
    float f2 = FX_atof(syntax.GetWord());
    float f3 = FX_atof(syntax.GetWord());
    return CPVT_Color(CPVT_Color::kRGB, f1, f2, f3);
  }
  if (syntax.FindTagParamFromStart("k", 4)) {
    float f1 = FX_atof(syntax.GetWord());
    float f2 = FX_atof(syntax.GetWord());
    float f3 = FX_atof(syntax.GetWord());
    float f4 = FX_atof(syntax.GetWord());
    return CPVT_Color(CPVT_Color::kCMYK, f1, f2, f3, f4);
  }
  return CPVT_Color(CPVT_Color::kTransparent);
}

// Static.
CPVT_Color CPVT_Color::ParseColor(const CPDF_Array& array) {
  CPVT_Color rt;
  switch (array.GetCount()) {
    case 1:
      rt = CPVT_Color(CPVT_Color::kGray, array.GetFloatAt(0));
      break;
    case 3:
      rt = CPVT_Color(CPVT_Color::kRGB, array.GetFloatAt(0),
                      array.GetFloatAt(1), array.GetFloatAt(2));
      break;
    case 4:
      rt = CPVT_Color(CPVT_Color::kCMYK, array.GetFloatAt(0),
                      array.GetFloatAt(1), array.GetFloatAt(2),
                      array.GetFloatAt(3));
      break;
  }
  return rt;
}
