After thinking for a long time, I decided to produce the 5th edition of GemFinder using the brand new CJS framework. It's still a project in its infacy but I'm pretty sure about the new features that this program will have (if you like the genre, this is going to be amazing). The huge news is that the software will be crossplatform and totally programmable in it's main components: screen capture -> image analysis -> decision maker -> input repeater.
It works exactly in this way:
- Each component implements a default algorithm to make the program work. If you use the default component, you have to do nothing at all.
- If you are a software developer, you can change the internal code with a JIT language and save the source code in the configuration file. Like a shader, you don't need to build the source code.
- The JIT language is basically C and allow you to dynamically link an external library, so you can implement your own algoritm in another existing language (using directx, opengl, opencl...).
- You are not forced to reprogram all the components by scratch, so you can change only the components you want to.
The "screen capture" is the component that captures a region from the desktop and pass it to the "image analysis" component. For instance, the default capture algorithm will use GDI on Windows and xlib on Linux, but you can change it to use other existing APIs for different hardware and operating systems. You can implement the screen capture using desktop duplication on Windows 8 or NvFBC on NVidia / Windows 7 / Linux (the informations about the available operating system and hardware are detected by the software or you can implement the detection by yourself, as you prefer).
The "image analysis" component gets the captured region, extracts sub-images, performs color/space transforms and make comparisons between different sub-images. For example, if the comparison algorithm is not enough, you can create a new one by yourself implementing peak signal noise ratio or structural similarities.
The "decision maker" component gets the informations extracted by images and uses them to make "decisions". You can pass tiles from a tetris game, instruct the component about the rule of the game, implement an artifical intelligence to make decisions and obtain the best score in the shortest time. Of course, you can do it for all the games you want to "play".
The "input repeater" component gets the decisions of before and simulate an input device event to make the artificial intelligence play the game. For instance, you can support a new device or make the mouse movement similar to the one produced by a human hand.