// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "embedders/openglui/common/extension.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "embedders/openglui/common/canvas_context.h"
#include "embedders/openglui/common/graphics_handler.h"
#include "embedders/openglui/common/log.h"
#include "embedders/openglui/common/opengl.h"
#include "include/dart_api.h"

Dart_Handle HandleError(Dart_Handle handle) {
  if (Dart_IsError(handle)) Dart_PropagateError(handle);
  return handle;
}

void CheckGLError(const char *function) {
  int error = glGetError();
  if (error != GL_NO_ERROR) {
    if (error == GL_INVALID_ENUM) {
      LOGE("%s: An unacceptable value is given for an enumerated argument.",
           function);
    } else if (error == GL_INVALID_VALUE) {
      LOGE("%s: A numeric argument is out of range.", function);
    } else if (error == GL_INVALID_OPERATION) {
      LOGE("%s: The specified operation is not allowed in the current state.",
           function);
    } else if (error == GL_INVALID_FRAMEBUFFER_OPERATION) {
      LOGE("%s: The framebuffer object is not complete.", function);
    } else if (error == GL_OUT_OF_MEMORY) {
      LOGE("%s: There is not enough memory left to execute the command.",
          function);
    } else {
      LOGE("ERROR!: %s returns %d", function, error);
    }
  }
}

const char* GetArgAsString(Dart_NativeArguments arguments, int idx) {
  Dart_Handle whatHandle = HandleError(Dart_GetNativeArgument(arguments, idx));
  uint8_t* str;
  intptr_t length;
  HandleError(Dart_StringLength(whatHandle, &length));
  HandleError(Dart_StringToUTF8(whatHandle, &str, &length));
  str[length] = 0;
  return  const_cast<const char*>(reinterpret_cast<char*>(str));
}

double GetArgAsDouble(Dart_NativeArguments arguments, int index) {
  Dart_Handle handle = HandleError(Dart_GetNativeArgument(arguments, index));
  if (Dart_IsDouble(handle)) {
    double v;
    HandleError(Dart_DoubleValue(handle, &v));
    return v;
  }
  if (Dart_IsInteger(handle)) {
    int64_t v;
    HandleError(Dart_IntegerToInt64(handle, &v));
    return static_cast<double>(v);
  }
  LOGE("Argument at index %d has non-numeric type", index);
  Dart_ThrowException(Dart_NewStringFromCString("Numeric argument expected."));
  return 0;
}

int64_t GetArgAsInt(Dart_NativeArguments arguments, int index) {
  Dart_Handle handle = HandleError(Dart_GetNativeArgument(arguments, index));
  if (Dart_IsDouble(handle)) {
    double v;
    HandleError(Dart_DoubleValue(handle, &v));
    return static_cast<int64_t>(v);
  }
  if (Dart_IsInteger(handle)) {
    int64_t v;
    HandleError(Dart_IntegerToInt64(handle, &v));
    return v;
  }
  LOGE("Argument at index %d has non-numeric type", index);
  Dart_ThrowException(Dart_NewStringFromCString("Numeric argument expected."));
  return 0;
}

bool GetArgAsBool(Dart_NativeArguments arguments, int index) {
  Dart_Handle handle = HandleError(Dart_GetNativeArgument(arguments, index));
  if (Dart_IsBoolean(handle)) {
    bool v;
    HandleError(Dart_BooleanValue(handle, &v));
    return v;
  }
  LOGI("Argument at index %d has non-Boolean type", index);
  Dart_ThrowException(Dart_NewStringFromCString("Boolean argument expected."));
  return false;
}

GLint* GetArgsAsGLintList(Dart_NativeArguments arguments, int index,
                          int* len_out) {
  Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, index));
  if (Dart_IsList(argHandle)) {
    intptr_t len;
    HandleError(Dart_ListLength(argHandle, &len));
    GLint* list = new GLint[len];
    for (int i = 0; i < len; i++) {
      Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
      int64_t v;
      HandleError(Dart_IntegerToInt64(vHandle, &v));
      list[i] = v;
    }
    *len_out = len;
    return list;
  }
  LOGI("Argument at index %d has non-List type", index);
  Dart_ThrowException(Dart_NewStringFromCString("List argument expected."));
  return NULL;
}

GLfloat* GetArgsAsFloatList(Dart_NativeArguments arguments, int index,
                            int* len_out) {
  Dart_Handle locationHandle =
      HandleError(Dart_GetNativeArgument(arguments, 0));
  int64_t location;
  HandleError(Dart_IntegerToInt64(locationHandle, &location));

  Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));

  if (Dart_IsList(argHandle)) {
    intptr_t len;
    HandleError(Dart_ListLength(argHandle, &len));
    GLfloat* list = new GLfloat[len];
    for (int i = 0; i < len; i++) {
      Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
      double v;
      HandleError(Dart_DoubleValue(vHandle, &v));
      list[i] = v;
    }
    *len_out = len;
    return list;
  }
  LOGI("Argument at index %d has non-List type", index);
  Dart_ThrowException(Dart_NewStringFromCString("List argument expected."));
  return NULL;
}

void SetBoolReturnValue(Dart_NativeArguments arguments, bool b) {
  Dart_Handle result = HandleError(Dart_NewBoolean(b));
  Dart_SetReturnValue(arguments, result);
}

void SetIntReturnValue(Dart_NativeArguments arguments, int v) {
  Dart_Handle result = HandleError(Dart_NewInteger(v));
  Dart_SetReturnValue(arguments, result);
}

void SetDoubleReturnValue(Dart_NativeArguments arguments, double v) {
  Dart_Handle result = HandleError(Dart_NewDouble(v));
  Dart_SetReturnValue(arguments, result);
}

void SetStringReturnValue(Dart_NativeArguments arguments, const char* s) {
  Dart_Handle result = HandleError(Dart_NewStringFromCString(s));
  Dart_SetReturnValue(arguments, result);
}

void Log(Dart_NativeArguments arguments) {
  Dart_EnterScope();
  LOGI("%s", GetArgAsString(arguments, 0));
  Dart_ExitScope();
}

void LogError(Dart_NativeArguments arguments) {
  Dart_EnterScope();
  LOGE("%s", GetArgAsString(arguments, 0));
  Dart_ExitScope();
}

void SystemRand(Dart_NativeArguments arguments) {
  Dart_EnterScope();
  SetIntReturnValue(arguments, rand());
  Dart_ExitScope();
}

void SystemSrand(Dart_NativeArguments arguments) {
  Dart_EnterScope();
  bool success = false;
  Dart_Handle seed_object = HandleError(Dart_GetNativeArgument(arguments, 0));
  if (Dart_IsInteger(seed_object)) {
    bool fits;
    HandleError(Dart_IntegerFitsIntoInt64(seed_object, &fits));
    if (fits) {
      int64_t seed;
      HandleError(Dart_IntegerToInt64(seed_object, &seed));
      srand(static_cast<unsigned>(seed));
      success = true;
    }
  }
  SetBoolReturnValue(arguments, success);
  Dart_ExitScope();
}

void GetDeviceScreenWidth(Dart_NativeArguments arguments) {
  LOGI("GetDeviceScreenWidth");
  Dart_EnterScope();
  SetIntReturnValue(arguments, graphics->width());
  Dart_ExitScope();
}

void GetDeviceScreenHeight(Dart_NativeArguments arguments) {
  LOGI("GetDeviceScreenHeight");
  Dart_EnterScope();
  SetIntReturnValue(arguments, graphics->height());
  Dart_ExitScope();
}

void SwapBuffers(Dart_NativeArguments arguments) {
  LOGI("SwapBuffers");
  Dart_EnterScope();
  GLSwapBuffers();
  CheckGLError("GLSwapBuffers");
  Dart_ExitScope();
}

void GLAttachShader(Dart_NativeArguments arguments) {
  LOGI("GLAttachShader");
  Dart_EnterScope();

  int64_t program = GetArgAsInt(arguments, 0);
  int64_t shader = GetArgAsInt(arguments, 1);

  glAttachShader(program, shader);
  CheckGLError("glAttachShader");
  Dart_ExitScope();
}

void GLBindBuffer(Dart_NativeArguments arguments) {
  LOGI("GLBindBuffer");
  Dart_EnterScope();

  int64_t target = GetArgAsInt(arguments, 0);
  int64_t buffer = GetArgAsInt(arguments, 1);

  glBindBuffer(target, buffer);
  CheckGLError("glBindBuffer");
  Dart_ExitScope();
}

void GLBufferData(Dart_NativeArguments arguments) {
  LOGI("GLBufferData");
  Dart_EnterScope();

  int64_t target = GetArgAsInt(arguments, 0);

  Dart_Handle dataHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
  intptr_t size;
  HandleError(Dart_ListLength(dataHandle, &size));

  LOGI("Size: %d", static_cast<int>(size));

  // TODO(vsm): No guarantee that this is a float!
  float* data = new float[size];
  for (int i = 0; i < size; i++) {
    Dart_Handle elemHandle = HandleError(Dart_ListGetAt(dataHandle, i));
    double value;
    Dart_DoubleValue(elemHandle, &value);
    data[i] = static_cast<float>(value);
    LOGI("Value[%d]: %f", i, data[i]);
  }

  Dart_Handle usageHandle = HandleError(Dart_GetNativeArgument(arguments, 2));
  int64_t usage;
  HandleError(Dart_IntegerToInt64(usageHandle, &usage));

  glBufferData(target, size * sizeof(data[0]), data, usage);
  CheckGLError("glBufferData");
  delete[] data;
  Dart_ExitScope();
}

void GLCompileShader(Dart_NativeArguments arguments) {
  LOGI("GLCompileShader");
  Dart_EnterScope();
  int64_t shader = GetArgAsInt(arguments, 0);
  glCompileShader(shader);
  CheckGLError("glCompileShader");
  Dart_ExitScope();
}

void GLCreateBuffer(Dart_NativeArguments arguments) {
  LOGI("GLCreateBuffer");
  Dart_EnterScope();
  GLuint buffer;
  glGenBuffers(1, &buffer);
  CheckGLError("glGenBuffers");
  SetIntReturnValue(arguments, buffer);
  Dart_ExitScope();
}

void GLCreateProgram(Dart_NativeArguments arguments) {
  LOGI("GLCreateProgram");
  Dart_EnterScope();
  int64_t program = glCreateProgram();
  CheckGLError("glCreateProgram");
  SetIntReturnValue(arguments, program);
  Dart_ExitScope();
}

void GLCreateShader(Dart_NativeArguments arguments) {
  LOGI("GLCreateShader");
  Dart_EnterScope();
  int64_t type = GetArgAsInt(arguments, 0);
  int64_t shader = glCreateShader((GLenum)type);
  CheckGLError("glCreateShader");
  SetIntReturnValue(arguments, shader);
  Dart_ExitScope();
}

void GLDrawArrays(Dart_NativeArguments arguments) {
  LOGI("GLDrawArrays");
  Dart_EnterScope();

  int64_t mode = GetArgAsInt(arguments, 0);
  int64_t first = GetArgAsInt(arguments, 1);
  int64_t count = GetArgAsInt(arguments, 2);

  glDrawArrays(mode, first, count);
  CheckGLError("glDrawArrays");
  Dart_ExitScope();
  LOGI("Done GLDrawArrays");
}

void GLEnableVertexAttribArray(Dart_NativeArguments arguments) {
  LOGI("GLEnableVertexAttribArray");
  Dart_EnterScope();

  int64_t location = GetArgAsInt(arguments, 0);

  glEnableVertexAttribArray(location);
  CheckGLError("glEnableVertexAttribArray");
  Dart_ExitScope();
}

void GLGetAttribLocation(Dart_NativeArguments arguments) {
  LOGI("GLGetAttribLocation");
  Dart_EnterScope();

  int64_t program = GetArgAsInt(arguments, 0);

  Dart_Handle nameHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
  intptr_t length;
  HandleError(Dart_StringLength(nameHandle, &length));
  uint8_t* str;
  HandleError(Dart_StringToUTF8(nameHandle, &str, &length));
  str[length] = 0;

  int64_t location = glGetAttribLocation(program,
      const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str)));
  CheckGLError("glGetAttribLocation");
  SetIntReturnValue(arguments, location);
  Dart_ExitScope();
}

void GLGetError(Dart_NativeArguments arguments) {
  LOGI("GLGetError");
  Dart_EnterScope();
  SetIntReturnValue(arguments, glGetError());
  Dart_ExitScope();
}

void GLGetProgramParameter(Dart_NativeArguments arguments) {
  LOGI("GLGetProgramParameter");
  Dart_EnterScope();

  int64_t program = GetArgAsInt(arguments, 0);
  int64_t param = GetArgAsInt(arguments, 1);

  GLint value = -1;
  glGetProgramiv(program, param, &value);
  CheckGLError("glGetProgramiv");

  SetIntReturnValue(arguments, value);
  Dart_ExitScope();
}

void GLGetShaderParameter(Dart_NativeArguments arguments) {
  LOGI("GLGetShaderParameter");
  Dart_EnterScope();

  int64_t shader = GetArgAsInt(arguments, 0);
  int64_t param = GetArgAsInt(arguments, 1);

  GLint value = -1;
  glGetShaderiv((GLuint)shader, (GLenum)param, &value);
  CheckGLError("glGetShaderiv");

  SetIntReturnValue(arguments, value);
  Dart_ExitScope();
}

void GLGetShaderInfoLog(Dart_NativeArguments arguments) {
  LOGI("GLGetShaderInfoLog");
  Dart_EnterScope();

  int64_t shader = GetArgAsInt(arguments, 0);

  GLint infoLogLength = 0;
  glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
  GLchar* strInfoLog = new GLchar[infoLogLength + 1];
  glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
  strInfoLog[infoLogLength] = 0;

  SetStringReturnValue(arguments, strInfoLog);
  Dart_ExitScope();
  delete[] strInfoLog;
}

void GLGetProgramInfoLog(Dart_NativeArguments arguments) {
  LOGI("GLGetProgramInfoLog");
  Dart_EnterScope();

  int64_t program = GetArgAsInt(arguments, 0);

  GLint infoLogLength;
  glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);

  GLchar* strInfoLog = new GLchar[infoLogLength + 1];
  glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog);
  strInfoLog[infoLogLength] = 0;

  SetStringReturnValue(arguments, strInfoLog);
  Dart_ExitScope();
  delete[] strInfoLog;
}

void GLGetUniformLocation(Dart_NativeArguments arguments) {
  LOGI("GLGetUniformLocation");
  Dart_EnterScope();

  int64_t program = GetArgAsInt(arguments, 0);


  Dart_Handle nameHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
  intptr_t length;
  HandleError(Dart_StringLength(nameHandle, &length));
  uint8_t* str;
  HandleError(Dart_StringToUTF8(nameHandle, &str, &length));
  str[length] = 0;

  int64_t location = glGetUniformLocation(program,
      const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str)));
  CheckGLError("glGetUniformLocation");
  SetIntReturnValue(arguments, location);
  Dart_ExitScope();
}

void GLLinkProgram(Dart_NativeArguments arguments) {
  LOGI("GLLinkProgram");
  Dart_EnterScope();
  int64_t program = GetArgAsInt(arguments, 0);
  glLinkProgram(program);
  CheckGLError("glLinkProgram");
  Dart_ExitScope();
}

void GLShaderSource(Dart_NativeArguments arguments) {
  LOGI("GLShaderSource");
  Dart_EnterScope();

  int64_t shader = GetArgAsInt(arguments, 0);

  Dart_Handle sourceHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
  intptr_t length[1];
  HandleError(Dart_StringLength(sourceHandle, length));
  LOGI("Source length is %d", static_cast<int>(length[0]));
  uint8_t* str[1];
  HandleError(Dart_StringToUTF8(sourceHandle, &str[0], length));
  LOGI("Converted length is %d", static_cast<int>(length[0]));
  str[0][*length] = 0;

  const GLchar* source =
      const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str[0]));
  LOGI("Source: %s", source);
  glShaderSource(shader, 1,
      const_cast<const GLchar**>(reinterpret_cast<GLchar**>(str)), NULL);
  CheckGLError("glShaderSource");
  Dart_ExitScope();
}

void GLUseProgram(Dart_NativeArguments arguments) {
  LOGI("GLUseProgram");
  Dart_EnterScope();
  int64_t program = GetArgAsInt(arguments, 0);
  glUseProgram(program);
  CheckGLError("glUseProgram");
  Dart_ExitScope();
}

void GLUniform1i(Dart_NativeArguments arguments) {
  LOGI("GLUniform1i");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int64_t v0 = GetArgAsInt(arguments, 1);
  glUniform1i(location, v0);
  CheckGLError("glUniform1i");
  Dart_ExitScope();
}

void GLUniform2i(Dart_NativeArguments arguments) {
  LOGI("GLUniform2i");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int64_t v0 = GetArgAsInt(arguments, 1);
  int64_t v1 = GetArgAsInt(arguments, 2);
  glUniform2i(location, v0, v1);
  CheckGLError("glUniform2i");
  Dart_ExitScope();
}

void GLUniform3i(Dart_NativeArguments arguments) {
  LOGI("GLUniform3i");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int64_t v0 = GetArgAsInt(arguments, 1);
  int64_t v1 = GetArgAsInt(arguments, 2);
  int64_t v2 = GetArgAsInt(arguments, 3);
  glUniform3i(location, v0, v1, v2);
  CheckGLError("glUniform3i");
  Dart_ExitScope();
}

void GLUniform4i(Dart_NativeArguments arguments) {
  LOGI("GLUniform4i");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int64_t v0 = GetArgAsInt(arguments, 1);
  int64_t v1 = GetArgAsInt(arguments, 2);
  int64_t v2 = GetArgAsInt(arguments, 3);
  int64_t v3 = GetArgAsInt(arguments, 4);
  glUniform4i(location, v0, v1, v2, v3);
  CheckGLError("glUniform4i");
  Dart_ExitScope();
}

void GLUniform1f(Dart_NativeArguments arguments) {
  LOGI("GLUniform1f");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  double v0 = GetArgAsDouble(arguments, 1);
  glUniform1f(location, v0);
  CheckGLError("glUniform1f");
  Dart_ExitScope();
}

void GLUniform2f(Dart_NativeArguments arguments) {
  LOGI("GLUniform2f");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  double v0 = GetArgAsDouble(arguments, 1);
  double v1 = GetArgAsDouble(arguments, 2);
  glUniform2f(location, v0, v1);
  CheckGLError("glUniform2f");
  Dart_ExitScope();
}

void GLUniform3f(Dart_NativeArguments arguments) {
  LOGI("GLUniform3f");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  double v0 = GetArgAsDouble(arguments, 1);
  double v1 = GetArgAsDouble(arguments, 2);
  double v2 = GetArgAsDouble(arguments, 3);
  glUniform3f(location, v0, v1, v2);
  CheckGLError("glUniform3f");
  Dart_ExitScope();
}

void GLUniform4f(Dart_NativeArguments arguments) {
  LOGI("GLUniform4f");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  double v0 = GetArgAsDouble(arguments, 1);
  double v1 = GetArgAsDouble(arguments, 2);
  double v2 = GetArgAsDouble(arguments, 3);
  double v3 = GetArgAsDouble(arguments, 4);
  glUniform4f(location, v0, v1, v2, v3);
  CheckGLError("glUniform4f");
  Dart_ExitScope();
}

void GLUniform1iv(Dart_NativeArguments arguments) {
  LOGI("GLUniform1iv");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int len;
  GLint* list = GetArgsAsGLintList(arguments, 1, &len);
  if (list != NULL) {
    glUniform1iv(location, len, list);
    delete [] list;
    CheckGLError("glUniform1iv");
  }
  Dart_ExitScope();
}

void GLUniform2iv(Dart_NativeArguments arguments) {
  LOGI("GLUniform2iv");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int len;
  GLint* list = GetArgsAsGLintList(arguments, 1, &len);
  if (list != NULL) {
    glUniform2iv(location, len / 2, list);
    delete [] list;
    CheckGLError("glUniform2iv");
  }
  Dart_ExitScope();
}

void GLUniform3iv(Dart_NativeArguments arguments) {
  LOGI("GLUniform3iv");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int len;
  GLint* list = GetArgsAsGLintList(arguments, 1, &len);
  if (list != NULL) {
    glUniform3iv(location, len / 3, list);
    delete [] list;
    CheckGLError("glUniform3iv");
  }
  Dart_ExitScope();
}

void GLUniform4iv(Dart_NativeArguments arguments) {
  LOGI("GLUniform4iv");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int len;
  GLint* list = GetArgsAsGLintList(arguments, 1, &len);
  if (list != NULL) {
    glUniform1iv(location, len / 4, list);
    delete [] list;
    CheckGLError("glUniform4iv");
  }
  Dart_ExitScope();
}

void GLUniform1fv(Dart_NativeArguments arguments) {
  LOGI("GLUniform1fv");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int len;
  GLfloat* list = GetArgsAsFloatList(arguments, 1, &len);
  if (list != NULL) {
    glUniform1fv(location, len, list);
    delete [] list;
    CheckGLError("glUniform1fv");
  }
  Dart_ExitScope();
}

void GLUniform2fv(Dart_NativeArguments arguments) {
  LOGI("GLUniform2fv");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int len;
  GLfloat* list = GetArgsAsFloatList(arguments, 1, &len);
  if (list != NULL) {
    glUniform2fv(location, len / 2, list);
    delete [] list;
    CheckGLError("glUniform2fv");
  }
  Dart_ExitScope();
}

void GLUniform3fv(Dart_NativeArguments arguments) {
  LOGI("GLUniform3fv");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int len;
  GLfloat* list = GetArgsAsFloatList(arguments, 1, &len);
  if (list != NULL) {
    glUniform3fv(location, len / 3, list);
    delete [] list;
    CheckGLError("glUniform3fv");
  }
  Dart_ExitScope();
}

void GLUniform4fv(Dart_NativeArguments arguments) {
  LOGI("In GLUniform4fv");
  Dart_EnterScope();
  int64_t location = GetArgAsInt(arguments, 0);
  int len;
  GLfloat* list = GetArgsAsFloatList(arguments, 1, &len);
  if (list != NULL) {
    glUniform4fv(location, len / 4, list);
    delete [] list;
    CheckGLError("glUniform4fv");
  }
  Dart_ExitScope();
}

void GLViewport(Dart_NativeArguments arguments) {
  LOGI("GLViewport");
  Dart_EnterScope();
  int64_t x = GetArgAsInt(arguments, 0);
  int64_t y = GetArgAsInt(arguments, 1);
  int64_t width = GetArgAsInt(arguments, 2);
  int64_t height = GetArgAsInt(arguments, 3);
  glViewport(x, y, width, height);
  CheckGLError("glViewPort");
  Dart_ExitScope();
}

void GLVertexAttribPointer(Dart_NativeArguments arguments) {
  LOGI("GLVertexAttribPointer");
  Dart_EnterScope();
  int64_t index = GetArgAsInt(arguments, 0);
  int64_t size = GetArgAsInt(arguments, 1);
  int64_t type = GetArgAsInt(arguments, 2);
  bool normalized = GetArgAsBool(arguments, 3);
  int64_t stride = GetArgAsInt(arguments, 4);

  Dart_Handle pointerHandle = HandleError(Dart_GetNativeArgument(arguments, 5));
  int64_t pointerValue;
  HandleError(Dart_IntegerToInt64(pointerHandle, &pointerValue));
  const void* pointer;
  pointer = const_cast<const void*>(reinterpret_cast<void*>(pointerValue));

  glVertexAttribPointer(index, size, type, normalized, stride, pointer);
  CheckGLError("glVertexAttribPointer");
  Dart_ExitScope();
}

void GLClearColor(Dart_NativeArguments arguments) {
  LOGI("GLClearColor");
  Dart_EnterScope();
  double red = GetArgAsDouble(arguments, 0);
  double green = GetArgAsDouble(arguments, 1);
  double blue = GetArgAsDouble(arguments, 2);
  double alpha = GetArgAsDouble(arguments, 3);
  glClearColor(red, green, blue, alpha);
  CheckGLError("glClearColor");
  Dart_ExitScope();
}

void GLClearDepth(Dart_NativeArguments arguments) {
  LOGI("GLClearDepth");
  Dart_EnterScope();
  double depth = GetArgAsDouble(arguments, 0);
#if defined(__ANDROID__)
  glClearDepthf(depth);
#else
  glClearDepth(depth);
#endif
  CheckGLError("glClearDepth");
  Dart_ExitScope();
}

void GLClear(Dart_NativeArguments arguments) {
  LOGI("GLClear");
  Dart_EnterScope();
  Dart_Handle maskHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
  int64_t mask;
  HandleError(Dart_IntegerToInt64(maskHandle, &mask));
  glClear(mask);
  CheckGLError("glClear");
  Dart_ExitScope();
}

void ReturnGLIntConstant(Dart_NativeArguments arguments, int c) {
  Dart_EnterScope();
  SetIntReturnValue(arguments, c);
  Dart_ExitScope();
}

void GLArrayBuffer(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_ARRAY_BUFFER);
}

void GLColorBufferBit(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_COLOR_BUFFER_BIT);
}

void GLCompileStatus(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_COMPILE_STATUS);
}

void GLDeleteStatus(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_DELETE_STATUS);
}

void GLDepthBufferBit(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_DEPTH_BUFFER_BIT);
}

void GLFloat(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_FLOAT);
}

void GLFragmentShader(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_FRAGMENT_SHADER);
}

void GLLinkStatus(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_LINK_STATUS);
}

void GLStaticDraw(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_STATIC_DRAW);
}

void GLTriangleStrip(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_TRIANGLE_STRIP);
}

void GLTriangles(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_TRIANGLES);
}

void GLTrue(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_TRUE);
}

void GLValidateStatus(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_VALIDATE_STATUS);
}

void GLVertexShader(Dart_NativeArguments arguments) {
  ReturnGLIntConstant(arguments, GL_VERTEX_SHADER);
}

uint8_t* RandomArray(int seed, int length) {
  if (length <= 0 || length > 10000000) return NULL;
  uint8_t* values = reinterpret_cast<uint8_t*>(malloc(length));
  if (NULL == values) return NULL;
  srand(seed);
  for (int i = 0; i < length; ++i) {
    values[i] = rand() % 256;
  }
  return values;
}

void WrappedRandomArray(Dart_Port dest_port_id,
                        Dart_Port reply_port_id,
                        Dart_CObject* message) {
  if (message->type == Dart_CObject::kArray &&
      2 == message->value.as_array.length) {
    // Use .as_array and .as_int32 to access the data in the Dart_CObject.
    Dart_CObject* param0 = message->value.as_array.values[0];
    Dart_CObject* param1 = message->value.as_array.values[1];
    if (param0->type == Dart_CObject::kInt32 &&
        param1->type == Dart_CObject::kInt32) {
      int length = param0->value.as_int32;
      int seed = param1->value.as_int32;

      uint8_t* values = RandomArray(seed, length);

      if (values != NULL) {
        Dart_CObject result;
        result.type = Dart_CObject::kUint8Array;
        result.value.as_byte_array.values = values;
        result.value.as_byte_array.length = length;
        Dart_PostCObject(reply_port_id, &result);
        free(values);
        // It is OK that result is destroyed when function exits.
        // Dart_PostCObject has copied its data.
        return;
      }
    }
  }
  Dart_CObject result;
  result.type = Dart_CObject::kNull;
  Dart_PostCObject(reply_port_id, &result);
}

void RandomArrayServicePort(Dart_NativeArguments arguments) {
  Dart_EnterScope();
  Dart_SetReturnValue(arguments, Dart_Null());
  Dart_Port service_port =
      Dart_NewNativePort("RandomArrayService", WrappedRandomArray, true);
  if (service_port != ((Dart_Port)0)) {
    Dart_Handle send_port = HandleError(Dart_NewSendPort(service_port));
    Dart_SetReturnValue(arguments, send_port);
  }
  Dart_ExitScope();
}

void PlayBackground(Dart_NativeArguments arguments) {
  LOGI("PlayBackground");
  Dart_EnterScope();
  const char* what = GetArgAsString(arguments, 0);
  int rtn = PlayBackgroundSound(what);
  SetIntReturnValue(arguments, rtn);
  Dart_ExitScope();
}

void StopBackground(Dart_NativeArguments arguments) {
  LOGI("StopBackground");
  Dart_EnterScope();
  StopBackgroundSound();
  Dart_ExitScope();
}

void LoadSample(Dart_NativeArguments arguments) {
  LOGI("LoadSample");
  Dart_EnterScope();
  const char* what = GetArgAsString(arguments, 0);
  int rtn = LoadSoundSample(what);
  SetIntReturnValue(arguments, rtn);
  Dart_ExitScope();
}

void PlaySample(Dart_NativeArguments arguments) {
  LOGI("PlaySample");
  Dart_EnterScope();
  const char* what = GetArgAsString(arguments, 0);
  int rtn = PlaySoundSample(what);
  SetIntReturnValue(arguments, rtn);
  Dart_ExitScope();
}

// 2D Canvas.

CanvasContext* display_context;

void C2DCreateNativeContext(Dart_NativeArguments arguments) {
  LOGI("In C2DCreateNativeContext");
  Dart_EnterScope();

  int handle = GetArgAsInt(arguments, 0);
  int width = GetArgAsInt(arguments, 1);
  int height = GetArgAsInt(arguments, 2);

  CanvasContext* rtn = new CanvasContext(handle, width, height);
  if (display_context == NULL) {
    display_context = rtn;
  }
  Dart_ExitScope();
  LOGI("Out C2DCreateNativeContext");
}

void C2DSetWidth(Dart_NativeArguments arguments) {
  LOGI("In C2DSetWidth");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  int width = GetArgAsInt(arguments, 1);
  SetIntReturnValue(arguments, Context2D(handle)->setWidth(width));
  Dart_ExitScope();
  LOGI("Out C2DSetWidth");
}

void C2DSetHeight(Dart_NativeArguments arguments) {
  LOGI("In C2DSetHeight");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  int height = GetArgAsInt(arguments, 1);
  SetIntReturnValue(arguments, Context2D(handle)->setHeight(height));
  Dart_ExitScope();
  LOGI("Out C2DSetHeight");
}

void C2DSetGlobalAlpha(Dart_NativeArguments arguments) {
  LOGI("In C2DSetGlobalAlpha");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double alpha = GetArgAsDouble(arguments, 1);
  alpha = MIN(1.0, MAX(alpha, 0.0));
  Context2D(handle)->setGlobalAlpha(alpha);
  SetDoubleReturnValue(arguments, alpha);
  Dart_ExitScope();
  LOGI("Out C2DSetGlobalAlpha");
}

void C2DSetFillStyle(Dart_NativeArguments arguments) {
  LOGI("In C2DSetFillStyle");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  Dart_Handle whatHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
  if (Dart_IsString(whatHandle)) {
    const char* color = GetArgAsString(arguments, 1);
    Context2D(handle)->setFillColor(color);
  } else {  // Texture from gradient or image.
  }
  Dart_ExitScope();
  LOGI("Out C2DSetFillStyle");
}

void C2DSetFont(Dart_NativeArguments arguments) {
  LOGI("In C2DSetFont");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* font = GetArgAsString(arguments, 1);
  SetStringReturnValue(arguments, Context2D(handle)->setFont(font));
  Dart_ExitScope();
  LOGI("Out C2DSetFont");
}

void C2DSetGlobalCompositeOperation(Dart_NativeArguments arguments) {
  LOGI("In C2DSetGlobalCompositeOperation");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* op = GetArgAsString(arguments, 1);
  Context2D(handle)->setGlobalCompositeOperation(op);
  Dart_ExitScope();
  LOGI("Out C2DSetGlobalCompositeOperation");
}

void C2DSetLineCap(Dart_NativeArguments arguments) {
  LOGI("In C2DSetLineCap");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* lc = GetArgAsString(arguments, 1);
  Context2D(handle)->setLineCap(lc);
  Dart_ExitScope();
  LOGI("Out C2DSetLineCap");
}

void C2DSetLineJoin(Dart_NativeArguments arguments) {
  LOGI("In C2DSetLineJoin");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* lj = GetArgAsString(arguments, 1);
  Context2D(handle)->setLineJoin(lj);
  Dart_ExitScope();
  LOGI("Out C2DSetLineJoin");
}

void C2DSetLineWidth(Dart_NativeArguments arguments) {
  LOGI("In C2DSetLineWidth");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double w = GetArgAsDouble(arguments, 1);
  Context2D(handle)->setLineWidth(w);
  Dart_ExitScope();
  LOGI("Out C2DSetLineWidth");
}

void C2DSetMiterLimit(Dart_NativeArguments arguments) {
  LOGI("In C2DSetMiterLimit");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double w = GetArgAsDouble(arguments, 1);
  Context2D(handle)->setMiterLimit(w);
  Dart_ExitScope();
  LOGI("Out C2DSetMiterLimit");
}

void C2DSetShadowBlur(Dart_NativeArguments arguments) {
  LOGI("In C2DSetShadowBlur");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double blur = GetArgAsDouble(arguments, 1);
  Context2D(handle)->setShadowBlur(blur);
  Dart_ExitScope();
  LOGI("Out C2DSetShadowBlur");
}

void C2DSetShadowColor(Dart_NativeArguments arguments) {
  LOGI("In C2DSetShadowColor");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* color = GetArgAsString(arguments, 1);
  Context2D(handle)->setShadowColor(color);
  Dart_ExitScope();
  LOGI("Out C2DSetShadowColor");
}

void C2DSetShadowOffsetX(Dart_NativeArguments arguments) {
  LOGI("In C2DSetShadowOffsetX");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double offset = GetArgAsDouble(arguments, 1);
  Context2D(handle)->setShadowOffsetX(offset);
  Dart_ExitScope();
  LOGI("Out C2DSetShadowOffsetX");
}

void C2DSetShadowOffsetY(Dart_NativeArguments arguments) {
  LOGI("In C2DSetShadowOffsetY");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double offset = GetArgAsDouble(arguments, 1);
  Context2D(handle)->setShadowOffsetY(offset);
  Dart_ExitScope();
  LOGI("Out C2DSetShadowOffsetY");
}

void C2DSetStrokeStyle(Dart_NativeArguments arguments) {
  LOGI("In C2DSetStrokeStyle");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* color = GetArgAsString(arguments, 1);
  Context2D(handle)->setStrokeColor(color);
  Dart_ExitScope();
  LOGI("Out C2DSetStrokeStyle");
}

void C2DSetTextAlign(Dart_NativeArguments arguments) {
  LOGI("In C2DSetTextAlign");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* align = GetArgAsString(arguments, 1);
  SetStringReturnValue(arguments, Context2D(handle)->setTextAlign(align));
  Dart_ExitScope();
  LOGI("Out C2DSetTextAlign");
}

void C2DSetTextBaseline(Dart_NativeArguments arguments) {
  LOGI("In C2DSetTextBaseline");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* baseline = GetArgAsString(arguments, 1);
  SetStringReturnValue(arguments, Context2D(handle)->setTextBaseline(baseline));
  Dart_ExitScope();
  LOGI("Out C2DSetTextBaseline");
}

void C2DGetImageSmoothingEnabled(Dart_NativeArguments arguments) {
  LOGI("In C2DGetImageSmoothingEnabled");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  SetDoubleReturnValue(arguments, Context2D(handle)->imageSmoothingEnabled());
  Dart_ExitScope();
  LOGI("Out C2DGetImageSmoothingEnabled");
}

void C2DArc(Dart_NativeArguments arguments) {
  LOGI("In C2DArc");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double x = GetArgAsDouble(arguments, 1);
  double y = GetArgAsDouble(arguments, 2);
  double r = GetArgAsDouble(arguments, 3);
  double a1 = GetArgAsDouble(arguments, 4);
  double a2 = GetArgAsDouble(arguments, 5);
  bool anticlockwise = GetArgAsBool(arguments, 6);
  Context2D(handle)->Arc(x, y, r, a1, a2, anticlockwise);
  Dart_ExitScope();
  LOGI("Out C2DArc");
}

void C2DArcTo(Dart_NativeArguments arguments) {
  LOGI("In C2DArcTo");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double x1 = GetArgAsDouble(arguments, 1);
  double y1 = GetArgAsDouble(arguments, 2);
  double x2 = GetArgAsDouble(arguments, 3);
  double y2 = GetArgAsDouble(arguments, 4);
  double radius = GetArgAsDouble(arguments, 5);
  Context2D(handle)->ArcTo(x1, y1, x2, y2, radius);
  Dart_ExitScope();
  LOGI("Out C2DArcTo");
}

void C2DBeginPath(Dart_NativeArguments arguments) {
  LOGI("In C2DBeginPath");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  Context2D(handle)->BeginPath();
  Dart_ExitScope();
  LOGI("Out C2DBeginPath");
}

void C2DBezierCurveTo(Dart_NativeArguments arguments) {
  LOGI("In C2DBezierCurveTo");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double cp1x = GetArgAsDouble(arguments, 1);
  double cp1y = GetArgAsDouble(arguments, 2);
  double cp2x = GetArgAsDouble(arguments, 3);
  double cp2y = GetArgAsDouble(arguments, 4);
  double x = GetArgAsDouble(arguments, 5);
  double y = GetArgAsDouble(arguments, 6);
  Context2D(handle)->BezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
  Dart_ExitScope();
  LOGI("Out C2DBezierCurveTo");
}

void C2DClearRect(Dart_NativeArguments arguments) {
  LOGI("In C2DClearRect");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double left = GetArgAsDouble(arguments, 1);
  double top = GetArgAsDouble(arguments, 2);
  double width = GetArgAsDouble(arguments, 3);
  double height = GetArgAsDouble(arguments, 4);
  Context2D(handle)->ClearRect(left, top, width, height);
  Dart_ExitScope();
  LOGI("Out C2DClearRect");
}

void C2DClip(Dart_NativeArguments arguments) {
  LOGI("In C2DClip");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  Context2D(handle)->Clip();
  Dart_ExitScope();
  LOGI("Out C2DClip");
}

void C2DClosePath(Dart_NativeArguments arguments) {
  LOGI("In C2DClosePath");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  Context2D(handle)->ClosePath();
  Dart_ExitScope();
  LOGI("Out C2DClosePath");
}

void C2DCreateImageDataFromDimensions(Dart_NativeArguments arguments) {
  LOGI("In C2DCreateImageDataFromDimensions");
  Dart_EnterScope();
  // int handle = GetArgAsInt(arguments, 0);
  // double sw = GetArgAsDouble(arguments, 1);
  // double sh = GetArgAsDouble(arguments, 2);
  // GLubyte* pixels = (GLubyte*)calloc(sw * sh * 4, sizeof(GLubyte));
  // ImageData* imageData = new ImageData(sw, sh, pixels);
  // TODO(gram): How do we create a Dart ImageData object from this?
  Dart_ExitScope();
  LOGI("Out C2DCreateImageDataFromDimensions");
}

void C2DDrawImage(Dart_NativeArguments arguments) {
  LOGI("In C2DDrawImage");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* src_url = GetArgAsString(arguments, 1);
  int sx = GetArgAsInt(arguments, 2);
  int sy = GetArgAsInt(arguments, 3);
  bool has_src_dimensions = GetArgAsBool(arguments, 4);
  int sw = GetArgAsInt(arguments, 5);
  int sh = GetArgAsInt(arguments, 6);
  int dx = GetArgAsInt(arguments, 7);
  int dy = GetArgAsInt(arguments, 8);
  bool has_dst_dimensions = GetArgAsBool(arguments, 9);
  int dw = GetArgAsInt(arguments, 10);
  int dh = GetArgAsInt(arguments, 11);
  Context2D(handle)->DrawImage(src_url,
                               sx, sy, has_src_dimensions, sw, sh,
                               dx, dy, has_dst_dimensions, dw, dh);
  Dart_ExitScope();
  LOGI("Out C2DDrawImage");
}

void C2DFill(Dart_NativeArguments arguments) {
  LOGI("In C2DFill");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  Context2D(handle)->Fill();
  Dart_ExitScope();
  LOGI("Out C2DFill");
}

void C2DFillRect(Dart_NativeArguments arguments) {
  LOGI("In C2DFillRect");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double left = GetArgAsDouble(arguments, 1);
  double top = GetArgAsDouble(arguments, 2);
  double width = GetArgAsDouble(arguments, 3);
  double height = GetArgAsDouble(arguments, 4);
  Context2D(handle)->FillRect(left, top, width, height);
  Dart_ExitScope();
  LOGI("Out C2DFillRect");
}

void C2DFillText(Dart_NativeArguments arguments) {
  LOGI("In C2DFillText");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* text = GetArgAsString(arguments, 1);
  double x = GetArgAsDouble(arguments, 2);
  double y = GetArgAsDouble(arguments, 3);
  double maxWidth = GetArgAsDouble(arguments, 4);
  Context2D(handle)->FillText(text, x, y, maxWidth);
  Dart_ExitScope();
  LOGI("Out C2DFillText");
}

void C2DGetImageData(Dart_NativeArguments arguments) {
  LOGI("In C2DGetImageData");
  Dart_EnterScope();
  // TODO(gram): Complete this.
  // int handle = GetArgAsInt(arguments, 0);
  // double sx = GetArgAsDouble(arguments, 1);
  // double sy = GetArgAsDouble(arguments, 2);
  // double sw = GetArgAsDouble(arguments, 3);
  // double sh = GetArgAsDouble(arguments, 4);
  // ... = Context2D(handle)->GetImageData(text, x, y, maxWidth);
  Dart_ExitScope();
  LOGI("Out C2DGetImageData");
}

void C2DLineTo(Dart_NativeArguments arguments) {
  LOGI("In C2DLineTo");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double x = GetArgAsDouble(arguments, 1);
  double y = GetArgAsDouble(arguments, 2);
  Context2D(handle)->LineTo(x, y);
  Dart_ExitScope();
  LOGI("Out C2DLineTo");
}

void C2DMeasureText(Dart_NativeArguments arguments) {
  LOGI("In C2DMeasureText");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* text = GetArgAsString(arguments, 1);
  float width = Context2D(handle)->MeasureText(text);
  SetDoubleReturnValue(arguments, width);
  Dart_ExitScope();
  LOGI("Out C2DMeasureText");
}

void C2DMoveTo(Dart_NativeArguments arguments) {
  LOGI("IN C2DMoveTo");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double x = GetArgAsDouble(arguments, 1);
  double y = GetArgAsDouble(arguments, 2);
  Context2D(handle)->MoveTo(x, y);
  Dart_ExitScope();
  LOGI("Out C2DMoveTo");
}

void C2DPutImageData(Dart_NativeArguments arguments) {
  LOGI("IN C2DPutImageData");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  // Get object arguments 2
  // BindingImageData* imageData = GetArgAsObject(arguments, 1);
  double dx = GetArgAsDouble(arguments, 2);
  double dy = GetArgAsDouble(arguments, 3);
  Context2D(handle)->PutImageData(NULL, dx, dy);
  Dart_ExitScope();
  LOGI("Out C2DPutImageData");
}

void C2DQuadraticCurveTo(Dart_NativeArguments arguments) {
  LOGI("In C2DQuadraticCurveTo");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double cpx = GetArgAsDouble(arguments, 1);
  double cpy = GetArgAsDouble(arguments, 2);
  double x = GetArgAsDouble(arguments, 3);
  double y = GetArgAsDouble(arguments, 4);
  Context2D(handle)->QuadraticCurveTo(cpx, cpy, x, y);
  Dart_ExitScope();
  LOGI("Out C2DQuadraticCurveTo");
}

void C2DRect(Dart_NativeArguments arguments) {
  LOGI("In C2DRect");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double x = GetArgAsDouble(arguments, 1);
  double y = GetArgAsDouble(arguments, 2);
  double w = GetArgAsDouble(arguments, 3);
  double h = GetArgAsDouble(arguments, 4);
  Context2D(handle)->Rect(x, y, w, h);
  Dart_ExitScope();
  LOGI("Out C2DRect");
}

void C2DRestore(Dart_NativeArguments arguments) {
  LOGI("In C2DRestore");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  Context2D(handle)->Restore();
  Dart_ExitScope();
  LOGI("Out C2DRestore");
}

void C2DRotate(Dart_NativeArguments arguments) {
  LOGI("In C2DRotate");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double a = GetArgAsDouble(arguments, 1);
  Context2D(handle)->Rotate(a);
  Dart_ExitScope();
  LOGI("Out C2DRotate");
}

void C2DSave(Dart_NativeArguments arguments) {
  LOGI("In C2DSave");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  Context2D(handle)->Save();
  Dart_ExitScope();
  LOGI("Out C2DSave");
}

void C2DScale(Dart_NativeArguments arguments) {
  LOGI("In C2DScale");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double sx = GetArgAsDouble(arguments, 1);
  double sy = GetArgAsDouble(arguments, 2);
  Context2D(handle)->Scale(sx, sy);
  Dart_ExitScope();
  LOGI("Out C2DScale");
}

void C2DSetLineDash(Dart_NativeArguments arguments) {
  LOGI("In C2DSetLineDash");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  int len;
  float* dash = static_cast<float*>(GetArgsAsFloatList(arguments, 1, &len));
  if (dash != NULL) {
    Context2D(handle)->setLineDash(dash, len);
    delete[] dash;
  }
  Dart_ExitScope();
  LOGI("Out C2DSetLineDash");
}

void C2DSetLineDashOffset(Dart_NativeArguments arguments) {
  LOGI("In C2DSetLineDashOffset");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double offset = GetArgAsDouble(arguments, 1);
  Context2D(handle)->setLineDashOffset(offset);
  Dart_ExitScope();
  LOGI("Out C2DSetLineDashOffset");
}

void C2DSetTransform(Dart_NativeArguments arguments) {
  LOGI("In C2DSetTransform");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double m11 = GetArgAsDouble(arguments, 1);
  double m12 = GetArgAsDouble(arguments, 2);
  double m21 = GetArgAsDouble(arguments, 3);
  double m22 = GetArgAsDouble(arguments, 4);
  double dx = GetArgAsDouble(arguments, 5);
  double dy = GetArgAsDouble(arguments, 6);
  Context2D(handle)->setTransform(m11, m12, m21, m22, dx, dy);
  Dart_ExitScope();
  LOGI("Out C2DSetTransform");
}

void C2DStroke(Dart_NativeArguments arguments) {
  LOGI("In C2DStroke");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  Context2D(handle)->Stroke();
  Dart_ExitScope();
  LOGI("Out C2DStroke");
}

void C2DStrokeRect(Dart_NativeArguments arguments) {
  LOGI("In C2DStrokeRect");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double left = GetArgAsDouble(arguments, 1);
  double top = GetArgAsDouble(arguments, 2);
  double width = GetArgAsDouble(arguments, 3);
  double height = GetArgAsDouble(arguments, 4);
  Context2D(handle)->StrokeRect(left, top, width, height);
  Dart_ExitScope();
  LOGI("Out C2DStrokeRect");
}

void C2DStrokeText(Dart_NativeArguments arguments) {
  LOGI("In C2DStrokeText");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  const char* text = GetArgAsString(arguments, 1);
  double x = GetArgAsDouble(arguments, 2);
  double y = GetArgAsDouble(arguments, 3);
  double maxWidth = GetArgAsDouble(arguments, 4);
  Context2D(handle)->StrokeText(text, x, y, maxWidth);
  Dart_ExitScope();
  LOGI("Out C2DStrokeText");
}

void C2DTransform(Dart_NativeArguments arguments) {
  LOGI("In C2DTransform");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double m11 = GetArgAsDouble(arguments, 1);
  double m12 = GetArgAsDouble(arguments, 2);
  double m21 = GetArgAsDouble(arguments, 3);
  double m22 = GetArgAsDouble(arguments, 4);
  double dx = GetArgAsDouble(arguments, 5);
  double dy = GetArgAsDouble(arguments, 6);
  Context2D(handle)->Transform(m11, m12, m21, m22, dx, dy);
  Dart_ExitScope();
  LOGI("Out C2DTransform");
}

void C2DTranslate(Dart_NativeArguments arguments) {
  LOGI("In C2DTranslate");
  Dart_EnterScope();
  int handle = GetArgAsInt(arguments, 0);
  double x = GetArgAsDouble(arguments, 1);
  double y = GetArgAsDouble(arguments, 2);
  Context2D(handle)->Translate(x, y);
  Dart_ExitScope();
  LOGI("Out C2DTranslate");
}

struct FunctionLookup {
  const char* name;
  Dart_NativeFunction function;
};

FunctionLookup function_list[] = {
    {"Log", Log},
    {"LogError", LogError},
    {"SystemRand", SystemRand},
    {"SystemSrand", SystemSrand},
    {"SwapBuffers", SwapBuffers},
    {"GetDeviceScreenWidth", GetDeviceScreenWidth},
    {"GetDeviceScreenHeight", GetDeviceScreenHeight},
    {"GLAttachShader", GLAttachShader},
    {"GLBindBuffer", GLBindBuffer},
    {"GLBufferData", GLBufferData},
    {"GLClear", GLClear},
    {"GLClearColor", GLClearColor},
    {"GLClearDepth", GLClearDepth},
    {"GLCompileShader", GLCompileShader},
    {"GLCreateBuffer", GLCreateBuffer},
    {"GLCreateProgram", GLCreateProgram},
    {"GLCreateShader", GLCreateShader},
    {"GLDrawArrays", GLDrawArrays},
    {"GLEnableVertexAttribArray", GLEnableVertexAttribArray},
    {"GLGetAttribLocation", GLGetAttribLocation},
    {"GLGetError", GLGetError},
    {"GLGetProgramParameter", GLGetProgramParameter},
    {"GLGetShaderParameter", GLGetShaderParameter},
    {"GLGetUniformLocation", GLGetUniformLocation},
    {"GLLinkProgram", GLLinkProgram},
    {"GLShaderSource", GLShaderSource},
    {"GLUniform1f", GLUniform1f},
    {"GLUniform2f", GLUniform2f},
    {"GLUniform3f", GLUniform3f},
    {"GLUniform4f", GLUniform4f},
    {"GLUniform1i", GLUniform1i},
    {"GLUniform2i", GLUniform2i},
    {"GLUniform3i", GLUniform3i},
    {"GLUniform4i", GLUniform4i},
    {"GLUniform1fv", GLUniform1fv},
    {"GLUniform2fv", GLUniform2fv},
    {"GLUniform3fv", GLUniform3fv},
    {"GLUniform4fv", GLUniform4fv},
    {"GLUniform1iv", GLUniform1iv},
    {"GLUniform2iv", GLUniform2iv},
    {"GLUniform3iv", GLUniform3iv},
    {"GLUniform4iv", GLUniform4iv},
    {"GLUseProgram", GLUseProgram},
    {"GLVertexAttribPointer", GLVertexAttribPointer},
    {"GLViewport", GLViewport},
    {"GLArrayBuffer", GLArrayBuffer},
    {"GLColorBufferBit", GLColorBufferBit},
    {"GLCompileStatus", GLCompileStatus},
    {"GLDeleteStatus", GLDeleteStatus},
    {"GLDepthBufferBit", GLDepthBufferBit},
    {"GLFloat", GLFloat},
    {"GLFragmentShader", GLFragmentShader},
    {"GLLinkStatus", GLLinkStatus},
    {"GLTriangleStrip", GLTriangleStrip},
    {"GLTriangles", GLTriangles},
    {"GLTrue", GLTrue},
    {"GLStaticDraw", GLStaticDraw},
    {"GLValidateStatus", GLValidateStatus},
    {"GLVertexShader", GLVertexShader},
    {"GLGetShaderInfoLog", GLGetShaderInfoLog},
    {"GLGetProgramInfoLog", GLGetProgramInfoLog},
    {"RandomArray_ServicePort", RandomArrayServicePort},

    // Audio support.
    {"PlayBackground", PlayBackground},
    {"StopBackground", StopBackground},
    {"LoadSample", LoadSample},
    {"PlaySample", PlaySample},

    // 2D Support

    { "C2DCreateNativeContext", C2DCreateNativeContext},

    // Property getters/setters.

    { "C2DSetWidth", C2DSetWidth},
    { "C2DSetHeight", C2DSetHeight},
    { "C2DSetGlobalAlpha", C2DSetGlobalAlpha},
    { "C2DSetFillStyle", C2DSetFillStyle},
    { "C2DSetFont", C2DSetFont},
    { "C2DSetGlobalCompositeOperation", C2DSetGlobalCompositeOperation},
    { "C2DSetLineCap", C2DSetLineCap},
    { "C2DSetLineJoin", C2DSetLineJoin},
    { "C2DSetLineWidth", C2DSetLineWidth},
    { "C2DSetMiterLimit", C2DSetMiterLimit},
    { "C2DSetShadowBlur", C2DSetShadowBlur},
    { "C2DSetShadowColor", C2DSetShadowColor},
    { "C2DSetShadowOffsetX", C2DSetShadowOffsetX},
    { "C2DSetShadowOffsetY", C2DSetShadowOffsetY},
    { "C2DSetStrokeStyle", C2DSetStrokeStyle},
    { "C2DSetTextAlign", C2DSetTextAlign},
    { "C2DSetTextBaseline", C2DSetTextBaseline},
    { "C2DGetImageSmoothingEnabled", C2DGetImageSmoothingEnabled},

    // Methods.
    { "C2DArc", C2DArc},
    { "C2DArcTo", C2DArcTo},
    { "C2DBeginPath", C2DBeginPath},
    { "C2DBezierCurveTo", C2DBezierCurveTo},
    { "C2DClearRect", C2DClearRect},
    { "C2DClip", C2DClip},
    { "C2DClosePath", C2DClosePath},
    { "C2DCreateImageDataFromDimensions", C2DCreateImageDataFromDimensions},
    { "C2DDrawImage", C2DDrawImage},
    { "C2DFill", C2DFill},
    { "C2DFillRect", C2DFillRect},
    { "C2DFillText", C2DFillText},
    { "C2DGetImageData", C2DGetImageData},
    { "C2DLineTo", C2DLineTo},
    { "C2DMeasureText", C2DMeasureText},
    { "C2DMoveTo", C2DMoveTo},
    { "C2DPutImageData", C2DPutImageData},
    { "C2DQuadraticCurveTo", C2DQuadraticCurveTo},
    { "C2DRect", C2DRect},
    { "C2DRestore", C2DRestore},
    { "C2DRotate", C2DRotate},
    { "C2DSave", C2DSave},
    { "C2DScale", C2DScale},
    { "C2DSetLineDash", C2DSetLineDash},
    { "C2DSetLineDashOffset", C2DSetLineDashOffset},
    { "C2DSetTransform", C2DSetTransform},
    { "C2DStroke", C2DStroke},
    { "C2DStrokeRect", C2DStrokeRect},
    { "C2DStrokeText", C2DStrokeText},
    { "C2DTransform", C2DTransform},
    { "C2DTranslate", C2DTranslate},
    {NULL, NULL}};

Dart_NativeFunction ResolveName(Dart_Handle name, int argc) {
  if (!Dart_IsString(name)) return NULL;
  Dart_NativeFunction result = NULL;
  Dart_EnterScope();
  const char* cname;
  HandleError(Dart_StringToCString(name, &cname));
  for (int i = 0; function_list[i].name != NULL; ++i) {
    if (strcmp(function_list[i].name, cname) == 0) {
      result = function_list[i].function;
      break;
    }
  }
  Dart_ExitScope();
  return result;
}
