private void ProcessColors(Texture2D palette, int colorX, int colorY, Func <Color, Color, int, Color> action)
        {
            int x0, y0, x1, y1;

            PaletteEditMode mode = (PaletteEditMode)_guiEditMode.value;

            switch (mode)
            {
            default:
            case PaletteEditMode.Single:
                x0 = colorX;
                x1 = colorX + 1;
                y0 = colorY;
                y1 = colorY + 1;
                break;

            case PaletteEditMode.Row:
                x0 = 0;
                x1 = palette.width;
                y0 = colorY;
                y1 = colorY + 1;
                break;

            case PaletteEditMode.Column:
                x0 = colorX;
                x1 = colorX + 1;
                y0 = 0;
                y1 = palette.height;
                break;

            case PaletteEditMode.All:
                x0 = 0;
                x1 = palette.width;
                y0 = 0;
                y1 = palette.height;
                break;
            }

            int rootColorY = palette.height - 1;

            for (int y = y0; y < y1; y++)
            {
                for (int x = x0; x < x1; x++)
                {
                    int   shade      = rootColorY - y;
                    Color rootColor  = palette.GetPixel(x, rootColorY);
                    Color inputColor = palette.GetPixel(x, y);
                    Color output     = action(rootColor, inputColor, shade);

                    palette.SetPixel(x, y, output);
                    _guiColorFields[shade * palette.width + x].color = output;
                }
            }

            palette.Apply();
            _paletteDirty = true;
        }
        private void GenerateShadesClicked(GUIBase sender)
        {
            Texture2D texture = _guiTexture.texture;

            if (texture == null)
            {
                return;
            }

            if (IsTextureReadWrite(texture))
            {
                Undo.RecordObject(texture, "Edit Palette");
                int   lastShadeIndex = texture.height - 1;
                float h = _guiHue.value;
                float s = _guiSaturation.value;
                float l = _guiLuminance.value;

                PaletteEditMode mode = (PaletteEditMode)_guiEditMode.value;
                if (mode == PaletteEditMode.Single || mode == PaletteEditMode.Row)
                {
                    ProcessColors(texture, _selectedColorX, _selectedColorY, (root, input, shade) => {
                        return(OffsetColorHSL(input, 1.0f, h, s, l));
                    });
                }
                else
                {
                    ProcessColors(texture, _selectedColorX, _selectedColorY, (root, input, shade) => {
                        float a = (float)shade / (float)lastShadeIndex;
                        return(OffsetColorHSL(root, a, h, s, l));
                    });
                }
            }
            else
            {
                HandleTextureNotReadWrite();
            }
        }