(Mostly) under the hoood improvements #3
@ -4,7 +4,7 @@ import "image"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Application represents an application.
 | 
					// Application represents an application.
 | 
				
			||||||
type Application struct {
 | 
					type Application struct {
 | 
				
			||||||
	Buffer
 | 
						DamageBuffer
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	title string
 | 
						title string
 | 
				
			||||||
	icons []image.Image
 | 
						icons []image.Image
 | 
				
			||||||
@ -22,7 +22,7 @@ func (application *Application) Run () (
 | 
				
			|||||||
	width, height := application.Size()
 | 
						width, height := application.Size()
 | 
				
			||||||
	if width  < 1 { width  = 80 }
 | 
						if width  < 1 { width  = 80 }
 | 
				
			||||||
	if height < 1 { height = 20 }
 | 
						if height < 1 { height = 20 }
 | 
				
			||||||
	application.Buffer.SetSize(width, height)
 | 
						application.DamageBuffer.SetSize(width, height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	application.config.load()
 | 
						application.config.load()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										58
									
								
								buffer.go
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								buffer.go
									
									
									
									
									
								
							@ -53,11 +53,22 @@ func (cell Cell) Rune () (content rune) {
 | 
				
			|||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Buffer is a two dimensional text buffer that stores a grid of cells, as well
 | 
					// Buffer represents a two dimensional text buffer.
 | 
				
			||||||
// as information stating whether each cell is clean or dirty. Cells are dirty
 | 
					type Buffer interface {
 | 
				
			||||||
// by default, are only clean when marked as clean, and become dirty again when
 | 
						Size     () (with, height int)
 | 
				
			||||||
// they are altered in some way.
 | 
						Cell     (x, y int) (cell Cell)
 | 
				
			||||||
type Buffer struct {
 | 
						SetColor (x, y int, color Color)
 | 
				
			||||||
 | 
						SetSize  (with, height int)
 | 
				
			||||||
 | 
						SetStyle (x, y int, style Style)
 | 
				
			||||||
 | 
						SetRune  (x, y int, content rune)
 | 
				
			||||||
 | 
						Clear    ()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DamageBuffer is a two dimensional text buffer that stores a grid of cells, as
 | 
				
			||||||
 | 
					// well as information stating whether each cell is clean or dirty. Cells are
 | 
				
			||||||
 | 
					// dirty by default, are only clean when marked as clean, and become dirty again
 | 
				
			||||||
 | 
					// when they are altered in some way.
 | 
				
			||||||
 | 
					type DamageBuffer struct {
 | 
				
			||||||
	content []Cell
 | 
						content []Cell
 | 
				
			||||||
	clean   []bool
 | 
						clean   []bool
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -73,7 +84,7 @@ type Buffer struct {
 | 
				
			|||||||
	lock sync.RWMutex
 | 
						lock sync.RWMutex
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (buffer *Buffer) isOutOfBounds (x, y int) (outOfBounds bool) {
 | 
					func (buffer *DamageBuffer) isOutOfBounds (x, y int) (outOfBounds bool) {
 | 
				
			||||||
	outOfBounds =
 | 
						outOfBounds =
 | 
				
			||||||
		x < 0 ||
 | 
							x < 0 ||
 | 
				
			||||||
		y < 0 ||
 | 
							y < 0 ||
 | 
				
			||||||
@ -83,7 +94,7 @@ func (buffer *Buffer) isOutOfBounds (x, y int) (outOfBounds bool) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Size returns the width and height of the buffer.
 | 
					// Size returns the width and height of the buffer.
 | 
				
			||||||
func (buffer *Buffer) Size () (width, height int) {
 | 
					func (buffer *DamageBuffer) Size () (width, height int) {
 | 
				
			||||||
	buffer.lock.RLock()
 | 
						buffer.lock.RLock()
 | 
				
			||||||
	defer buffer.lock.RUnlock()
 | 
						defer buffer.lock.RUnlock()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -94,14 +105,14 @@ func (buffer *Buffer) Size () (width, height int) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// SetDot sets the buffer's text insertion position relative to the buffer
 | 
					// SetDot sets the buffer's text insertion position relative to the buffer
 | 
				
			||||||
// origin point (0, 0).
 | 
					// origin point (0, 0).
 | 
				
			||||||
func (buffer *Buffer) SetDot (x, y int) {
 | 
					func (buffer *DamageBuffer) SetDot (x, y int) {
 | 
				
			||||||
	buffer.dot.x = x
 | 
						buffer.dot.x = x
 | 
				
			||||||
	buffer.dot.y = y
 | 
						buffer.dot.y = y
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Cell returns the cell at the specified x and y coordinates. If the
 | 
					// Cell returns the cell at the specified x and y coordinates. If the
 | 
				
			||||||
// coordinates are out of bounds, this method will return a blank cell.
 | 
					// coordinates are out of bounds, this method will return a blank cell.
 | 
				
			||||||
func (buffer *Buffer) Cell (x, y int) (cell Cell) {
 | 
					func (buffer *DamageBuffer) Cell (x, y int) (cell Cell) {
 | 
				
			||||||
	buffer.lock.RLock()
 | 
						buffer.lock.RLock()
 | 
				
			||||||
	defer buffer.lock.RUnlock()
 | 
						defer buffer.lock.RUnlock()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -111,7 +122,7 @@ func (buffer *Buffer) Cell (x, y int) (cell Cell) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetColor sets the color of the cell at the specified x and y coordinates.
 | 
					// SetColor sets the color of the cell at the specified x and y coordinates.
 | 
				
			||||||
func (buffer *Buffer) SetColor (x, y int, color Color) {
 | 
					func (buffer *DamageBuffer) SetColor (x, y int, color Color) {
 | 
				
			||||||
	buffer.lock.RLock()
 | 
						buffer.lock.RLock()
 | 
				
			||||||
	defer buffer.lock.RUnlock()
 | 
						defer buffer.lock.RUnlock()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -123,7 +134,7 @@ func (buffer *Buffer) SetColor (x, y int, color Color) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// SetSize sets the width and height of the buffer. This clears all data in the
 | 
					// SetSize sets the width and height of the buffer. This clears all data in the
 | 
				
			||||||
// buffer. If the width or height is negative, this method does nothing.
 | 
					// buffer. If the width or height is negative, this method does nothing.
 | 
				
			||||||
func (buffer *Buffer) SetSize (width, height int) {
 | 
					func (buffer *DamageBuffer) SetSize (width, height int) {
 | 
				
			||||||
	buffer.lock.Lock()
 | 
						buffer.lock.Lock()
 | 
				
			||||||
	defer buffer.lock.Unlock()
 | 
						defer buffer.lock.Unlock()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -138,7 +149,7 @@ func (buffer *Buffer) SetSize (width, height int) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetStyle sets the style of the cell at the specified x and y coordinates.
 | 
					// SetStyle sets the style of the cell at the specified x and y coordinates.
 | 
				
			||||||
func (buffer *Buffer) SetStyle (x, y int, style Style) {
 | 
					func (buffer *DamageBuffer) SetStyle (x, y int, style Style) {
 | 
				
			||||||
	buffer.lock.RLock()
 | 
						buffer.lock.RLock()
 | 
				
			||||||
	defer buffer.lock.RUnlock()
 | 
						defer buffer.lock.RUnlock()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -149,14 +160,27 @@ func (buffer *Buffer) SetStyle (x, y int, style Style) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetRune sets the rune of the cell at the specified x and y coordinates.
 | 
					// SetRune sets the rune of the cell at the specified x and y coordinates.
 | 
				
			||||||
func (buffer *Buffer) SetRune (x, y int, content rune) {
 | 
					func (buffer *DamageBuffer) SetRune (x, y int, content rune) {
 | 
				
			||||||
	buffer.lock.RLock()
 | 
						buffer.lock.RLock()
 | 
				
			||||||
	defer buffer.lock.RUnlock()
 | 
						defer buffer.lock.RUnlock()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	buffer.setRune(x, y, content)
 | 
						buffer.setRune(x, y, content)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (buffer *Buffer) setRune (x, y int, content rune) {
 | 
					// Clear resets the entire buffer.
 | 
				
			||||||
 | 
					func (buffer *DamageBuffer) Clear () {
 | 
				
			||||||
 | 
						buffer.lock.RLock()
 | 
				
			||||||
 | 
						defer buffer.lock.RUnlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for index := 0; index < len(buffer.content); index ++ {
 | 
				
			||||||
 | 
							buffer.clean[index] = false
 | 
				
			||||||
 | 
							buffer.content[index] = Cell {
 | 
				
			||||||
 | 
								color: ColorForeground,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (buffer *DamageBuffer) setRune (x, y int, content rune) {
 | 
				
			||||||
	if buffer.isOutOfBounds(x, y) { return }
 | 
						if buffer.isOutOfBounds(x, y) { return }
 | 
				
			||||||
	index := x + y * buffer.width
 | 
						index := x + y * buffer.width
 | 
				
			||||||
	buffer.clean[index] = buffer.content[index].content == content
 | 
						buffer.clean[index] = buffer.content[index].content == content
 | 
				
			||||||
@ -165,7 +189,7 @@ func (buffer *Buffer) setRune (x, y int, content rune) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Write writes data stored in a byte slice to the buffer at the current dot
 | 
					// Write writes data stored in a byte slice to the buffer at the current dot
 | 
				
			||||||
// position. This makes Buffer an io.Writer.
 | 
					// position. This makes Buffer an io.Writer.
 | 
				
			||||||
func (buffer *Buffer) Write (bytes []byte) (bytesWritten int, err error) {
 | 
					func (buffer *DamageBuffer) Write (bytes []byte) (bytesWritten int, err error) {
 | 
				
			||||||
	buffer.lock.RLock()
 | 
						buffer.lock.RLock()
 | 
				
			||||||
	defer buffer.lock.RUnlock()
 | 
						defer buffer.lock.RUnlock()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -183,7 +207,7 @@ func (buffer *Buffer) Write (bytes []byte) (bytesWritten int, err error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Clean returns whether or not the cell at the specified x and y coordinates is
 | 
					// Clean returns whether or not the cell at the specified x and y coordinates is
 | 
				
			||||||
// clean.
 | 
					// clean.
 | 
				
			||||||
func (buffer *Buffer) Clean (x, y int) (clean bool) {
 | 
					func (buffer *DamageBuffer) Clean (x, y int) (clean bool) {
 | 
				
			||||||
	buffer.lock.RLock()
 | 
						buffer.lock.RLock()
 | 
				
			||||||
	defer buffer.lock.RUnlock()
 | 
						defer buffer.lock.RUnlock()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -193,7 +217,7 @@ func (buffer *Buffer) Clean (x, y int) (clean bool) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MarkClean marks the cell at the specified x and y coordinates as clean.
 | 
					// MarkClean marks the cell at the specified x and y coordinates as clean.
 | 
				
			||||||
func (buffer *Buffer) MarkClean (x, y int) {
 | 
					func (buffer *DamageBuffer) MarkClean (x, y int) {
 | 
				
			||||||
	buffer.lock.RLock()
 | 
						buffer.lock.RLock()
 | 
				
			||||||
	defer buffer.lock.RUnlock()
 | 
						defer buffer.lock.RUnlock()
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
				
			|||||||
@ -64,9 +64,9 @@ func (config *Config) load () {
 | 
				
			|||||||
		// green
 | 
							// green
 | 
				
			||||||
		color.RGBA { R: 0x00, G: 0xFF, B: 0x00, A: 0xFF },
 | 
							color.RGBA { R: 0x00, G: 0xFF, B: 0x00, A: 0xFF },
 | 
				
			||||||
		// blue
 | 
							// blue
 | 
				
			||||||
		color.RGBA { R: 0x00, G: 0x00, B: 0xFF, A: 0xFF },
 | 
							color.RGBA { R: 0x00, G: 0x80, B: 0xFF, A: 0xFF },
 | 
				
			||||||
		// purple
 | 
							// purple
 | 
				
			||||||
		color.RGBA { R: 0x80, G: 0x00, B: 0xFF, A: 0xFF },
 | 
							color.RGBA { R: 0x80, G: 0x40, B: 0xFF, A: 0xFF },
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	config.fontName = ""
 | 
						config.fontName = ""
 | 
				
			||||||
	config.fontSize = 11
 | 
						config.fontSize = 11
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user