|  | @@ -34,7 +34,6 @@ struct PrivateSpace {
 | 
	
		
			
				|  |  |  	} Offset;
 | 
	
		
			
				|  |  |  	uint8_t MADCtl, PageSize;
 | 
	
		
			
				|  |  |  	uint8_t Model;
 | 
	
		
			
				|  |  | -	bool Invert;
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Functions are not declared to minimize # of lines
 | 
	
	
		
			
				|  | @@ -189,20 +188,25 @@ static void Update24( struct GDS_Device* Device ) {
 | 
	
		
			
				|  |  |  #endif	
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void SetLayout( struct GDS_Device* Device, bool HFlip, bool VFlip, bool Rotate ) { 
 | 
	
		
			
				|  |  | +static void SetLayout( struct GDS_Device* Device, struct GDS_Layout *Layout ) { 
 | 
	
		
			
				|  |  |  	struct PrivateSpace *Private = (struct PrivateSpace*) Device->Private;
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  | -	Private->MADCtl = HFlip ? (Private->MADCtl | (1 << 7)) : (Private->MADCtl & ~(1 << 7));
 | 
	
		
			
				|  |  | -	Private->MADCtl = VFlip ? (Private->MADCtl | (1 << 6)) : (Private->MADCtl & ~(1 << 6));
 | 
	
		
			
				|  |  | -	Private->MADCtl = Rotate ? (Private->MADCtl | (1 << 5)) : (Private->MADCtl & ~(1 << 5));
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | +	if (Private->Model == ST7789) {
 | 
	
		
			
				|  |  | +		if (Layout->Rotate) Private->Offset.Width += Layout->HFlip ? 320 - Device->Width : 0;
 | 
	
		
			
				|  |  | +		else Private->Offset.Height += Layout->HFlip ? 320 - Device->Height : 0;
 | 
	
		
			
				|  |  | +		Device->WriteCommand( Device, Layout->Invert ? 0x20 : 0x21 );			
 | 
	
		
			
				|  |  | +		Private->MADCtl = Layout->ColorSwap ? (Private->MADCtl & ~(1 << 3)) : (Private->MADCtl | (1 << 3));
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		Device->WriteCommand( Device, Layout->Invert ? 0x21 : 0x20 );	
 | 
	
		
			
				|  |  | +		Private->MADCtl = Layout->ColorSwap ? (Private->MADCtl | (1 << 3)) : (Private->MADCtl & ~(1 << 3));		
 | 
	
		
			
				|  |  | +	}		
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	Private->MADCtl = Layout->HFlip ? (Private->MADCtl | (1 << 7)) : (Private->MADCtl & ~(1 << 7));
 | 
	
		
			
				|  |  | +	Private->MADCtl = Layout->VFlip ? (Private->MADCtl | (1 << 6)) : (Private->MADCtl & ~(1 << 6));
 | 
	
		
			
				|  |  | +	Private->MADCtl = Layout->Rotate ? (Private->MADCtl | (1 << 5)) : (Private->MADCtl & ~(1 << 5));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	Device->WriteCommand( Device, 0x36 );
 | 
	
		
			
				|  |  |  	WriteByte( Device, Private->MADCtl );
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	if (Private->Model == ST7789) {
 | 
	
		
			
				|  |  | -		if (Rotate) Private->Offset.Width += HFlip ? 320 - Device->Width : 0;
 | 
	
		
			
				|  |  | -		else Private->Offset.Height += HFlip ? 320 - Device->Height : 0;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #ifdef SHADOW_BUFFER
 | 
	
		
			
				|  |  |  	// force a full refresh (almost ...)
 | 
	
	
		
			
				|  | @@ -240,24 +244,22 @@ static bool Init( struct GDS_Device* Device ) {
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	// Sleepout + Booster
 | 
	
		
			
				|  |  |  	Device->WriteCommand( Device, 0x11 );
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  |  	// need BGR & Address Mode
 | 
	
		
			
				|  |  |  	Private->MADCtl = 1 << 3;
 | 
	
		
			
				|  |  |  	Device->WriteCommand( Device, 0x36 );
 | 
	
		
			
				|  |  |  	WriteByte( Device, Private->MADCtl );		
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  |  	// set flip modes & contrast
 | 
	
		
			
				|  |  |  	GDS_SetContrast( Device, 0x7f );
 | 
	
		
			
				|  |  | -	Device->SetLayout( Device, false, false, false );
 | 
	
		
			
				|  |  | +	struct GDS_Layout Layout = { };
 | 
	
		
			
				|  |  | +	Device->SetLayout( Device, &Layout );
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	// set screen depth (16/18)
 | 
	
		
			
				|  |  |  	Device->WriteCommand( Device, 0x3A );
 | 
	
		
			
				|  |  |  	if (Private->Model == ST7789) WriteByte( Device, Device->Depth == 24 ? 0x066 : 0x55 );
 | 
	
		
			
				|  |  |  	else WriteByte( Device, Device->Depth == 24 ? 0x06 : 0x05 );
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  | -	// no Display Inversion
 | 
	
		
			
				|  |  | -	Device->WriteCommand( Device, Private->Invert ? 0x21 : 0x20 );	
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  |  	// gone with the wind
 | 
	
		
			
				|  |  |  	Device->DisplayOn( Device );
 | 
	
		
			
				|  |  |  	Device->Update( Device );
 | 
	
	
		
			
				|  | @@ -299,7 +301,6 @@ struct GDS_Device* ST77xx_Detect(char *Driver, struct GDS_Device* Device) {
 | 
	
		
			
				|  |  |  		Device->Update = Update24;
 | 
	
		
			
				|  |  |  	} 	
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  | -	if (Model == ST7789 || strcasestr(Driver, "invert")) Private->Invert = true;
 | 
	
		
			
				|  |  |  	if (Model == ST7789) Device->SetContrast = SetContrast;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	return Device;
 |