/// <summary>
            /// スキャンデータを読み出す。
            /// </summary>
            /// <returns>処理結果</returns>
            private ReturnID ReadScanData()
            {
                // スキャンデータを読み出す(実行関数)。
                ReturnID returnID = DoReadScanData(out short[] qDctY);

                _qdctCoeffParam.YComponents = (ReturnID.Success == returnID ? (short[])qDctY.Clone() : null);

                return(returnID);
            }
            /// <summary>
            /// スキャンデータを読み出す(実行関数)。
            /// </summary>
            /// <param name="qDctY">輝度成分の量子化後のDCT係数列格納メモリ</param>
            /// <returns>処理結果</returns>
            private ReturnID DoReadScanData(out short[] qDctY)
            {
                qDctY = null;

                // 8x8ブロック数およびサンプリングレートの輝度/色差比率が正しく設定されていなければならない。
                if (_qdctCoeffParam.BlockNumX <= 0 || _qdctCoeffParam.BlockNumX > short.MaxValue ||
                    _qdctCoeffParam.BlockNumY <= 0 || _qdctCoeffParam.BlockNumY > short.MaxValue ||
                    _hiYCR < 1 || _hiYCR > 2 ||
                    _viYCR < 1 || _viYCR > 2)
                {
                    return(ReturnID.ErrorInternal);   // 内部処理エラー
                }

                qDctY = new short[_qdctCoeffParam.BlockNumX * _qdctCoeffParam.BlockNumY * 64];

                short[]    preds          = { 0, 0, 0 };
                int        sizeTemp       = _qdctCoeffParam.BlockNumX << 6;
                List <int> qDctYIndexList = new List <int> {
                    0, (1 == _hiYCR ? sizeTemp : 64), sizeTemp, sizeTemp + 64
                };

                // 垂直方向のMCU単位で処理する。
                for (int nMcuY = 0; nMcuY < _qdctCoeffParam.BlockNumY / _viYCR; nMcuY++)
                {
                    // 水平方向のMCU単位で処理する。
                    for (int nMcuX = 0; nMcuX < _qdctCoeffParam.BlockNumX / _hiYCR; nMcuX++)
                    {
                        for (int component = 0; component < _components; component++)
                        {
                            // ハフマン復号テーブルセレクタはいずれも 0 または 1 でなければならない。
                            int nDcSel = _dcHDTSel[component];
                            int nAcSel = _acHDTSel[component];
                            if ((nDcSel & ~1) != 0 || (nAcSel & ~1) != 0)
                            {
                                return(ReturnID.ErrorInternal);   // 内部処理エラー
                            }

                            if (0 == component)    // 輝度成分
                            {
                                // 1 MCUには輝度ブロックが複数含まれる。
                                for (int i = 0; i < _hiYCR * _viYCR; i++)
                                {
                                    // ブロックデータを読み出す。
                                    ReturnID returnID = ReadBlockData(ref qDctY, qDctYIndexList[i], ref preds[0], _dcHDT[nDcSel], _acHDT[nAcSel]);
                                    if (ReturnID.Success != returnID)
                                    {
                                        return(returnID);
                                    }

                                    qDctYIndexList[i] += _hiYCR << 6;
                                }
                            }
                            else                    // 色差成分
                            {
                                // ブロックデータを読み出す。
                                short[]  qDctYTemp = null;
                                ReturnID returnID  = ReadBlockData(ref qDctYTemp, 0, ref preds[component], _dcHDT[nDcSel], _acHDT[nAcSel]);
                                if (ReturnID.Success != returnID)
                                {
                                    return(returnID);
                                }
                            }
                        }
                    }

                    if (2 == _viYCR)
                    {
                        for (int i = 0; i < _hiYCR * _viYCR; i++)
                        {
                            qDctYIndexList[i] += sizeTemp;
                        }
                    }
                }

                if ((_remainBitLength & 7) != 0)
                {
                    // 後続のビットを読み出す。これらはすべてビット1(fill bits)のはず。
                    // 注意:SjsReadBits 関数呼び出し中に _remainBitLength 値が変わってしまうので、
                    //		下記の様に nFillBitLen に代入しておく必要がある。
                    int    nFillBitLen = _remainBitLength & 7;
                    ushort wFillBits   = ReadBits(nFillBitLen);
                }

                if (_remainSize < 2)
                {
                    return(ReturnID.JpegDataErrorShortOfData);    // JPEGデータ不足
                }
                // 最後に、EOIマーカがあることを確認する。
                while ((_remainSize >= 2) && ((byte)JpegMarkerCodes.MARKER_ID == _jpegData[_jpegDataIndex]))
                {
                    // (マーカに先行するフィルバイトおよび)マーカの第一バイトを読み飛ばす。
                    while ((byte)JpegMarkerCodes.MARKER_ID == _jpegData[_jpegDataIndex])
                    {
                        _jpegDataIndex++;
                        _remainSize--;
                    }

                    if (--_remainSize < 0)
                    {
                        return(ReturnID.JpegDataErrorShortOfData);    // JPEGデータ不足
                    }
                    // EOIマーカがあれば、正常終了。
                    if ((byte)JpegMarkerCodes.EOI == _jpegData[_jpegDataIndex++])
                    {
                        return(ReturnID.Success);
                    }
                }

                return(ReturnID.JpegDataErrorNoEOIMarker);            // JPEGデータの最後にEOIマーカがない
            }
示例#3
0
 internal void Execute_ReturnSaveChangesCommand(object parameter)
 {
     if (MainWindowViewModel.GetInstance(null, null).CurrentCartProducts.Count > 0)
     {
         //Record Transaction
         RecordReturn();
         //Message
         MainWindowViewModel.GetInstance(null, null).Code               = "¡Devolución Registrada!";
         MainWindowViewModel.GetInstance(null, null).CodeColor          = Constants.ColorCodeSave;
         MainWindowViewModel.GetInstance(null, null).ReturnID           = Int32.Parse(ReturnID);
         MainWindowViewModel.GetInstance(null, null).ReturnTransaction  = true;
         MainWindowViewModel.GetInstance(null, null).PaymentReceivedMXN = MainWindowViewModel.GetInstance(null, null).CalculateCurrentCartTotal();
         //Log
         MainWindowViewModel.GetInstance(null, null).Log.Write(MainWindowViewModel.GetInstance(null, null).CurrentUser.Name, this.ToString() + " " + System.Reflection.MethodBase.GetCurrentMethod().Name, "Devolucion Registrada Folio: " + ReturnID.ToString());
         MainWindowViewModel.GetInstance(null, null).CurrentPage = Constants.PaymentPage;
     }
     else
     {
         MainWindowViewModel.GetInstance(null, null).Code      = "¡Agregar Artículos al Carrito!";
         MainWindowViewModel.GetInstance(null, null).CodeColor = Constants.ColorCodeError;
     }
 }