4

I'm trying to load an openGL texture for a game. The texture is an image that has been exported as a .C source file from GIMP. When I #include this file in my project (using Visual C++ 2010 Ultimate), I get a compiler error saying fatal error C1091: compiler limit: string exceeds 65535 bytes in length

Is there any workaround ?

The reason I wanted to export the image as a C header file was so that the program compiles with the image, and I dont have to provide raw image files along with the executable.

Code:

#include <iostream>
#include <Windows.h>
#include <glfw.h>
#include "X.c"

#define X 1
#define O 2

#pragma comment(lib, "glfw.lib")
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "gdi32.lib")

using namespace std;

float render();
void stepGame(float);
void keyboard(int, int);

int main(int argv, int *argc[])
{
    glfwInit();
    glfwOpenWindow(480, 480, 16, 16, 16, 16, 16, 16, GLFW_WINDOW);
    glfwSetKeyCallback(keyboard);
    glfwSetWindowTitle("Tic Tac Toe!");
    glClearColor(1.0, 1.0, 1.0, 1.0);
    float dT;

    while(glfwGetWindowParam(GLFW_OPENED) > 0)
    {
        glfwPollEvents();
        dT = render();
        stepGame(dT);
    }
    return 0;
}

Image file: X.c

viraj
  • 1,784
  • 4
  • 35
  • 52

2 Answers2

3

I made a better gimp plug-in in python to export image data as C code. Feel free to use it or make it better for custom use. The scripts are available on a github repository. Hope that helps.

Karibe
  • 155
  • 1
  • 10
  • 1
    I upvoted this, but in reality the documentation for this GIMP plugin (while a start in the right direction) is not so good for me right now. E.g., how do we use the macro *_RUN_LENGTH_DECODE(...) generated by this utility? – mds Mar 02 '19 at 00:19
  • 1
    @mds I have no idea what you are talking about. What utility? I presented a plugin which when installed in Gimp produces C code with an array of pixel data of the form `RGB image[300]={ {0,0,0},{0,0,0}...};` no macro. Kindly check the first link in the answer. – Karibe Dec 04 '19 at 07:18
3

Here is an alternative solution. Export the image as a raw data file, then use bin2hex to convert it to a C/C++ array. This will work fine because instead of a huge string this script generates a char array. Here is an example:

$ bin2hex.pl
bin2hex.pl by Chami.com

usage:
  perl bin2hex.pl <binary file> <language id>

  <binary file> : path to the binary file
  <language id> : 0 = Perl, 1 = C/C++/Java, 2 = Pascal/Delphi

$ bin2hex.pl x.bin 1

/* begin binary data: */
char bin_data[] = /* 112 */
{0x23,0x69,0x6E,0x63,0x6C,0x75,0x64,0x65,0x20,0x3C,0x73,0x74,0x64,0x69,0x6F
,0x2E,0x68,0x3E,0x0A,0x23,0x69,0x6E,0x63,0x6C,0x75,0x64,0x65,0x20,0x3C,0x74
,0x69,0x6D,0x65,0x2E,0x68,0x3E,0x0A,0x0A,0x69,0x6E,0x74,0x20,0x6D,0x61,0x69
,0x6E,0x28,0x69,0x6E,0x74,0x20,0x61,0x72,0x67,0x63,0x2C,0x20,0x63,0x68,0x61
,0x72,0x2A,0x20,0x61,0x72,0x67,0x76,0x5B,0x5D,0x29,0x0A,0x7B,0x0A,0x20,0x20
,0x20,0x20,0x70,0x72,0x69,0x6E,0x74,0x66,0x28,0x22,0x25,0x64,0x5C,0x6E,0x22
,0x2C,0x20,0x73,0x69,0x7A,0x65,0x6F,0x66,0x28,0x74,0x69,0x6D,0x65,0x5F,0x74
,0x29,0x29,0x3B,0x0A,0x7D,0x0A,0x0A};
/* end binary data. size = 112 bytes */
Miguel Grinberg
  • 65,299
  • 14
  • 133
  • 152