Use the information and utilities on this site at your own risk!!!
readme.html | This document. |
screenmod.exe | Windows command-line modification program. |
cross800x600.bmp | The background I used to replace my startup screen. |
X1_v15_oemcfg.MODIFIED.he_ | Final result: the modified oemconfig I flashed my firmware with. |
screenmod infile.bmp originalx1oemconfig.he_ modifiedx1oemconfig.he_
The program will read the BMP, convert it to the format used by the firmware, and replace the data in the original firmware with the encoding of your input BMP.
Input Image
800x600 24-bit uncompressed BMP
As you continue reading you will see why some colors may not work. screenmod will warn you if it sees one of these colors. It will replace it with a similar color.
The firmware has limited space, and the size required for each image is dependant on its complexity. Therefore, some complex images may code to a larger space than allowed. A conservative estimate of the space available (216 bytes) was made, and if the coded image exceeds this size, screenmod will exit with an error message.
Good luck, and enjoy! Please email me (my email address is displayed by screenmod when ran) if you have any comments.
Pixels are coded in 16bpp format. Red and blue get 5 bits each, and green gets 6. This is typical of 16-bit color. The format is therefor RRRRRGGGGGGBBBBB for a 16-bit chunk.
The run data begins at 0xE001A. Data chunks are 16bits long. If the little-endian LSB of the current chunk is 0xCD, this indicates a run. The length of the run is the MSB. The pixel value of the run is the next 16-bit chunk. Runs appear to be between 2 and 204 pixels long. Runs must terminate at the end of a line.
Non-runs are simply specified with their raw value.
So, the stream CDCC D009 CDCC D009 CDCC D009 CDBC D009 is 3 runs of length 204 of color 0xD009, followed by another run of color 0xD009 of length 188. 3*204+188=800. End of line!
Things get a little more interesting a few lines lower:
CDCC D009 CDCC D009 CDCC D009 CD57 D009 7122 CD02 B55B CD16 D009 511A 566C 799D D55B CD48 D009
The familiar 3*204 run of D009. Then, only 87 more. Then 7122. Since CD is not in the LSB, treat as a single pixel. Then a run of two B55B values. Then a run of 22 D009. Then 4 more individual pixels. Then a run of 72 D009 to complete the line.
Easy! Continue reading in this manner and you can extract the startup screen. I imagine this applies to other Infocus projectors as well!
Of course, I admit that I'm not 100% confident that I have the RLE system down precisely. Obviously a single pixel which happens to have CD in its LSB cannot be coded this way. I'm not sure how Infocus envisioned handling this (one possibility is to make a 1-length run, but I don't know if that will work). It makes me believe I understand the run format enough to use it, but that there still may be one or two details I'm missing. Nevertheless, I was able to extract the startup screen flawlessley using this method.
Make sure you somehow handle pixels with CD in their LSB.
screenmod is an implementation of this coding strategy.