コード例 #1
0
ファイル: cogl-pipeline-snippet.c プロジェクト: 3v1n0/cogl
void
_cogl_pipeline_snippet_generate_declarations (GString *declarations_buf,
                                              CoglSnippetHook hook,
                                              CoglPipelineSnippetList *snippets)
{
  GList *l;

  for (l = snippets->entries; l; l = l->next)
    {
      CoglSnippet *snippet = l->data;

      if (snippet->hook == hook)
        {
          const char *source;

          if ((source = cogl_snippet_get_declarations (snippet)))
            g_string_append (declarations_buf, source);
        }
    }
}
コード例 #2
0
void
_cogl_pipeline_snippet_generate_code (const CoglPipelineSnippetData *data)
{
  CoglPipelineSnippet *first_snippet, *snippet;
  int snippet_num = 0;
  int n_snippets = 0;

  first_snippet = COGL_LIST_FIRST (data->snippets);

  /* First count the number of snippets so we can easily tell when
     we're at the last one */
  COGL_LIST_FOREACH (snippet, data->snippets, list_node)
    if (snippet->snippet->hook == data->hook)
      {
        /* Don't bother processing any previous snippets if we reach
           one that has a replacement */
        if (snippet->snippet->replace)
          {
            n_snippets = 1;
            first_snippet = snippet;
          }
        else
          n_snippets++;
      }

  /* If there weren't any snippets then generate a stub function with
     the final name */
  if (n_snippets == 0)
    {
      if (data->return_type)
        g_string_append_printf (data->source_buf,
                                "\n"
                                "%s\n"
                                "%s (%s)\n"
                                "{\n"
                                "  return %s (%s);\n"
                                "}\n",
                                data->return_type,
                                data->final_name,
                                data->argument_declarations ?
                                data->argument_declarations : "",
                                data->chain_function,
                                data->arguments ? data->arguments : "");
      else
        g_string_append_printf (data->source_buf,
                                "\n"
                                "void\n"
                                "%s (%s)\n"
                                "{\n"
                                "  %s (%s);\n"
                                "}\n",
                                data->final_name,
                                data->argument_declarations ?
                                data->argument_declarations : "",
                                data->chain_function,
                                data->arguments ? data->arguments : "");

      return;
    }

  for (snippet = first_snippet, snippet_num = 0;
       snippet_num < n_snippets;
       snippet = COGL_LIST_NEXT (snippet, list_node), snippet_num++)
    if (snippet->snippet->hook == data->hook)
      {
        const char *source;

        if ((source = cogl_snippet_get_declarations (snippet->snippet)))
          g_string_append (data->source_buf, source);

        g_string_append_printf (data->source_buf,
                                "\n"
                                "%s\n",
                                data->return_type ?
                                data->return_type :
                                "void");

        if (snippet_num + 1 < n_snippets)
          g_string_append_printf (data->source_buf,
                                  "%s_%i",
                                  data->function_prefix,
                                  snippet_num);
        else
          g_string_append (data->source_buf, data->final_name);

        g_string_append (data->source_buf, " (");

        if (data->argument_declarations)
          g_string_append (data->source_buf, data->argument_declarations);

        g_string_append (data->source_buf,
                         ")\n"
                         "{\n");

        if (data->return_type && !data->return_variable_is_argument)
          g_string_append_printf (data->source_buf,
                                  "  %s %s;\n"
                                  "\n",
                                  data->return_type,
                                  data->return_variable);

        if ((source = cogl_snippet_get_pre (snippet->snippet)))
          g_string_append (data->source_buf, source);

        /* Chain on to the next function, or bypass it if there is
           a replace string */
        if ((source = cogl_snippet_get_replace (snippet->snippet)))
          g_string_append (data->source_buf, source);
        else
          {
            g_string_append (data->source_buf, "  ");

            if (data->return_type)
              g_string_append_printf (data->source_buf,
                                      "%s = ",
                                      data->return_variable);

            if (snippet_num > 0)
              g_string_append_printf (data->source_buf,
                                      "%s_%i",
                                      data->function_prefix,
                                      snippet_num - 1);
            else
              g_string_append (data->source_buf, data->chain_function);

            g_string_append (data->source_buf, " (");

            if (data->arguments)
              g_string_append (data->source_buf, data->arguments);

            g_string_append (data->source_buf, ");\n");
          }

        if ((source = cogl_snippet_get_post (snippet->snippet)))
          g_string_append (data->source_buf, source);

        if (data->return_type)
          g_string_append_printf (data->source_buf,
                                  "  return %s;\n",
                                  data->return_variable);

        g_string_append (data->source_buf, "}\n");
      }
}