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); }
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)); }
public BackgroundEffect() { RainbowAngle = 0; RainbowCenter = new Point(0, 0); RainbowPhase = 0; RainbowRadial = false; Color = new Color(255, 255, 255); IsRainbow = false; }
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())); }