diff --git a/batch.go b/batch.go
index b0d5e0a6b758126b507d6d6d87f32441906a7744..b7c2ecc571e94665d4c9b9e71ee10ea3ac637a02 100644
--- a/batch.go
+++ b/batch.go
@@ -53,13 +53,11 @@ func (b *Batch) MakeTriangles(t Triangles) Triangles {
 	}
 }
 
-// SetPicture sets the current Picture that will be used with the following draws. The underlying
-// Texture of this Picture must be same as the underlying Texture of the Batch's Picture.
+// SetPicture sets the current Picture that will be used with the following draws. The original
+// Picture of this Picture (the one from which p was obtained by slicing) must be same as the
+// original Picture of the Batch's Picture.
 func (b *Batch) SetPicture(p *Picture) {
-	if p == nil {
-		return
-	}
-	if p.Texture() != b.fixpic.Texture() {
+	if p != nil && p.Texture() != b.fixpic.Texture() {
 		panic("batch: attempted to draw with a different underlying Picture")
 	}
 	b.pic = p
diff --git a/canvas.go b/canvas.go
index c93156798545fc4504f6317cb9cb000f3b09c488..aa9b19907085bccf0a6a29ad2e4471786b7f2945 100644
--- a/canvas.go
+++ b/canvas.go
@@ -9,7 +9,7 @@ import (
 	"github.com/pkg/errors"
 )
 
-// Canvas is basically a Picture that you can draw on.
+// Canvas is basically a Picture that you can draw onto.
 //
 // Canvas supports TrianglesPosition, TrianglesColor and TrianglesTexture.
 type Canvas struct {
@@ -72,7 +72,7 @@ func NewCanvas(width, height float64, smooth bool) *Canvas {
 	return c
 }
 
-// SetSize resizes the Canvas. The original content will be stretched to the new size.
+// SetSize resizes the Canvas. The original content will be stretched to fit the new size.
 func (c *Canvas) SetSize(width, height float64) {
 	if V(width, height) == V(c.Size()) {
 		return
@@ -105,7 +105,8 @@ func (c *Canvas) Size() (width, height float64) {
 }
 
 // Content returns a Picture that contains the content of this Canvas. The returned Picture changes
-// as you draw onto the Canvas, so there is no real need to call this method more than once.
+// as you draw onto the Canvas, so there is no real need to call this method more than once (but it
+// might be beneficial to your code to do so).
 func (c *Canvas) Content() *Picture {
 	tex := c.f.Texture()
 	return &Picture{
@@ -114,7 +115,7 @@ func (c *Canvas) Content() *Picture {
 	}
 }
 
-// Clear fill the whole Canvas with on specified color.
+// Clear fills the whole Canvas with one specified color.
 func (c *Canvas) Clear(col color.Color) {
 	mainthread.CallNonBlock(func() {
 		c.f.Begin()
diff --git a/color.go b/color.go
index c0f7f1efd09cbcb544c713606207efe35d995852..86c9ca1311ae7146ba2348bd64041d5c5669e097 100644
--- a/color.go
+++ b/color.go
@@ -52,7 +52,7 @@ func (c NRGBA) Scaled(scale float64) NRGBA {
 	}
 }
 
-// RGBA returns alpha-premultiplied red, green, blue and alpha components of a color.
+// RGBA returns alpha-premultiplied red, green, blue and alpha components of the NRGBA color.
 func (c NRGBA) RGBA() (r, g, b, a uint32) {
 	c.R = clamp(c.R, 0, 1)
 	c.G = clamp(c.G, 0, 1)
diff --git a/geometry.go b/geometry.go
index 0ee8b4b71d1cdeb8bc1ff468aec9640bb50f91d2..64db6fc7eacac3f432768eed1dec882a170e35b1 100644
--- a/geometry.go
+++ b/geometry.go
@@ -6,7 +6,7 @@ import (
 	"math/cmplx"
 )
 
-// Vec is a 2d vector type. It is unusually implemented as complex128 for convenience. Since
+// Vec is a 2D vector type. It is unusually implemented as complex128 for convenience. Since
 // Go does not allow operator overloading, implementing vector as a struct leads to a bunch of
 // methods for addition, subtraction and multiplication of vectors. With complex128, much of
 // this functionality is given through operators.
@@ -37,7 +37,7 @@ func V(x, y float64) Vec {
 	return Vec(complex(x, y))
 }
 
-// String returns the string representation of a vector u.
+// String returns the string representation of the vector u.
 //
 //   u := pixel.V(4.5, -1.3)
 //   u.String()     // returns "Vec(4.5, -1.3)"
@@ -46,27 +46,27 @@ func (u Vec) String() string {
 	return fmt.Sprintf("Vec(%v, %v)", u.X(), u.Y())
 }
 
-// X returns the x coordinate of a vector u.
+// X returns the x coordinate of the vector u.
 func (u Vec) X() float64 {
 	return real(u)
 }
 
-// Y returns the y coordinate of a vector u.
+// Y returns the y coordinate of the vector u.
 func (u Vec) Y() float64 {
 	return imag(u)
 }
 
-// XY returns the components of a vector in two return values.
+// XY returns the components of the vector in two return values.
 func (u Vec) XY() (x, y float64) {
 	return real(u), imag(u)
 }
 
-// Len returns the length of a vector u.
+// Len returns the length of the vector u.
 func (u Vec) Len() float64 {
 	return cmplx.Abs(complex128(u))
 }
 
-// Angle returns the angle between a vector u and the x-axis. The result is in the range [-Pi, Pi].
+// Angle returns the angle between the vector u and the x-axis. The result is in the range [-Pi, Pi].
 func (u Vec) Angle() float64 {
 	return cmplx.Phase(complex128(u))
 }
@@ -76,12 +76,12 @@ func (u Vec) Unit() Vec {
 	return u / V(u.Len(), 0)
 }
 
-// Scaled returns a vector u multiplied by c.
+// Scaled returns the vector u multiplied by c.
 func (u Vec) Scaled(c float64) Vec {
 	return u * V(c, 0)
 }
 
-// Rotated returns a vector u rotated by the given angle in radians.
+// Rotated returns the vector u rotated by the given angle in radians.
 func (u Vec) Rotated(angle float64) Vec {
 	sin, cos := math.Sincos(angle)
 	return u * V(cos, sin)
@@ -97,7 +97,7 @@ func (u Vec) Cross(v Vec) float64 {
 	return u.X()*v.Y() - v.X()*u.Y()
 }
 
-// Rect is a 2d rectangle aligned with the axis of the coordinate system. It has a position
+// Rect is a 2D rectangle aligned with the axes of the coordinate system. It has a position
 // and a size.
 //
 // You can manipulate the position and the size using the usual vector operations.
@@ -105,7 +105,7 @@ type Rect struct {
 	Pos, Size Vec
 }
 
-// R returns a new 2d rectangle with the given position (x, y) and size (w, h).
+// R returns a new Rect with given position (x, y) and size (w, h).
 func R(x, y, w, h float64) Rect {
 	return Rect{
 		Pos:  V(x, y),
@@ -113,7 +113,7 @@ func R(x, y, w, h float64) Rect {
 	}
 }
 
-// String returns the string representation of a rectangle.
+// String returns the string representation of the rectangle.
 //
 //   r := pixel.R(100, 50, 200, 300)
 //   r.String()     // returns "Rect(100, 50, 200, 300)"
@@ -122,32 +122,32 @@ func (r Rect) String() string {
 	return fmt.Sprintf("Rect(%v, %v, %v, %v)", r.X(), r.Y(), r.W(), r.H())
 }
 
-// X returns the x coordinate of the position of a rectangle.
+// X returns the x coordinate of the position of the rectangle.
 func (r Rect) X() float64 {
 	return r.Pos.X()
 }
 
-// Y returns the y coordinate of the position of a rectangle
+// Y returns the y coordinate of the position of the rectangle
 func (r Rect) Y() float64 {
 	return r.Pos.Y()
 }
 
-// W returns the width of a rectangle.
+// W returns the width of the rectangle.
 func (r Rect) W() float64 {
 	return r.Size.X()
 }
 
-// H returns the height of a rectangle.
+// H returns the height of the rectangle.
 func (r Rect) H() float64 {
 	return r.Size.Y()
 }
 
-// XYWH returns all of the four components of a rectangle in four return values.
+// XYWH returns all of the four components of the rectangle in four return values.
 func (r Rect) XYWH() (x, y, w, h float64) {
 	return r.X(), r.Y(), r.W(), r.H()
 }
 
-// Center returns the position of the center of a rectangle.
+// Center returns the position of the center of the rectangle.
 func (r Rect) Center() Vec {
 	return r.Pos + r.Size.Scaled(0.5)
 }
diff --git a/input.go b/input.go
index 37bcb04ef2810326c02909db316c9030dd1f0892..e1f7c576d521dee8620e694c136f5f16de8a9402 100644
--- a/input.go
+++ b/input.go
@@ -5,17 +5,17 @@ import (
 	"github.com/go-gl/glfw/v3.2/glfw"
 )
 
-// Pressed returns whether a button is currently pressed down.
+// Pressed returns whether button is currently pressed down.
 func (w *Window) Pressed(button Button) bool {
 	return w.currInp.buttons[button]
 }
 
-// JustPressed returns whether a button has just been pressed down.
+// JustPressed returns whether button has just been pressed down.
 func (w *Window) JustPressed(button Button) bool {
 	return w.currInp.buttons[button] && !w.prevInp.buttons[button]
 }
 
-// JustReleased returns whether a button has just been released up.
+// JustReleased returns whether button has just been released up.
 func (w *Window) JustReleased(button Button) bool {
 	return !w.currInp.buttons[button] && w.prevInp.buttons[button]
 }
diff --git a/interface.go b/interface.go
index ab642cee4ac2b14887f11f62a4a7e011c43de3e4..86cb037e305ec4b7f47b90052b72dd249c3566c4 100644
--- a/interface.go
+++ b/interface.go
@@ -6,6 +6,8 @@ import "image/color"
 //
 // You can notice, that there are no "drawing" methods in a Target. That's because all drawing
 // happens indirectly through Triangles instance generated via MakeTriangles method.
+//
+// If no transforms are applied, the drawing are of a Target is the rectangle (-1, -1, +1, +1).
 type Target interface {
 	// MakeTriangles generates a specialized copy of the provided Triangles.
 	//
diff --git a/monitor.go b/monitor.go
index 5b003ff2a0ccfa92ef7a48406eb36dcab8dae8d7..c2ad61cf9d68020991529255db753c83ef4d580b 100644
--- a/monitor.go
+++ b/monitor.go
@@ -31,7 +31,7 @@ func Monitors() []*Monitor {
 	return monitors
 }
 
-// Name returns a human-readable name of a monitor.
+// Name returns a human-readable name of the Monitor.
 func (m *Monitor) Name() string {
 	name := mainthread.CallVal(func() interface{} {
 		return m.monitor.GetName()
@@ -39,7 +39,7 @@ func (m *Monitor) Name() string {
 	return name
 }
 
-// PhysicalSize returns the size of the display area of a monitor in millimeters.
+// PhysicalSize returns the size of the display area of the Monitor in millimeters.
 func (m *Monitor) PhysicalSize() (width, height float64) {
 	var wi, hi int
 	mainthread.Call(func() {
@@ -50,7 +50,7 @@ func (m *Monitor) PhysicalSize() (width, height float64) {
 	return
 }
 
-// Position returns the position of the upper-left corner of a monitor in screen coordinates.
+// Position returns the position of the upper-left corner of the Monitor in screen coordinates.
 func (m *Monitor) Position() (x, y float64) {
 	var xi, yi int
 	mainthread.Call(func() {
@@ -61,7 +61,7 @@ func (m *Monitor) Position() (x, y float64) {
 	return
 }
 
-// Size returns the resolution of a monitor in pixels.
+// Size returns the resolution of the Monitor in pixels.
 func (m *Monitor) Size() (width, height float64) {
 	mode := mainthread.CallVal(func() interface{} {
 		return m.monitor.GetVideoMode()
@@ -71,7 +71,7 @@ func (m *Monitor) Size() (width, height float64) {
 	return
 }
 
-// BitDepth returns the number of bits per color of a monitor.
+// BitDepth returns the number of bits per color of the Monitor.
 func (m *Monitor) BitDepth() (red, green, blue int) {
 	mode := mainthread.CallVal(func() interface{} {
 		return m.monitor.GetVideoMode()
@@ -82,7 +82,7 @@ func (m *Monitor) BitDepth() (red, green, blue int) {
 	return
 }
 
-// RefreshRate returns the refresh frequency of a monitor in Hz (refreshes/second).
+// RefreshRate returns the refresh frequency of the Monitor in Hz (refreshes/second).
 func (m *Monitor) RefreshRate() (rate float64) {
 	mode := mainthread.CallVal(func() interface{} {
 		return m.monitor.GetVideoMode()
diff --git a/picture.go b/picture.go
index 1bafafbb46fd50e334e1ed1ea6357a13e6daa786..c90b232e923fb113500265f84eb9f5bdb7ef4635 100644
--- a/picture.go
+++ b/picture.go
@@ -10,15 +10,15 @@ import (
 
 // Picture is a raster picture. It is usually used with sprites.
 //
-// A picture is created from an image.Image, that can be either loaded from a file, or
-// generated. After the creation a picture can be sliced (slicing creates a "sub-picture"
-// from a picture) into smaller pictures.
+// A Picture is created from an image.Image, that can be either loaded from a file, or
+// generated. After the creation, Pictures can be sliced (slicing creates a "sub-Picture"
+// from a Picture) into smaller Pictures.
 type Picture struct {
 	texture *pixelgl.Texture
 	bounds  Rect
 }
 
-// NewPicture creates a new picture from an image.Image.
+// NewPicture creates a new Picture from an image.Image.
 func NewPicture(img image.Image, smooth bool) *Picture {
 	// convert the image to NRGBA format
 	bounds := img.Bounds()
@@ -80,16 +80,16 @@ func (p *Picture) Image() *image.NRGBA {
 	return nrgba
 }
 
-// Texture returns a pointer to the underlying OpenGL texture of a picture.
+// Texture returns a pointer to the underlying OpenGL texture of the Picture.
 func (p *Picture) Texture() *pixelgl.Texture {
 	return p.texture
 }
 
-// Slice returns a picture within the supplied rectangle of the original picture. The original
-// and the sliced picture share the same texture.
+// Slice returns a Picture within the supplied rectangle of the original picture. The original
+// and the sliced Picture share the same texture.
 //
-// For example, suppose we have a 100x200 pixels picture. If we slice it with rectangle (50,
-// 100, 50, 100), we get the upper-right quadrant of the original picture.
+// For example, suppose we have a 100x200 pixels Picture. If we slice it with rectangle (50,
+// 100, 50, 100), we get the upper-right quadrant of the original Picture.
 func (p *Picture) Slice(slice Rect) *Picture {
 	return &Picture{
 		texture: p.texture,
@@ -97,9 +97,9 @@ func (p *Picture) Slice(slice Rect) *Picture {
 	}
 }
 
-// Bounds returns the bounding rectangle of this picture relative to the most original picture.
+// Bounds returns the bounding rectangle of this Picture relative to the most original picture.
 //
-// If the original picture gets sliced with the return value of this method, this picture will
+// If the original Picture was sliced with the return value of this method, this Picture would
 // be obtained.
 func (p *Picture) Bounds() Rect {
 	return p.bounds
diff --git a/run.go b/run.go
index 1dada5c93b46a61d48aa8273078155308bdcd19b..6b4a3f5c22524f555e342b9a31f8822a61316fa6 100644
--- a/run.go
+++ b/run.go
@@ -6,7 +6,7 @@ import (
 )
 
 // Run is essentialy the "main" function of Pixel. It exists mainly due to the technical
-// limitations of OpenGL and operating systems, in short, all graphics and window manipulating
+// limitations of OpenGL and operating systems. In short, all graphics and window manipulating
 // calls must be done from the main thread. Run makes this possible.
 //
 // Call this function from the main function of your application. This is necessary, so that
@@ -24,7 +24,7 @@ import (
 //   }
 //
 // You can spawn any number of goroutines from you run function and interact with Pixel
-// concurrently.  The only condition is that the Run function must be called from your main
+// concurrently.  The only condition is that the Run function is be called from your main
 // function.
 func Run(run func()) {
 	defer glfw.Terminate()
diff --git a/window.go b/window.go
index e167a252ab61617943362d4c3a09cf1e10cd2182..89062ba0b4f3e100ca6b650d8549010ee410bd31 100644
--- a/window.go
+++ b/window.go
@@ -77,9 +77,9 @@ type Window struct {
 
 var currentWindow *Window
 
-// NewWindow creates a new window with it's properties specified in the provided config.
+// NewWindow creates a new Window with it's properties specified in the provided config.
 //
-// If window creation fails, an error is returned.
+// If Window creation fails, an error is returned (e.g. due to unavailable graphics device).
 func NewWindow(config WindowConfig) (*Window, error) {
 	bool2int := map[bool]int{
 		true:  glfw.True,
@@ -164,14 +164,14 @@ func NewWindow(config WindowConfig) (*Window, error) {
 	return w, nil
 }
 
-// Destroy destroys a window. The window can't be used any further.
+// Destroy destroys the Window. The Window can't be used any further.
 func (w *Window) Destroy() {
 	mainthread.Call(func() {
 		w.window.Destroy()
 	})
 }
 
-// Clear clears the window with a color.
+// Clear clears the Window with a color.
 func (w *Window) Clear(c color.Color) {
 	w.canvas.Clear(c)
 }
@@ -202,41 +202,41 @@ func (w *Window) Update() {
 	w.updateInput()
 }
 
-// SetClosed sets the closed flag of a window.
+// SetClosed sets the closed flag of the Window.
 //
-// This is usefull when overriding the user's attempt to close a window, or just to close a
-// window from within a program.
+// This is usefull when overriding the user's attempt to close the Window, or just to close the
+// Window from within the program.
 func (w *Window) SetClosed(closed bool) {
 	mainthread.Call(func() {
 		w.window.SetShouldClose(closed)
 	})
 }
 
-// Closed returns the closed flag of a window, which reports whether the window should be closed.
+// Closed returns the closed flag of the Window, which reports whether the Window should be closed.
 //
-// The closed flag is automatically set when a user attempts to close a window.
+// The closed flag is automatically set when a user attempts to close the Window.
 func (w *Window) Closed() bool {
 	return mainthread.CallVal(func() interface{} {
 		return w.window.ShouldClose()
 	}).(bool)
 }
 
-// SetTitle changes the title of a window.
+// SetTitle changes the title of the Window.
 func (w *Window) SetTitle(title string) {
 	mainthread.Call(func() {
 		w.window.SetTitle(title)
 	})
 }
 
-// SetSize resizes a window to the specified size in pixels.  In case of a fullscreen window,
-// it changes the resolution of that window.
+// SetSize resizes the client area of the Window to the specified size in pixels. In case of a
+// fullscreen Window, it changes the resolution of that Window.
 func (w *Window) SetSize(width, height float64) {
 	mainthread.Call(func() {
 		w.window.SetSize(int(width), int(height))
 	})
 }
 
-// Size returns the size of the client area of a window (the part you can draw on).
+// Size returns the size of the client area of the Window (the part you can draw on).
 func (w *Window) Size() (width, height float64) {
 	mainthread.Call(func() {
 		wi, hi := w.window.GetSize()
@@ -246,14 +246,14 @@ func (w *Window) Size() (width, height float64) {
 	return width, height
 }
 
-// Show makes a window visible if it was hidden.
+// Show makes the Window visible if it was hidden.
 func (w *Window) Show() {
 	mainthread.Call(func() {
 		w.window.Show()
 	})
 }
 
-// Hide hides a window if it was visible.
+// Hide hides the Window if it was visible.
 func (w *Window) Hide() {
 	mainthread.Call(func() {
 		w.window.Hide()
@@ -291,11 +291,11 @@ func (w *Window) setWindowed() {
 	})
 }
 
-// SetMonitor sets a window fullscreen on a given monitor. If the monitor is nil, the window
-// will be resored to windowed instead.
+// SetMonitor sets the Window fullscreen on the given Monitor. If the Monitor is nil, the Window
+// will be resored to windowed state instead.
 //
-// Note, that there is nothing about the resolution of the fullscreen window. The window is
-// automatically set to the monitor's resolution. If you want a different resolution, you need
+// Note, that there is nothing about the resolution of the fullscreen Window. The Window is
+// automatically set to the Monitor's resolution. If you want a different resolution, you need
 // to set it manually with SetSize method.
 func (w *Window) SetMonitor(monitor *Monitor) {
 	if w.Monitor() != monitor {
@@ -307,12 +307,12 @@ func (w *Window) SetMonitor(monitor *Monitor) {
 	}
 }
 
-// IsFullscreen returns true if the window is in the fullscreen mode.
+// IsFullscreen returns true if the Window is in fullscreen mode.
 func (w *Window) IsFullscreen() bool {
 	return w.Monitor() != nil
 }
 
-// Monitor returns a monitor a fullscreen window is on. If the window is not fullscreen, this
+// Monitor returns a monitor the Window is fullscreen is on. If the Window is not fullscreen, this
 // function returns nil.
 func (w *Window) Monitor() *Monitor {
 	monitor := mainthread.CallVal(func() interface{} {
@@ -326,28 +326,28 @@ func (w *Window) Monitor() *Monitor {
 	}
 }
 
-// Focus brings a window to the front and sets input focus.
+// Focus brings the Window to the front and sets input focus.
 func (w *Window) Focus() {
 	mainthread.Call(func() {
 		w.window.Focus()
 	})
 }
 
-// Focused returns true if a window has input focus.
+// Focused returns true if the Window has input focus.
 func (w *Window) Focused() bool {
 	return mainthread.CallVal(func() interface{} {
 		return w.window.GetAttrib(glfw.Focused) == glfw.True
 	}).(bool)
 }
 
-// Maximize puts a windowed window to a maximized state.
+// Maximize puts the Window window to the maximized state.
 func (w *Window) Maximize() {
 	mainthread.Call(func() {
 		w.window.Maximize()
 	})
 }
 
-// Restore restores a windowed window from a maximized state.
+// Restore restores the Window window from the maximized state.
 func (w *Window) Restore() {
 	mainthread.Call(func() {
 		w.window.Restore()
@@ -365,7 +365,7 @@ func (w *Window) begin() {
 
 // Note: must be called inside the main thread.
 func (w *Window) end() {
-	// nothing really
+	// nothing, really
 }
 
 // MakeTriangles generates a specialized copy of the supplied triangles that will draw onto this
@@ -376,7 +376,7 @@ func (w *Window) MakeTriangles(t Triangles) Triangles {
 	return w.canvas.MakeTriangles(t)
 }
 
-// SetPicture sets a Picture that will be used in subsequent drawings onto the window.
+// SetPicture sets a Picture that will be used in subsequent drawings onto the Window.
 func (w *Window) SetPicture(p *Picture) {
 	w.canvas.SetPicture(p)
 }