-        self._colors[palette_index]["transparent"] = False
-        self._update_rgba(palette_index)
-
-    def _get_palette(self):
-        """Generate a palette for use with PIL"""
-        palette = []
-        for color in self._colors:
-            palette += color["rgba"][0:3]
-        return palette
-
-    def _get_alpha_palette(self):
-        """Generate an alpha channel palette with white being
-        opaque and black being transparent"""
-        palette = []
-        for color in self._colors:
-            for _ in range(3):
-                palette += [0 if color["transparent"] else 255]
-        return palette
+        self._colors[palette_index].transparent = False
+        self._needs_refresh = True
+
+    def _get_color(
+        self,
+        colorspace: Colorspace,
+        input_pixel: InputPixelStruct,
+        output_color: OutputPixelStruct,
+    ):
+        palette_index = input_pixel.pixel
+        if palette_index > len(self._colors) or self._colors[palette_index].transparent:
+            output_color.opaque = False
+            return
+
+        color = self._colors[palette_index]
+        if (
+            not self._dither
+            and color.cached_colorspace == colorspace
+            and color.cached_colorspace_grayscale_bit == colorspace.grayscale_bit
+            and color.cached_colorspace_grayscale == colorspace.grayscale
+        ):
+            output_color.pixel = self._colors[palette_index].cached_color
+            return
+
+        rgb888_pixel = input_pixel
+        rgb888_pixel.pixel = self._colors[palette_index].rgb888
+        ColorConverter._convert_color(  # pylint: disable=protected-access
+            colorspace, self._dither, rgb888_pixel, output_color
+        )
+        if not self._dither:
+            color.cached_colorspace = colorspace
+            color.cached_color = output_color.pixel
+            color.cached_colorspace_grayscale = colorspace.grayscale
+            color.cached_colorspace_grayscale_bit = colorspace.grayscale_bit