From 40310e2132ea0b1a48661883e0fbc845488c51eb Mon Sep 17 00:00:00 2001
From: archshift <gh@archshift.com>
Date: Sun, 10 May 2015 18:59:22 -0700
Subject: [PATCH] Implement I4 texture format

@neobrain, could you confirm that this is correct?

It's been tested with various different games and fixes different textures, including in Animal Crossing, Kirby Triple Deluxe, and SMB3D.
---
 src/video_core/debug_utils/debug_utils.cpp | 11 +++++++++++
 src/video_core/pica.h                      |  2 +-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/video_core/debug_utils/debug_utils.cpp b/src/video_core/debug_utils/debug_utils.cpp
index 2d9d8ab1f4..883df48a5c 100644
--- a/src/video_core/debug_utils/debug_utils.cpp
+++ b/src/video_core/debug_utils/debug_utils.cpp
@@ -393,6 +393,17 @@ const Math::Vec4<u8> LookupTexture(const u8* source, int x, int y, const Texture
         }
     }
 
+    case Regs::TextureFormat::I4:
+    {
+        u32 morton_offset = VideoCore::GetMortonOffset(x, y, 1);
+        const u8* source_ptr = source + morton_offset / 2;
+
+        u8 i = (morton_offset % 2) ? ((*source_ptr & 0xF0) >> 4) : (*source_ptr & 0xF);
+        i = Color::Convert4To8(i);
+
+        return { i, i, i, 255 };
+    }
+
     case Regs::TextureFormat::A4:
     {
         u32 morton_offset = VideoCore::GetMortonOffset(x, y, 1);
diff --git a/src/video_core/pica.h b/src/video_core/pica.h
index 5e169ff690..a53429716b 100644
--- a/src/video_core/pica.h
+++ b/src/video_core/pica.h
@@ -156,7 +156,7 @@ struct Regs {
         I8           =  7,
         A8           =  8,
         IA4          =  9,
-
+        I4           = 10,
         A4           = 11,
         ETC1         = 12,  // compressed
         ETC1A4       = 13,  // compressed