AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Palette.cs

359 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Runtime.InteropServices;
namespace MAME.Core
{
public class Palette
{
public static uint[] entry_color;
/** entry_color的指针管理 **/
static GCHandle entry_color_handle;
public static IntPtr entry_color_Ptr;
/** end **/
public static float[] entry_contrast;
private static uint trans_uint;
private static int numcolors, numgroups;
//public static Color trans_color;
public delegate void palette_delegate(int index, uint rgb);
public static palette_delegate palette_set_callback;
public static void palette_init()
{
int index;
switch (Machine.sBoard)
{
case "CPS-1":
case "CPS-1(QSound)":
case "CPS2":
//trans_color = Color.Magenta;
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0xc00;
palette_set_callback = palette_entry_set_color1;
break;
case "Data East":
//trans_color = Color.Magenta;
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x200;
palette_set_callback = palette_entry_set_color2;
break;
case "Tehkan":
//trans_color = Color.Magenta;
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x100;
palette_set_callback = palette_entry_set_color2;
break;
case "SunA8":
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x100;
palette_set_callback = palette_entry_set_color2;
break;
case "Namco System 1":
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x2001;
palette_set_callback = palette_entry_set_color1;
break;
case "IGS011":
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x800;
palette_set_callback = palette_entry_set_color1;
break;
case "PGM":
//trans_color = Color.Magenta;
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x901;
palette_set_callback = palette_entry_set_color2;
break;
case "M72":
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x201;
palette_set_callback = palette_entry_set_color1;
break;
case "M92":
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x801;
palette_set_callback = palette_entry_set_color2;
break;
case "Taito":
switch (Machine.sName)
{
case "tokio":
case "tokioo":
case "tokiou":
case "tokiob":
case "bublbobl":
case "bublbobl1":
case "bublboblr":
case "bublboblr1":
case "boblbobl":
case "sboblbobl":
case "sboblbobla":
case "sboblboblb":
case "sboblbobld":
case "sboblboblc":
case "bub68705":
case "dland":
case "bbredux":
case "bublboblb":
case "bublcave":
case "boblcave":
case "bublcave11":
case "bublcave10":
//trans_color = Color.Magenta;
//trans_color = Color.Black;
numcolors = 0x100;
break;
case "opwolf":
case "opwolfa":
case "opwolfj":
case "opwolfu":
case "opwolfb":
case "opwolfp":
//trans_color = Color.Black;
numcolors = 0x2000;
break;
}
trans_uint = 0x0;//(uint)trans_color.ToArgb();
palette_set_callback = palette_entry_set_color2;
break;
case "Taito B":
//trans_color = Color.Magenta;
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x1000;
palette_set_callback = palette_entry_set_color3;
break;
case "Konami 68000":
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x800;
palette_set_callback = palette_entry_set_color3;
break;
case "Capcom":
switch (Machine.sName)
{
case "gng":
case "gnga":
case "gngbl":
case "gngprot":
case "gngblita":
case "gngc":
case "gngt":
case "makaimur":
case "makaimurc":
case "makaimurg":
case "diamond":
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x100;
palette_set_callback = palette_entry_set_color2;
break;
case "sf":
case "sfua":
case "sfj":
case "sfjan":
case "sfan":
case "sfp":
//trans_color = Color.Black;
trans_uint = 0x0;//(uint)trans_color.ToArgb();
numcolors = 0x400;
palette_set_callback = palette_entry_set_color3;
break;
}
break;
}
//entry_color = new uint[numcolors];
/** entry_color的指针管理 **/
// 释放句柄
if (entry_color != null && entry_color_handle.IsAllocated)
entry_color_handle.Free();
entry_color = new uint[numcolors];
// 固定数组,防止垃圾回收器移动它
entry_color_handle = GCHandle.Alloc(entry_color, GCHandleType.Pinned);
// 获取数组的指针
entry_color_Ptr = entry_color_handle.AddrOfPinnedObject();
/** end **/
entry_contrast = new float[numcolors];
for (index = 0; index < numcolors; index++)
{
palette_set_callback(index, make_argb(0xff, pal1bit((byte)(index >> 0)), pal1bit((byte)(index >> 1)), pal1bit((byte)(index >> 2))));
}
switch (Machine.sBoard)
{
case "SunA8":
entry_color[0xff] = trans_uint;
break;
case "Namco System 1":
entry_color[0x2000] = trans_uint;
break;
case "PGM":
entry_color[0x900] = trans_uint;
break;
case "M72":
entry_color[0x200] = trans_uint;
break;
case "M92":
entry_color[0x800] = trans_uint;
break;
case "Taito":
switch (Machine.sName)
{
case "tokio":
case "tokioo":
case "tokiou":
case "tokiob":
case "bublbobl":
case "bublbobl1":
case "bublboblr":
case "bublboblr1":
case "boblbobl":
case "sboblbobl":
case "sboblbobla":
case "sboblboblb":
case "sboblbobld":
case "sboblboblc":
case "bub68705":
case "dland":
case "bbredux":
case "bublboblb":
case "bublcave":
case "boblcave":
case "bublcave11":
case "bublcave10":
entry_color[0xff] = trans_uint;
break;
case "opwolf":
case "opwolfa":
case "opwolfj":
case "opwolfu":
case "opwolfb":
case "opwolfp":
break;
}
break;
case "Taito B":
entry_color[0] = trans_uint;
break;
case "Konami 68000":
entry_color[0] = trans_uint;
break;
case "Capcom":
switch (Machine.sName)
{
case "gng":
case "gnga":
case "gngbl":
case "gngprot":
case "gngblita":
case "gngc":
case "gngt":
case "makaimur":
case "makaimurc":
case "makaimurg":
case "diamond":
//entry_color[0] = trans_uint;
break;
case "sf":
case "sfua":
case "sfj":
case "sfjan":
case "sfan":
case "sfp":
entry_color[0] = trans_uint;
break;
}
break;
}
}
public static void palette_entry_set_color1(int index, uint rgb)
{
if (index >= numcolors || entry_color[index] == rgb)
{
return;
}
if (index % 0x10 == 0x0f && rgb == 0)
{
entry_color[index] = trans_uint;
}
else
{
entry_color[index] = 0xff000000 | rgb;
}
}
public static void palette_entry_set_color2(int index, uint rgb)
{
if (index >= numcolors || entry_color[index] == rgb)
{
return;
}
entry_color[index] = 0xff000000 | rgb;
}
public static void palette_entry_set_color3(int index, uint rgb)
{
if (index >= numcolors || entry_color[index] == rgb || index == 0)
{
return;
}
entry_color[index] = 0xff000000 | rgb;
}
public static void palette_entry_set_contrast(int index, float contrast)
{
int groupnum;
if (index >= numcolors || entry_contrast[index] == contrast)
{
return;
}
entry_contrast[index] = contrast;
for (groupnum = 0; groupnum < numgroups; groupnum++)
{
//update_adjusted_color(palette, groupnum, index);
}
}
public static uint make_rgb(int r, int g, int b)
{
//return ((((uint)(r) & 0xff) << 16) | (((uint)(g) & 0xff) << 8) | ((uint)(b) & 0xff));
//通道修改BGRA->RGBA
return ((((uint)(b) & 0xff) << 16) | (((uint)(g) & 0xff) << 8) | ((uint)(r) & 0xff));
}
public static uint make_argb(int a, int r, int g, int b)
{
//return ((((uint)(a) & 0xff) << 24) | (((uint)(r) & 0xff) << 16) | (((uint)(g) & 0xff) << 8) | ((uint)(b) & 0xff));
//通道修改BGRA->RGBA
return ((((uint)(a) & 0xff) << 24) | (((uint)(b) & 0xff) << 16) | (((uint)(g) & 0xff) << 8) | ((uint)(r) & 0xff));
}
public static byte pal1bit(byte bits)
{
return (byte)(((bits & 1) != 0) ? 0xff : 0x00);
}
public static byte pal4bit(byte bits)
{
bits &= 0xf;
return (byte)((bits << 4) | bits);
}
public static byte pal5bit(byte bits)
{
bits &= 0x1f;
return (byte)((bits << 3) | (bits >> 2));
}
}
}