______ _      _                    _____                           _              __  _                 
| ___ (_)    | |                  /  __ \                         | |            /  || |                
| |_/ /_  ___| |_ _   _ _ __ ___  | /  \/ ___  _ ____   _____ _ __| |_ ___ _ __  `| || |__  _ __  _ __  
|  __/| |/ __| __| | | | '__/ _ \ | |    / _ \| '_ \ \ / / _ \ '__| __/ _ \ '__|  | || '_ \| '_ \| '_ \ 
| |   | | (__| |_| |_| | | |  __/ | \__/\ (_) | | | \ V /  __/ |  | ||  __/ |    _| || |_) | |_) | |_) |
\_|   |_|\___|\__|\__,_|_|  \___|  \____/\___/|_| |_|\_/ \___|_|   \__\___|_|    \___/_.__/| .__/| .__/ 
                                                                                           | |   | |    
                                                                                           |_|   |_| 

v1.4.1:
- einige Bugfixes
																						   
v1.4:
- Anzeige der Vorschaufenstern verbessert (schrfere & skaliert)
- neues Format eingebunden: xbm - X BitMap 
- das Bitfeld in c- bzw. h-Dateien kann jetzt als big oder little endian erzeugt und abgespeichert werden
	Typische Vertreter fr Little-Endian: x86, PICmicro, Zilog Z80 da er vom Intel 8080 abstammt, DEC Alpha, AVR mit AVR-GCC
    Typische Vertreter fr Big-Endian: Motorola MC68000, Atmel AVR32, MIPS, PowerPC, SPARC, Zilog Z8 und Z8000
	
- optionale Ausgabe der Bitmap als c-Datei fr Bitfeld und h-Datei fr include aus mehrern unabhngigen c--Dateien jetzt mglich
- Ausgabe der Bitmap als h-File inklusive Bitfeld weiterhin mglich
- Fehler beim Erzeugen der #define Namen mit Leerzeichen korrigiert

v1.3:
- Fehler beim abspeichern von c-Headerdateien behoben (Hhenname im #define war != Hhenname im Array)

v.1.1:
Der "Picture Converter 1bpp" ist ein ntzliches Tool zum schnellen und einfachen Erstellen von Bitmapgrafiken fr monochrome LC-Displays. 

Erzeug aus einer beliebigen Bilddatei (jpg,gif,tif,png,bmp, etc...) eine Bilddatei mit einer Farbtiefe von 1 Bit.
Schwarzschattierungen werden mittels Floyd-Steinberg Dithering Verfahren ermittelt. Die Auflsung (zerren/strecken) des Zielbildes kann angepasst werden.

Zustzliche Funktionen: Drehen und Spiegeln.

Verlustfreie Speicherung in den Formate: bmp, tif und png
Export in #include - fahiges C-Header-File fr verschiedene Compiler, Grafikcontroller und Mikrocontroller.



C-FILE-HEADER:

In datei.h stehen die Bitmapdaten als Array und der Angabe von Breite und Hhe in Pixeln. Jede Zeile in datei.h enthlt eine Zeile der Bitmap. 
Die ersten Arrayeintrge verweise per Prprozessor auf die Angaben zur 1. Bildbreite und 2. Bildhhe (ACHTUNG: wenn dieser Wert >254 dann ist ein Eintrag 2byte gro, sonst 1Byte). 
Die erste Zeile enthlt die oberste Zeile der Bitmap. Das erste Byte ist links oben in der Bitmap. D7 des Bytes ist das erste Pixel (little endian).

Dateien fr KS108, SED1520 und SPLC0501C Controller knnen mit vertikaler Orientierung erzeugt werden. Ein Byte enthlt dann 8 Pixel vertikal angeordnet. 
D7 des Bytes ist das oberste Pixel. Eine Zeile im C-Code besteht aus einem Streifen von 8 Pixeln Hhe.

Es werden Kommentarzeilen fr verschiedene C-Compiler eingefgt. Die passenden bitte auskommentieren, und die nicht benutzten zu Kommentaren machen oder lschen !

Keil 		Kommerziell 8051
SDCC		Freeware 8051
AVR-GCC		Freeware Atmel AVR/ATMega/ATiny
MCC18      	Microchips PIC18Cxxxx und PIC18Fxxxx

Beispiel einer BMP C-Funktion zum Anzeigen der C-Files. Hier am Beispiel fr einen KS108 Controller auf einem AVR ATmega. Aber Achtung die maximale Bildbreite/-hhe ist auf 254px beschrnk.
Da nur je ein Byte fr die Grenangabe gelesen wird. Universeller wird es wenn dies auf 2byte gendert wird, dazu mssen die Grenangaben bei Dateien mit einer Auflsung kleiner 254px
manuell auf 2byte erweitert werden(siehe Text oben "Die ersten Arrayeintrge..."):
//*****************************************************************************
// schreibt eine Bitmap an die angegebene Stelle (in der BMP m die Auflsung gespeichert sein)
// BMP muss im Flashspeicher abgelegt sein
// Koordinaten knnen auch negativ sein z.B. um BMP ins Bild "einfliegen" zu lassen
//*****************************************************************************
void glcd_draw_bmp (unsigned char* bitmap, unsigned char x, unsigned char y)
{
  	unsigned short byte=0;
  	unsigned char y_start,y_end,y_offset,y_height;
  	unsigned char right;
  	unsigned char temp;
  	unsigned char width, height;
  
  	width = pgm_read_byte(bitmap);                         			// aus flash in sram wie breit
  	height = pgm_read_byte(bitmap+1);                       		// aus flash in sram wie hoch

  	y_start = y / 8;                                  				// in welcher page muss angefangen werden
  	y_end = ((y + height-1) / 8);                          			// und in welcher muss aufgehrt werden
  	y_offset = y - (y_start * 8);                             		// wie oft muss geschoben werden?
  	y_height = ((height - 1) / 8);                          		// wie viele zeilen (page) wrde das bild an sich brauchen
  
  	for (y=y_start;y<(y_end+1);y++)                          		// schleife von y_start bis y_end
  		{
    	if(y > 7) break;                                			// nichts ans lcd schicken wenn keine zeile (page) brig ist

    	for (right=x;right<(x+width);right++)                  		// starte von x bis x + bildbreite
    		{
      		temp = 0;                                  				// lschen des datenregisters
      		if(y != y_end || (y_start + y_height) == y_end)
				{              										// nur wenn nicht letzte zeile oder nochdaten brig sind
        		temp = (pgm_read_byte(bitmap+(byte)+2)<<y_offset);  // holen der daten und nach unten schieben
      			}                        
      		if(y != y_start)
				{                             						// nur wenn nicht erste zeile
        		temp |= (pgm_read_byte(bitmap+(byte-width)+2)>>(8-y_offset));   // holen der daten und nach oben schieben
      			}
			if((right < GLCD_XPIXELS) && ((y * 8) < GLCD_YPIXELS))  //Bitmap abschneiden wenn auerhalb des Displays
				{
				glcdSetAddress(right,y);							//legt die Ram-Adresse fest auf der im Grafik-Controller geschrieben werden soll	
				glcdDataWrite(temp);                        		// ... schreibt Datenbyte
				}
      		byte++;                                    				// zeiger auf nchsten datensatz
    		}
  		}
}