예제 #1
0
        protected override Color ProcessPixel(Layer layer, Point p)
        {
            Color bgCol;

            if (IsRainbow)
            {
                double angle;
                if (RainbowRadial)
                {
                    Point distancePoint = p - (Size)RainbowCenter;
                    angle = Math.Atan2(distancePoint.Y, distancePoint.X) + _phase;
                }
                else
                {
                    angle = (p.Y * _sinAngle + p.X * _cosAngle) / (layer.Height * _sinAngle + layer.Width * _cosAngle)
                            + _phase;
                    angle *= Math.PI * 2;
                }
                angle = angle * 180.0 / Math.PI;
                bgCol = Color.FromHsv(angle, 1d, 1d);
            }
            else
            {
                bgCol = Color;
            }

            bgCol.R = (byte)(50 + bgCol.R / 1.7);
            bgCol.G = (byte)(50 + bgCol.G / 1.7);
            bgCol.B = (byte)(50 + bgCol.B / 1.7);

            Color bgSample = layer.GetPixel(p);

            return(bgCol + bgSample);
        }
예제 #2
0
        private static Color FixHairColor(Color input)
        {
            float hairHue, hairSat, hairBright;

            Color.ToHsl(input, out hairHue, out hairSat, out hairBright);
            return(Color.FromHsl(hairHue, hairSat * 1, .2 + (hairBright) * .8));
        }
예제 #3
0
 public BackgroundEffect()
 {
     RainbowAngle  = 0;
     RainbowCenter = new Point(0, 0);
     RainbowPhase  = 0;
     RainbowRadial = false;
     Color         = new Color(255, 255, 255);
     IsRainbow     = false;
 }
예제 #4
0
        private static Layer GeneratePortraitLayer(CharacterFile characterFile)
        {
            Color zSkinBase   = characterFile.GetAttribute <Color>(KEY_SKIN_COLOR);
            byte  zTanOpacity = characterFile.GetAttribute <byte>(KEY_TAN_OPACITY);
            Color zSkinTan    = Color.FromRgb(0x4D, 0xD1, 0x13, zTanOpacity); //0x4D1D13

            //Color colorSkin = Color.Combine(zSkinBase, zSkinTan);
            Color colorSkin    = zSkinBase & zSkinTan;
            Color colorLEye    = characterFile.GetAttribute <Color>(KEY_EYE_LEFT_COLOR);
            Color colorREye    = characterFile.GetAttribute <Color>(KEY_EYE_RIGHT_COLOR);
            Color colorHair    = FixHairColor(characterFile.GetAttribute <Color>(KEY_HAIR_COLOR));
            Color colorGlass   = characterFile.GetAttribute <Color>(KEY_GLASSES_COLOR);
            Color colorEyebrow = characterFile.GetAttribute <Color>(KEY_EYEBROW_COLOR);

            bool bIsMale = characterFile.GetAttribute <byte>(KEY_GENDER) == 0;

            bool flipBackHair  = characterFile.GetAttribute <bool>(KEY_HAIR_BACK_FLIP);
            bool flipSideHair  = characterFile.GetAttribute <bool>(KEY_HAIR_SIDE_FLIP);
            bool flipFrontHair = characterFile.GetAttribute <bool>(KEY_HAIR_FRONT_FLIP);
            bool flipExtHair   = characterFile.GetAttribute <bool>(KEY_HAIR_EXT_FLIP);

            bool moleCheekLeft  = characterFile.GetAttribute <bool>(KEY_MOLE_CHEEK_LEFT);
            bool moleCheekRight = characterFile.GetAttribute <bool>(KEY_MOLE_CHEEK_RIGHT);
            bool moleChinLeft   = characterFile.GetAttribute <bool>(KEY_MOLE_CHIN_LEFT);
            bool moleChinRight  = characterFile.GetAttribute <bool>(KEY_MOLE_CHIN_RIGHT);

            byte idBackHair  = characterFile.GetAttribute <byte>(KEY_HAIR_BACK);
            byte idSideHair  = characterFile.GetAttribute <byte>(KEY_HAIR_SIDE);
            byte idFrontHair = characterFile.GetAttribute <byte>(KEY_HAIR_FRONT);
            byte idExtHair   = characterFile.GetAttribute <byte>(KEY_HAIR_EXT);

            byte idEyebrow = characterFile.GetAttribute <byte>(KEY_EYEBROW_SHAPE);

            byte idLipstick = characterFile.GetAttribute <byte>(KEY_LIPSTICK_COLOR);
            byte lipOpacity = bIsMale
                ? (byte)0
                : characterFile.GetAttribute <byte>(KEY_LIPSTICK_OPACITY);

            byte   idGlasses = characterFile.GetAttribute <byte>(KEY_GLASSES_TYPE);
            string zFaceKey  = bIsMale
                ? KEY_FACETYPE_M
                : KEY_FACETYPE_F;

            byte idFace = characterFile.GetAttribute <byte>(zFaceKey);

            var layersSkin = LoadLayers(PngRootDir, "SKIN");

            MultiplyEffect.OverlayColor = colorSkin;
            layersSkin.Where(layer => !layer.XFlag)
            .ForEach(layer => MultiplyEffect.ApplyEffect(layer, layer.GetArea()));

            var layersHair = new List <Layer>();

            layersHair.AddRange(LoadAndMirror(Path.Combine(PngRootDir, "HAIR_BACK"), idBackHair, flipBackHair));
            layersHair.AddRange(LoadAndMirror(Path.Combine(PngRootDir, "HAIR_SIDE"), idSideHair, flipSideHair));
            layersHair.AddRange(LoadAndMirror(Path.Combine(PngRootDir, "HAIR_FRONT"), idFrontHair, flipFrontHair));
            layersHair.AddRange(LoadAndMirror(Path.Combine(PngRootDir, "HAIR_EXT"), idExtHair, flipExtHair));
            MultiplyEffect.OverlayColor = colorHair;
            layersHair.Where(layer => !layer.XFlag)
            .ForEach(layer => MultiplyEffect.ApplyEffect(layer, layer.GetArea()));

            string zEyesDir = bIsMale
                ? "EYES_M"
                : "EYES_F";
            var layersFace = LoadLayers(Path.Combine(PngRootDir, zEyesDir), idFace);

            MultiplyEffect.OverlayColor = colorLEye;
            MultiplyEffect.Region       = new Rectangle(CARD_WIDTH / 2, 0, CARD_WIDTH / 2, CARD_HEIGHT);
            layersFace.Where(layer => !layer.XFlag)
            .ForEach(layer => MultiplyEffect.ApplyEffect(layer, layer.GetArea()));

            MultiplyEffect.OverlayColor = colorREye;
            MultiplyEffect.Region       = new Rectangle(0, 0, CARD_WIDTH / 2, CARD_HEIGHT);
            layersFace.Where(layer => !layer.XFlag)
            .ForEach(layer => MultiplyEffect.ApplyEffect(layer, layer.GetArea()));

            MultiplyEffect.Region = Rectangle.Empty;

            var layersGlass = LoadLayers(Path.Combine(PngRootDir, "GLASSES"), idGlasses);

            MultiplyEffect.OverlayColor = colorGlass;
            layersGlass.Where(layer => !layer.XFlag)
            .ForEach(layer => MultiplyEffect.ApplyEffect(layer, layer.GetArea()));

            var layersMole = new List <Layer>();

            if (moleCheekLeft)
            {
                layersMole.AddRange(LoadLayers(Path.Combine(PngRootDir, "MOLES"), "CHEKL"));
            }
            if (moleCheekRight)
            {
                layersMole.AddRange(LoadLayers(Path.Combine(PngRootDir, "MOLES"), "CHEKR"));
            }
            if (moleChinLeft)
            {
                layersMole.AddRange(LoadLayers(Path.Combine(PngRootDir, "MOLES"), "CHINL"));
            }
            if (moleChinRight)
            {
                layersMole.AddRange(LoadLayers(Path.Combine(PngRootDir, "MOLES"), "CHINR"));
            }

            var layersEyebrows = LoadLayers(Path.Combine(PngRootDir, "EYEBROWS"), idEyebrow);

            MultiplyEffect.OverlayColor = colorEyebrow;
            layersEyebrows.Where(layer => !layer.XFlag)
            .ForEach(layer => MultiplyEffect.ApplyEffect(layer, layer.GetArea()));

            var layersLips = LoadLayers(PngRootDir, "LIPS");

            MultiplyEffect.OverlayColor = LipColors[idLipstick];
            OpacityEffect.Opacity       = lipOpacity / 255.0f;
            layersLips.Where(layer => !layer.XFlag)
            .ForEach
                (layer =>
            {
                Rectangle subRegion = layer.GetArea();
                MultiplyEffect.ApplyEffect(layer, subRegion);
                OpacityEffect.ApplyEffect(layer, subRegion);
            });

            var allLayers = new List <Layer>();

            allLayers.AddRange(layersFace);
            allLayers.AddRange(layersGlass);
            allLayers.AddRange(layersHair);
            allLayers.AddRange(layersMole);
            allLayers.AddRange(layersSkin);
            allLayers.AddRange(layersEyebrows);
            allLayers.AddRange(layersLips);

            return(Composite(allLayers.ToArray()));
        }