diff --git a/batch.go b/batch.go
index c4b9c72e50b7c2abfc8787f48f7874353021a8f9..b52e12910d2d1d081d3ed06b8b2783f2b5c13daa 100644
--- a/batch.go
+++ b/batch.go
@@ -68,7 +68,7 @@ func (b *Batch) MakeTriangles(t Triangles) TargetTriangles {
 		b:         b,
 	}
 	bt.orig.Update(t)
-	bt.trans.Update(&bt.orig)
+	bt.trans.Update(bt.orig)
 	return bt
 }
 
@@ -82,26 +82,26 @@ func (b *Batch) MakePicture(p Picture) TargetPicture {
 
 type batchTriangles struct {
 	Triangles
-	orig, trans TrianglesData
+	orig, trans *TrianglesData
 
 	b *Batch
 }
 
 func (bt *batchTriangles) draw(bp *batchPicture) {
-	for i := range bt.trans {
+	for i := range *bt.trans {
 		transPos := bt.b.mat.Mul3x1(mgl32.Vec3{
-			float32(bt.orig[i].Position.X()),
-			float32(bt.orig[i].Position.Y()),
+			float32((*bt.orig)[i].Position.X()),
+			float32((*bt.orig)[i].Position.Y()),
 			1,
 		})
-		bt.trans[i].Position = V(float64(transPos.X()), float64(transPos.Y()))
-		bt.trans[i].Color = bt.orig[i].Color.Mul(bt.b.col)
+		(*bt.trans)[i].Position = V(float64(transPos.X()), float64(transPos.Y()))
+		(*bt.trans)[i].Color = (*bt.orig)[i].Color.Mul(bt.b.col)
 		if bp == nil {
-			bt.trans[i].Picture = V(math.Inf(+1), math.Inf(+1))
+			(*bt.trans)[i].Picture = V(math.Inf(+1), math.Inf(+1))
 		}
 	}
 
-	bt.Triangles.Update(&bt.trans)
+	bt.Triangles.Update(bt.trans)
 
 	cont := bt.b.cont.Triangles
 	cont.SetLen(cont.Len() + bt.Triangles.Len())
diff --git a/data.go b/data.go
index 6f295356036d536c818946ec124e219622b798a4..a97f53f71d9862a2270787ef182dbd792f719faf 100644
--- a/data.go
+++ b/data.go
@@ -21,8 +21,8 @@ type TrianglesData []struct {
 //
 // Prefer this function to make(TrianglesData, len), because make zeros them, while this function
 // does a correct intialization.
-func MakeTrianglesData(len int) TrianglesData {
-	td := TrianglesData{}
+func MakeTrianglesData(len int) *TrianglesData {
+	td := &TrianglesData{}
 	td.SetLen(len)
 	return td
 }
@@ -132,10 +132,10 @@ type PictureData struct {
 }
 
 // MakePictureData creates a zero-initialized PictureData covering the given rectangle.
-func MakePictureData(rect Rect) PictureData {
+func MakePictureData(rect Rect) *PictureData {
 	w := int(math.Ceil(rect.Pos.X()+rect.Size.X())) - int(math.Floor(rect.Pos.X()))
 	h := int(math.Ceil(rect.Pos.Y()+rect.Size.Y())) - int(math.Floor(rect.Pos.Y()))
-	pd := PictureData{
+	pd := &PictureData{
 		Stride: w,
 		Rect:   rect,
 	}
@@ -161,7 +161,7 @@ func verticalFlip(nrgba *image.NRGBA) {
 // PictureDataFromImage converts an image.Image into PictureData.
 //
 // The resulting PictureData's Bounds will be the equivalent of the supplied image.Image's Bounds.
-func PictureDataFromImage(img image.Image) PictureData {
+func PictureDataFromImage(img image.Image) *PictureData {
 	var nrgba *image.NRGBA
 	if nrgbaImg, ok := img.(*image.NRGBA); ok {
 		nrgba = nrgbaImg
@@ -195,9 +195,9 @@ func PictureDataFromImage(img image.Image) PictureData {
 // lossy, because PictureData works with unit-sized pixels).
 //
 // Bounds are preserved.
-func PictureDataFromPicture(pic Picture) PictureData {
+func PictureDataFromPicture(pic Picture) *PictureData {
 	if pd, ok := pic.(*PictureData); ok {
-		return *pd
+		return pd
 	}
 
 	bounds := pic.Bounds()