示例#1
0
        protected bool Get_Initial_RGB_Using_LUT_MCI(Gamma_Set Set, int band, int gray, OC_Mode Mode)
        {
            if ((band >= 1) && (band <= DP213_Static.Max_HBM_and_Normal_Band_Amount) && (vars.Target.double_Lv > Algorism_Lower_Skip_LV) && (vars.Target.double_Lv < Algorism_Upper_Skip_LV))
            {
                RGB_Double Gray = DP213_Main_OC_Flow.init_gray_lut.Get_LUT_RGB(band, gray, Mode);

                RGB_Double Gamma_Voltage = new RGB_Double();
                Gamma_Voltage.double_R = InterpolationFomulaFactory.GetPrevBand_Red_Volatge(Gray.double_R);
                Gamma_Voltage.double_G = InterpolationFomulaFactory.GetPrevBand_Green_Volatge(Gray.double_G);
                Gamma_Voltage.double_B = InterpolationFomulaFactory.GetPrevBand_Blue_Volatge(Gray.double_B);


                f1().GB_Status_AppendText_Nextline("Before) R/G/B/Vreg1 = " + vars.Gamma.int_R.ToString() + "/" + vars.Gamma.int_G.ToString().ToString() + "/" + vars.Gamma.int_B.ToString() + "/" + vars.Vreg1, Color.Blue);

                if (gray == 0)
                {
                    double Voltage_VREF4095 = storage.Get_Voltage_VREF4095();
                    double Vreg1_Voltage    = storage.Get_Normal_Voltage_Vreg1(Set, band);

                    vars.Gamma.int_R = Imported_my_cpp_dll.DP213_Get_AM2_Gamma_Dec(Voltage_VREF4095, Vreg1_Voltage, Gamma_Voltage.double_R);
                    vars.Gamma.int_G = Imported_my_cpp_dll.DP213_Get_AM2_Gamma_Dec(Voltage_VREF4095, Vreg1_Voltage, Gamma_Voltage.double_G);
                    vars.Gamma.int_B = Imported_my_cpp_dll.DP213_Get_AM2_Gamma_Dec(Voltage_VREF4095, Vreg1_Voltage, Gamma_Voltage.double_B);
                }
                else
                {
                    RGB_Double AM1_Voltage = storage.Get_Band_Set_Voltage_AM1(Set, band);

                    RGB_Double Prvious_Gray_Gamma_Voltage;
                    if (gray == 4 || gray == 6 || gray == 8)
                    {
                        Prvious_Gray_Gamma_Voltage = storage.Get_Voltage_All_band_gray_Gamma(Set, band, (gray - 2));
                    }
                    else
                    {
                        Prvious_Gray_Gamma_Voltage = storage.Get_Voltage_All_band_gray_Gamma(Set, band, (gray - 1));
                    }

                    vars.Gamma.int_R = Imported_my_cpp_dll.DP213_Get_GR_Gamma_Dec(AM1_Voltage.double_R, Prvious_Gray_Gamma_Voltage.double_R, Gamma_Voltage.double_R, gray);
                    vars.Gamma.int_G = Imported_my_cpp_dll.DP213_Get_GR_Gamma_Dec(AM1_Voltage.double_G, Prvious_Gray_Gamma_Voltage.double_G, Gamma_Voltage.double_G, gray);
                    vars.Gamma.int_B = Imported_my_cpp_dll.DP213_Get_GR_Gamma_Dec(AM1_Voltage.double_B, Prvious_Gray_Gamma_Voltage.double_B, Gamma_Voltage.double_B, gray);
                }

                f1().GB_Status_AppendText_Nextline("After C++) R/G/B/Vreg1 = " + vars.Gamma.int_R.ToString() + "/" + vars.Gamma.int_G.ToString().ToString() + "/" + vars.Gamma.int_B.ToString() + "/" + vars.Vreg1, Color.Red);
                init_algorithm_storage_cpp.Set_All_band_gray_Gamma(Set, band, gray, vars.Gamma);
                return(true);
            }
            else
            {
                f1().GB_Status_AppendText_Nextline("Skip)Get_Initial_RGB_Using_LUT_MCI()", Color.DarkRed);
                return(false);
            }
        }
示例#2
0
        public static void C_Sharp_DP213_Get_Intial_R_G_B_Using_3Points_Method(double Combine_Lv_Ratio, double[] Band_Voltage_AM1_R, double[] Band_Voltage_AM1_G, double[] Band_Voltage_AM1_B,
                                                                               ref int Gamma_R, ref int Gamma_G, ref int Gamma_B, bool[] Selected_Band, int[] Band_Gray_Gamma_Red, int[] Band_Gray_Gamma_Green, int[] Band_Gray_Gamma_Blue, double[] Band_Gray_Finally_Measured_Lv, int Current_Band_Dec_Vreg1,
                                                                               int[] Band_Vreg1_Dec, int band, int gray, double Target_Lv, double Prvious_Gray_Gamma_R_Voltage, double Prvious_Gray_Gamma_G_Voltage, double Prvious_Gray_Gamma_B_Voltage, double Voltage_VREF4095, double Voltage_VREF0)
        {
            if (band >= 1 && Selected_Band[band] == true && gray >= 1)//gray255(gray = 0)use vreg1 compensation (skip this option)
            {
                SJH_Matrix M = new SJH_Matrix();

                double[][] Band_Gray_Gamma_Red_Voltage   = M.MatrixCreate(band, DP213_Static.Max_Gray_Amount);
                double[][] Band_Gray_Gamma_Green_Voltage = M.MatrixCreate(band, DP213_Static.Max_Gray_Amount);
                double[][] Band_Gray_Gamma_Blue_Voltage  = M.MatrixCreate(band, DP213_Static.Max_Gray_Amount);

                for (int i = 0; i < band; i++)
                {
                    int[] Previous_Band_Gamma_R = new int[DP213_Static.Max_Gray_Amount];
                    int[] Previous_Band_Gamma_G = new int[DP213_Static.Max_Gray_Amount];
                    int[] Previous_Band_Gamma_B = new int[DP213_Static.Max_Gray_Amount];

                    for (int g = 0; g < DP213_Static.Max_Gray_Amount; g++)
                    {
                        Previous_Band_Gamma_R[g] = Band_Gray_Gamma_Red[(DP213_Static.Max_Gray_Amount * i) + g];
                        Previous_Band_Gamma_G[g] = Band_Gray_Gamma_Green[(DP213_Static.Max_Gray_Amount * i) + g];
                        Previous_Band_Gamma_B[g] = Band_Gray_Gamma_Blue[(DP213_Static.Max_Gray_Amount * i) + g];
                    }
                    //double[][] Band_Gray_Gamma_Red_Voltage <- (int[] Band_Vreg1_Dec , int[][] Band_Gray_Gamma_Red)
                    Band_Gray_Gamma_Red_Voltage[i]   = Get_Previous_Band_Gamma_Voltage(Band_Voltage_AM1_R[i], Band_Vreg1_Dec[i], Previous_Band_Gamma_R, Voltage_VREF4095, Voltage_VREF0);
                    Band_Gray_Gamma_Green_Voltage[i] = Get_Previous_Band_Gamma_Voltage(Band_Voltage_AM1_G[i], Band_Vreg1_Dec[i], Previous_Band_Gamma_G, Voltage_VREF4095, Voltage_VREF0);
                    Band_Gray_Gamma_Blue_Voltage[i]  = Get_Previous_Band_Gamma_Voltage(Band_Voltage_AM1_B[i], Band_Vreg1_Dec[i], Previous_Band_Gamma_B, Voltage_VREF4095, Voltage_VREF0);
                }


                //Need to...
                //Fx_3points_Combine_LV_1, Fx_3points_Combine_LV_2, Fx_3points_Combine_LV_3, Fx_3points_Combine_Lv_Distance
                int      Points_Num = band * DP213_Static.Max_Gray_Amount;
                double[] Gamma_Red_Voltage_Points   = new double[Points_Num];
                double[] Gamma_Green_Voltage_Points = new double[Points_Num];
                double[] Gamma_Blue_Voltage_Points  = new double[Points_Num];
                double[] Target_Lv_Points           = new double[Points_Num];

                for (int b = 0; b < band; b++)
                {
                    for (int g = 0; g < DP213_Static.Max_Gray_Amount; g++)
                    {
                        Gamma_Red_Voltage_Points[(DP213_Static.Max_Gray_Amount * b) + g]   = Band_Gray_Gamma_Red_Voltage[b][g];
                        Gamma_Green_Voltage_Points[(DP213_Static.Max_Gray_Amount * b) + g] = Band_Gray_Gamma_Green_Voltage[b][g];
                        Gamma_Blue_Voltage_Points[(DP213_Static.Max_Gray_Amount * b) + g]  = Band_Gray_Gamma_Blue_Voltage[b][g];
                        Target_Lv_Points[(DP213_Static.Max_Gray_Amount * b) + g]           = Band_Gray_Finally_Measured_Lv[(DP213_Static.Max_Gray_Amount * b) + g];
                    }
                }

                Array.Sort(Gamma_Red_Voltage_Points);
                Array.Sort(Gamma_Green_Voltage_Points);
                Array.Sort(Gamma_Blue_Voltage_Points);
                Array.Sort(Target_Lv_Points);
                Array.Reverse(Target_Lv_Points);


                //-----------------Added On 200311-------------------
                List <double> Combinded_Gamma_Red_Voltage_Points   = new List <double>();
                List <double> Combinded_Gamma_Green_Voltage_Points = new List <double>();
                List <double> Combinded_Gamma_Blue_Voltage_Points  = new List <double>();
                List <double> Combinded_Target_Lv_Points           = new List <double>();

                for (int b = 0; b < band; b++)
                {
                    for (int g = 0; g < DP213_Static.Max_Gray_Amount; g++)
                    {
                        if (b == 0 && g == 0)//First Point
                        {
                            Combinded_Gamma_Red_Voltage_Points.Add(Gamma_Red_Voltage_Points[(DP213_Static.Max_Gray_Amount * b) + g]);
                            Combinded_Gamma_Green_Voltage_Points.Add(Gamma_Green_Voltage_Points[(DP213_Static.Max_Gray_Amount * b) + g]);
                            Combinded_Gamma_Blue_Voltage_Points.Add(Gamma_Blue_Voltage_Points[(DP213_Static.Max_Gray_Amount * b) + g]);
                            Combinded_Target_Lv_Points.Add(Target_Lv_Points[(DP213_Static.Max_Gray_Amount * b) + g]);
                        }
                        else
                        {
                            double Abs_Diff_Lv_Between_Two_Points = Math.Abs(Combinded_Target_Lv_Points[Combinded_Target_Lv_Points.Count - 1] - Target_Lv_Points[(DP213_Static.Max_Gray_Amount * b) + g]);
                            double Threshold_Lv = (Target_Lv_Points[(DP213_Static.Max_Gray_Amount * b) + g] * Combine_Lv_Ratio);

                            if (Abs_Diff_Lv_Between_Two_Points > Threshold_Lv)
                            {
                                Combinded_Gamma_Red_Voltage_Points.Add(Gamma_Red_Voltage_Points[(DP213_Static.Max_Gray_Amount * b) + g]);
                                Combinded_Gamma_Green_Voltage_Points.Add(Gamma_Green_Voltage_Points[(DP213_Static.Max_Gray_Amount * b) + g]);
                                Combinded_Gamma_Blue_Voltage_Points.Add(Gamma_Blue_Voltage_Points[(DP213_Static.Max_Gray_Amount * b) + g]);
                                Combinded_Target_Lv_Points.Add(Target_Lv_Points[(DP213_Static.Max_Gray_Amount * b) + g]);
                            }
                        }
                    }
                }
                //----------------------------------------------------
                //int Formula_Num = Points_Num - 2; //((band * 8) - 2 = Points_Num - 2)
                int Formula_Num = Combinded_Target_Lv_Points.Count - 2; //Formula_Num = Points_Num - 2;

                double[][] Three_points_Gamma_Red_Voltage   = M.MatrixCreate(Formula_Num, 3);
                double[][] Three_points_Gamma_Green_Voltage = M.MatrixCreate(Formula_Num, 3);
                double[][] Three_points_Gamma_Blue_Voltage  = M.MatrixCreate(Formula_Num, 3);
                double[][] Three_points_Target_Lv           = M.MatrixCreate(Formula_Num, 3);
                double[][] Three_points_C_R = M.MatrixCreate(Formula_Num, 3);
                double[][] Three_points_C_G = M.MatrixCreate(Formula_Num, 3);
                double[][] Three_points_C_B = M.MatrixCreate(Formula_Num, 3);

                double[][] Temp_A_R     = M.MatrixCreate(3, 3);
                double[][] Temp_A_G     = M.MatrixCreate(3, 3);
                double[][] Temp_A_B     = M.MatrixCreate(3, 3);
                double[][] Temp_Inv_A_R = M.MatrixCreate(3, 3);
                double[][] Temp_Inv_A_G = M.MatrixCreate(3, 3);
                double[][] Temp_Inv_A_B = M.MatrixCreate(3, 3);

                double[] C_R = new double[3];
                double[] C_G = new double[3];
                double[] C_B = new double[3];

                int count = 0;
                for (int k = 0; k < Formula_Num; k++)
                {
                    for (int i = 0; i <= 2; i++)
                    {
                        //Get "Three_points_Target_Lv"
                        Three_points_Target_Lv[k][i] = Combinded_Target_Lv_Points[i + k];
                        count = 0;
                        //Get "A"
                        for (int j = 2; j >= 0; j--)
                        {
                            Temp_A_R[i][count] = Math.Pow(Combinded_Gamma_Red_Voltage_Points[i + k], j);
                            Temp_A_G[i][count] = Math.Pow(Combinded_Gamma_Green_Voltage_Points[i + k], j);
                            Temp_A_B[i][count] = Math.Pow(Combinded_Gamma_Blue_Voltage_Points[i + k], j);
                            count++;
                        }
                    }

                    //Get Inv_A (by using "A")
                    Temp_Inv_A_R = M.MatrixInverse(Temp_A_R);
                    Temp_Inv_A_G = M.MatrixInverse(Temp_A_G);
                    Temp_Inv_A_B = M.MatrixInverse(Temp_A_B);

                    //Get C (by using "Inv_A" , "Three_points_Target_Lv")
                    Three_points_C_R[k] = M.Matrix_Multiply(Temp_Inv_A_R, Three_points_Target_Lv[k]);
                    Three_points_C_G[k] = M.Matrix_Multiply(Temp_Inv_A_G, Three_points_Target_Lv[k]);
                    Three_points_C_B[k] = M.Matrix_Multiply(Temp_Inv_A_B, Three_points_Target_Lv[k]);

                    //Get C (Target belongs to [Three_points_Target_Lv[k][2],Three_points_Target_Lv[k][0]])
                    if (Three_points_Target_Lv[k][2] < Target_Lv && Target_Lv < Three_points_Target_Lv[k][0])
                    {
                        for (int i = 0; i <= 2; i++)
                        {
                            C_R[i] = Three_points_C_R[k][i];
                            C_G[i] = Three_points_C_G[k][i];
                            C_B[i] = Three_points_C_B[k][i];
                        }
                        break; //Break for k loop
                    }
                }

                //Get Calculated Voltage_R/G/B
                double Calculated_Target_Lv;
                int    iteration;
                double Calculated_R_Vdata = 0;
                double Calculated_G_Vdata = 0;
                double Calculated_B_Vdata = 0;

                for (double Vdata = Prvious_Gray_Gamma_R_Voltage; Vdata <= Voltage_VREF4095; Vdata += 0.001)
                {
                    Calculated_Target_Lv = 0;
                    iteration            = 0;

                    for (int j = 2; j >= 0; j--)
                    {
                        Calculated_Target_Lv += (Math.Pow(Vdata, j) * C_R[iteration++]);
                    }

                    if ((Calculated_Target_Lv < Target_Lv) && Calculated_R_Vdata == 0)
                    {
                        Calculated_R_Vdata = Vdata;
                        break;
                    }
                }

                for (double Vdata = Prvious_Gray_Gamma_G_Voltage; Vdata <= Voltage_VREF4095; Vdata += 0.001)
                {
                    Calculated_Target_Lv = 0;
                    iteration            = 0;

                    for (int j = 2; j >= 0; j--)
                    {
                        Calculated_Target_Lv += (Math.Pow(Vdata, j) * C_G[iteration++]);
                    }

                    if ((Calculated_Target_Lv < Target_Lv) && Calculated_G_Vdata == 0)
                    {
                        Calculated_G_Vdata = Vdata;
                        break;
                    }
                }

                for (double Vdata = Prvious_Gray_Gamma_B_Voltage; Vdata <= Voltage_VREF4095; Vdata += 0.001)
                {
                    Calculated_Target_Lv = 0;
                    iteration            = 0;

                    for (int j = 2; j >= 0; j--)
                    {
                        Calculated_Target_Lv += (Math.Pow(Vdata, j) * C_B[iteration++]);
                    }

                    if ((Calculated_Target_Lv < Target_Lv) && Calculated_B_Vdata == 0)
                    {
                        Calculated_B_Vdata = Vdata;
                        break;
                    }
                }

                //Get Gamma_R/G/B From Calculated Voltage_R/G/B
                double Current_Band_Vreg1_Voltage = Imported_my_cpp_dll.DP213_Get_Vreg1_Voltage(Voltage_VREF4095, Voltage_VREF0, Band_Vreg1_Dec[band]);
                Gamma_R = Imported_my_cpp_dll.DP213_Get_GR_Gamma_Dec(Band_Voltage_AM1_R[band], Prvious_Gray_Gamma_R_Voltage, Calculated_R_Vdata, gray);
                Gamma_G = Imported_my_cpp_dll.DP213_Get_GR_Gamma_Dec(Band_Voltage_AM1_G[band], Prvious_Gray_Gamma_G_Voltage, Calculated_G_Vdata, gray);
                Gamma_B = Imported_my_cpp_dll.DP213_Get_GR_Gamma_Dec(Band_Voltage_AM1_B[band], Prvious_Gray_Gamma_B_Voltage, Calculated_B_Vdata, gray);

                int Prev_Band_Current_Gray_Gamma_R = Band_Gray_Gamma_Red[(DP213_Static.Max_Gray_Amount * (band - 1)) + gray];
                int Prev_Band_Current_Gray_Gamma_G = Band_Gray_Gamma_Green[(DP213_Static.Max_Gray_Amount * (band - 1)) + gray];
                int Prev_Band_Current_Gray_Gamma_B = Band_Gray_Gamma_Blue[(DP213_Static.Max_Gray_Amount * (band - 1)) + gray];
                DP213_If_One_Of_RGB_Near_Register_Min_Max_Set_Gamma_As_Prev_Band_Gamma(ref Gamma_R, ref Gamma_G, ref Gamma_B, Prev_Band_Current_Gray_Gamma_R, Prev_Band_Current_Gray_Gamma_G, Prev_Band_Current_Gray_Gamma_B);
            }
            else //Band0 + Other not selected Bands's
            {
            }
        }