Beispiel #1
0
        private static Layer GenerateTextLayer(CharacterFile characterFile)
        {
            string personality = characterFile.GetEnumValue(KEY_PERSONALITY);
            int    indexOfPar  = personality.IndexOf('(');

            if (indexOfPar != -1)
            {
                personality = personality.Remove(indexOfPar - 1);
            }
            string familyName = characterFile.GetAttribute <string>(KEY_FAMILY_NAME);
            string firstName  = characterFile.GetAttribute <string>(KEY_FIRST_NAME);

            Bitmap   bmp = new Bitmap(CARD_WIDTH, CARD_HEIGHT);
            Graphics g   = Graphics.FromImage(bmp);

            g.TextRenderingHint = TextRenderingHint.AntiAlias;

            StringFormat sf = new StringFormat
            {
                Trimming    = StringTrimming.Character,
                FormatFlags = StringFormatFlags.NoWrap
            };

            Font nameFont = new Font("Tahoma", 50, FontStyle.Bold, GraphicsUnit.Pixel);
            Font persFont = new Font("Tahoma", 32, FontStyle.Bold, GraphicsUnit.Pixel);

            sf.Alignment = StringAlignment.Near;
            RectangleF textBounds = new RectangleF(30, 30, 340, 540);

            g.DrawString(personality, persFont, Brushes.White, textBounds, sf);
            g.TranslateTransform(0, 450);
            g.RotateTransform(-10);
            sf.Alignment = StringAlignment.Near;
            g.DrawString(familyName, nameFont, Brushes.White, textBounds, sf);
            g.RotateTransform(10);
            g.TranslateTransform(0, 50);
            g.RotateTransform(-10);
            sf.Alignment = StringAlignment.Far;
            g.DrawString(firstName, nameFont, Brushes.White, textBounds, sf);
            g.Flush();

            Layer textLayer = (Layer)bmp;

            g.Dispose();
            bmp.Dispose();
            return(textLayer);
        }
Beispiel #2
0
        public static Layer GenerateThumbnail(CharacterFile characterFile)
        {
            byte sexuality = characterFile.GetAttribute <byte>(KEY_ORIENTATION);
            bool isRainbow = characterFile.GetAttribute <bool>(KEY_RAINBOW);

            Layer portrait = GeneratePortraitLayer(characterFile);

            Rectangle thumbRect = new Rectangle(THUMB_LEFT, THUMB_TOP, THUMB_WIDTH, THUMB_HEIGHT);

            DropShadowEffect.Region = thumbRect;
            DropShadowEffect.ApplyEffect(portrait);
            DropShadowEffect.Region = Rectangle.Empty;

            Layer thumb = Layer.Create(THUMB_WIDTH, THUMB_HEIGHT);

            for (int i = 0; i < thumb.BitmapData.Length; i += 4)
            {
                //int px = (i / 4) % THUMB_WIDTH;
                int py = (i / 4) / THUMB_WIDTH;

                byte y = (byte)(py * 150 / THUMB_HEIGHT);
                thumb.BitmapData[i + 0] = y;
                thumb.BitmapData[i + 1] = y;
                thumb.BitmapData[i + 2] = y;
                thumb.BitmapData[i + 3] = 255;
            }

            BackgroundEffect.RainbowCenter = new Point(THUMB_WIDTH / 2, THUMB_HEIGHT / 2);
            BackgroundEffect.IsRainbow     = isRainbow;
            BackgroundEffect.Color         = SexualityColors[sexuality];
            BackgroundEffect.ApplyEffect(thumb);

            BlendEffect blend = new BlendEffect
            {
                OverlayLayer = portrait,
                Offset       = new Point(-THUMB_LEFT, -THUMB_TOP),
            };

            blend.ApplyEffect(thumb);

            return(thumb);
        }
Beispiel #3
0
        public static Layer GenerateCard(CharacterFile characterFile)
        {
            byte gender = characterFile.GetAttribute <byte>(KEY_GENDER);
            bool isMale = gender == 0;

            byte   height    = characterFile.GetAttribute <byte>(KEY_HEIGHT);
            string figureKey = isMale
                ? KEY_FIGURE_M
                : KEY_FIGURE_F;

            byte figure = characterFile.GetAttribute <byte>(figureKey);

            byte sexuality = characterFile.GetAttribute <byte>(KEY_ORIENTATION);
            bool isRainbow = characterFile.GetAttribute <bool>(KEY_RAINBOW);

            byte breastSize = characterFile.GetAttribute <byte>(KEY_BREASTS);

            Layer layerBackground = LoadLayer(Path.Combine(PngRootDir, "BACKGROUND"));
            Layer layerFrame      = LoadLayer(Path.Combine(PngRootDir, "FRAME"));

            MultiplyEffect.OverlayColor = isRainbow
                ? new Color(200, 200, 200)
                : (SexualityColors[sexuality] / 1.7f) + 50;
            MultiplyEffect.ApplyEffect(layerFrame);

            StrokeEffect.StrokeWidth = 3;
            StrokeEffect.SourceOver  = true;
            StrokeEffect.StrokeColor = new Color(255, 255, 255);
            StrokeEffect.ApplyEffect(layerFrame);

            Layer layerPortrait = GeneratePortraitLayer(characterFile);

            Layer layerName = GenerateTextLayer(characterFile);

            StrokeEffect.StrokeWidth = 4;
            StrokeEffect.SourceOver  = true;
            StrokeEffect.StrokeColor = new Color(50, 50, 50);
            StrokeEffect.ApplyEffect(layerName);

            Layer layerPortraitName = CompositeUnsorted(layerPortrait, layerName);

            Layer layerCutout = CompositeUnsorted(layerPortraitName, layerFrame); //(Layer) layerPortraitName.Clone();

            StrokeEffect.StrokeWidth = 8;
            StrokeEffect.SourceOver  = false;
            StrokeEffect.StrokeColor = new Color(0, 0, 0);
            StrokeEffect.ApplyEffect(layerCutout);

            Rectangle shadowArea = layerPortraitName.GetArea();

            shadowArea.Inflate(DropShadowEffect.ShadowSize, DropShadowEffect.ShadowSize);
            DropShadowEffect.ApplyEffect(layerPortraitName, shadowArea);

            DropShadowEffect.ApplyEffect(layerFrame);

            Layer layerBackgroundCutout = CompositeUnsorted(layerBackground, layerCutout);

            BackgroundEffect.RainbowCenter = new Point(CARD_WIDTH / 2, CARD_HEIGHT / 2);
            BackgroundEffect.IsRainbow     = isRainbow;
            BackgroundEffect.Color         = SexualityColors[sexuality];
            BackgroundEffect.ApplyEffect(layerBackgroundCutout);

            Layer genderTag = LoadLayer(Path.Combine(PngRootDir, "TAGS", "GENDER", String.Format("{0:D3}", gender)));

            byte bodyId = (byte)(isMale
                ? figure
                : (height << 2) | figure);

            string bodyDir = isMale
                ? "BODY_M"
                : "BODY_F";

            Layer bodyTag = LoadLayer(Path.Combine(PngRootDir, "TAGS", bodyDir, String.Format("{0:D3}", bodyId)));

            byte breastId = (byte)(isMale
                ? 0
                : Math.Max(1, breastSize / 17));
            Layer breastTag = LoadLayer(Path.Combine(PngRootDir, "TAGS", "BREASTS", String.Format("{0:D3}", breastId)));

            Layer layerTags = Composite(genderTag, bodyTag, breastTag);

            //StrokeEffect.StrokeWidth = 4;
            //StrokeEffect.AlphaBlend = true;
            //StrokeEffect.StrokeColor = new Color(50, 50, 50);

            //StrokeEffect.ApplyEffect(layerTags);
            //DropShadowEffect.ApplyEffect(layerTags);

            Layer final = CompositeUnsorted(layerBackgroundCutout, layerPortraitName, layerFrame, layerTags);

            return(final);
        }
Beispiel #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()));
        }