コード例 #1
0
        private bool CheckForMCCharsetErrors(Formats.GraphicScreenProject Project, int CharIndexOffset)
        {
            bool foundError  = false;
            int  blockWidth  = ((Project.Image.Width + 7) / 8);
            int  blockHeight = ((Project.Image.Height + 7) / 8);

            for (int j = 0; j < blockHeight; ++j)
            {
                for (int i = 0; i < blockWidth; ++i)
                {
                    CheckCharBox(Project, m_Chars[CharIndexOffset + i + j * blockWidth], i * 8, j * 8, true);
                    if (m_Chars[CharIndexOffset + i + j * blockWidth].Error.Length > 0)
                    {
                        foundError = true;
                    }
                }
            }
            if (foundError)
            {
                return(true);
            }
            return(false);
        }
コード例 #2
0
        private bool CheckCharBox(Formats.GraphicScreenProject Project, Formats.CharData cd, int X, int Y, bool CheckForMC)
        {
            // Match image data
            int chosenCharColor = -1;

            cd.Replacement = null;
            cd.Index       = 0;

            // clear data
            for (int i = 0; i < cd.Tile.Data.Length; ++i)
            {
                cd.Tile.Data.SetU8At(i, 0);
            }

            bool isMultiColor = false;

            {
                // determine single/multi color
                bool[] usedColor           = new bool[16];
                int    numColors           = 0;
                bool   hasSinglePixel      = false;
                bool   usedBackgroundColor = false;

                for (int y = 0; y < 8; ++y)
                {
                    for (int x = 0; x < 8; ++x)
                    {
                        int colorIndex = (int)Project.Image.GetPixel(X + x, Y + y) % 16;
                        if (colorIndex >= 16)
                        {
                            cd.Error = "Color index >= 16";
                            return(false);
                        }
                        if ((x % 2) == 0)
                        {
                            if (colorIndex != (int)Project.Image.GetPixel(X + x + 1, Y + y) % 16)
                            {
                                // not a double pixel, must be single color then
                                hasSinglePixel = true;
                            }
                        }

                        if (!usedColor[colorIndex])
                        {
                            if (colorIndex == Project.Colors.BackgroundColor)
                            {
                                usedBackgroundColor = true;
                            }
                            usedColor[colorIndex] = true;
                            numColors++;
                        }
                    }
                }
                if ((hasSinglePixel) &&
                    (numColors > 2))
                {
                    cd.Error = "Has single pixel, but more than 2 colors";
                    return(false);
                }
                if (numColors > 2)
                {
                    isMultiColor = true;
                }
                if ((!CheckForMC) &&
                    (numColors > 2))
                {
                    cd.Error = "Has too many colors";
                    return(false);
                }
                if ((!CheckForMC) &&
                    (numColors == 2) &&
                    (!usedBackgroundColor))
                {
                    cd.Error = "Uses two colors different from background color";
                    return(false);
                }
                if ((hasSinglePixel) &&
                    (numColors == 2) &&
                    (!usedBackgroundColor))
                {
                    cd.Error = "Has single pixel, but more than 2 colors different from background color";
                    return(false);
                }
                if ((CheckForMC) &&
                    (!hasSinglePixel) &&
                    (numColors > 4))
                {
                    cd.Error = "Has more than 4 colors";
                    return(false);
                }
                if ((!hasSinglePixel) &&
                    (numColors == 4) &&
                    (!usedBackgroundColor))
                {
                    cd.Error = "Has more than 4 colors different from background color";
                    return(false);
                }
                int otherColorIndex = 16;
                if ((!hasSinglePixel) &&
                    (numColors == 2) &&
                    (usedBackgroundColor))
                {
                    for (int i = 0; i < 16; ++i)
                    {
                        if ((usedColor[i]) &&
                            (i != Project.Colors.BackgroundColor))
                        {
                            otherColorIndex = i;
                            break;
                        }
                    }
                }
                if ((hasSinglePixel) ||
                    (!CheckForMC) ||
                    ((numColors == 2) &&
                     (usedBackgroundColor) &&
                     (otherColorIndex < 8)))
                //||   ( numColors == 2 ) )
                {
                    // eligible for single color
                    isMultiColor = false;
                    int usedFreeColor = -1;
                    for (int i = 0; i < 16; ++i)
                    {
                        if (usedColor[i])
                        {
                            if (i != Project.Colors.BackgroundColor)
                            {
                                if (usedFreeColor != -1)
                                {
                                    cd.Error = "More than 1 free color";
                                    return(false);
                                }
                                usedFreeColor = i;
                            }
                        }
                    }

                    if ((hasSinglePixel) &&
                        (CheckForMC) &&
                        (numColors == 2) &&
                        (usedFreeColor >= 8))
                    {
                        cd.Error = "Hires char cannot use free color with index " + usedFreeColor;
                        return(false);
                    }

                    for (int y = 0; y < 8; ++y)
                    {
                        for (int x = 0; x < 8; ++x)
                        {
                            int ColorIndex = (int)Project.Image.GetPixel(X + x, Y + y) % 16;

                            int BitPattern = 0;

                            if (ColorIndex != Project.Colors.BackgroundColor)
                            {
                                BitPattern = 1;
                            }

                            // noch nicht verwendete Farbe
                            if (BitPattern == 1)
                            {
                                chosenCharColor = ColorIndex;
                            }
                            cd.Tile.Data.SetU8At(y + x / 8, (byte)(cd.Tile.Data.ByteAt(y + x / 8) | (BitPattern << ((7 - (x % 8))))));
                        }
                    }
                }
                else
                {
                    // multi color
                    isMultiColor = true;
                    int usedMultiColors = 0;
                    int usedFreeColor   = -1;
                    for (int i = 0; i < 16; ++i)
                    {
                        if (usedColor[i])
                        {
                            if ((i == Project.Colors.MultiColor1) ||
                                (i == Project.Colors.MultiColor2) ||
                                (i == Project.Colors.BackgroundColor))
                            {
                                ++usedMultiColors;
                            }
                            else
                            {
                                usedFreeColor = i;
                            }
                        }
                    }
                    if (numColors - usedMultiColors > 1)
                    {
                        // only one free color allowed
                        cd.Error = "More than 1 free color";
                        return(false);
                    }
                    if (usedFreeColor >= 8)
                    {
                        cd.Error = "Free color must be of index < 8";
                        return(false);
                    }
                    for (int y = 0; y < 8; ++y)
                    {
                        for (int x = 0; x < 4; ++x)
                        {
                            int ColorIndex = (int)Project.Image.GetPixel(X + 2 * x, Y + y) % 16;

                            byte BitPattern = 0;

                            if (ColorIndex == Project.Colors.BackgroundColor)
                            {
                                BitPattern = 0x00;
                            }
                            else if (ColorIndex == Project.Colors.MultiColor1)
                            {
                                BitPattern = 0x01;
                            }
                            else if (ColorIndex == Project.Colors.MultiColor2)
                            {
                                BitPattern = 0x02;
                            }
                            else
                            {
                                // noch nicht verwendete Farbe
                                chosenCharColor = usedFreeColor;
                                BitPattern      = 0x03;
                            }
                            cd.Tile.Data.SetU8At(y + x / 4, (byte)(cd.Tile.Data.ByteAt(y + x / 4) | (BitPattern << ((3 - (x % 4)) * 2))));
                        }
                    }
                    if (usedFreeColor == -1)
                    {
                        // only the two multi colors were used, we need to force multi color index though
                        chosenCharColor = 8;
                    }
                }
            }
            if (chosenCharColor == -1)
            {
                chosenCharColor = 0;
            }
            cd.Tile.CustomColor = chosenCharColor;
            if ((isMultiColor) &&
                (chosenCharColor < 8))
            {
                cd.Tile.CustomColor = chosenCharColor + 8;
            }
            return(true);
        }