/*
 * Copyright 2016 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "glimp/gles/pixel_format.h"

namespace glimp {
namespace gles {

namespace {

// Must match the ordering of the PixelFormat enum defined in pixel_format.h.
const int kBytesPerPixel[] = {
    4,  // kPixelFormatRGBA8
    4,  // kPixelFormatARGB8
    4,  // kPixelFormatBGRA8
    2,  // kPixelFormatRGB565
    2,  // kPixelFormatBA8
    1,  // kPixelFormatA8
};

}  // namespace

int BytesPerPixel(PixelFormat format) {
  SB_COMPILE_ASSERT(SB_ARRAY_SIZE(kBytesPerPixel) == kPixelFormatNumFormats,
                    kBytesPerPixel_has_entries_for_each_enum_PixelFormat);
  if (kPixelFormatInvalid == format) {
    return 0;  // Invalid formats have 0 bytes per pixel.
  }

  if (format < 0 || format >= kPixelFormatNumFormats) {
    SB_DCHECK(false) << "Invalid PixelFormat: " << format;
    return 0;
  }
  return kBytesPerPixel[format];
}

}  // namespace gles
}  // namespace glimp
