| OLD | NEW |
| 1 // Copyright 2015 PDFium Authors. All rights reserved. | 1 // Copyright 2015 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/src/fxcodec/jbig2/JBig2_SddProc.h" | 7 #include "core/src/fxcodec/jbig2/JBig2_SddProc.h" |
| 8 | 8 |
| 9 #include <memory> |
| 9 #include <vector> | 10 #include <vector> |
| 10 | 11 |
| 11 #include "core/include/fxcrt/fx_basic.h" | 12 #include "core/include/fxcrt/fx_basic.h" |
| 12 #include "core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h" | 13 #include "core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h" |
| 13 #include "core/src/fxcodec/jbig2/JBig2_GrdProc.h" | 14 #include "core/src/fxcodec/jbig2/JBig2_GrdProc.h" |
| 14 #include "core/src/fxcodec/jbig2/JBig2_GrrdProc.h" | 15 #include "core/src/fxcodec/jbig2/JBig2_GrrdProc.h" |
| 15 #include "core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h" | 16 #include "core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h" |
| 16 #include "core/src/fxcodec/jbig2/JBig2_HuffmanTable.h" | 17 #include "core/src/fxcodec/jbig2/JBig2_HuffmanTable.h" |
| 17 #include "core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" | 18 #include "core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" |
| 18 #include "core/src/fxcodec/jbig2/JBig2_SymbolDict.h" | 19 #include "core/src/fxcodec/jbig2/JBig2_SymbolDict.h" |
| 19 #include "core/src/fxcodec/jbig2/JBig2_TrdProc.h" | 20 #include "core/src/fxcodec/jbig2/JBig2_TrdProc.h" |
| 20 #include "third_party/base/nonstd_unique_ptr.h" | |
| 21 | 21 |
| 22 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith( | 22 CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith( |
| 23 CJBig2_ArithDecoder* pArithDecoder, | 23 CJBig2_ArithDecoder* pArithDecoder, |
| 24 std::vector<JBig2ArithCtx>* gbContext, | 24 std::vector<JBig2ArithCtx>* gbContext, |
| 25 std::vector<JBig2ArithCtx>* grContext) { | 25 std::vector<JBig2ArithCtx>* grContext) { |
| 26 CJBig2_Image** SDNEWSYMS; | 26 CJBig2_Image** SDNEWSYMS; |
| 27 FX_DWORD HCHEIGHT, NSYMSDECODED; | 27 FX_DWORD HCHEIGHT, NSYMSDECODED; |
| 28 int32_t HCDH; | 28 int32_t HCDH; |
| 29 FX_DWORD SYMWIDTH, TOTWIDTH; | 29 FX_DWORD SYMWIDTH, TOTWIDTH; |
| 30 int32_t DW; | 30 int32_t DW; |
| 31 CJBig2_Image* BS; | 31 CJBig2_Image* BS; |
| 32 FX_DWORD I, J, REFAGGNINST; | 32 FX_DWORD I, J, REFAGGNINST; |
| 33 FX_BOOL* EXFLAGS; | 33 FX_BOOL* EXFLAGS; |
| 34 FX_DWORD EXINDEX; | 34 FX_DWORD EXINDEX; |
| 35 FX_BOOL CUREXFLAG; | 35 FX_BOOL CUREXFLAG; |
| 36 FX_DWORD EXRUNLENGTH; | 36 FX_DWORD EXRUNLENGTH; |
| 37 FX_DWORD nTmp; | 37 FX_DWORD nTmp; |
| 38 FX_DWORD SBNUMSYMS; | 38 FX_DWORD SBNUMSYMS; |
| 39 uint8_t SBSYMCODELEN; | 39 uint8_t SBSYMCODELEN; |
| 40 int32_t RDXI, RDYI; | 40 int32_t RDXI, RDYI; |
| 41 CJBig2_Image** SBSYMS; | 41 CJBig2_Image** SBSYMS; |
| 42 nonstd::unique_ptr<CJBig2_ArithIaidDecoder> IAID; | 42 std::unique_ptr<CJBig2_ArithIaidDecoder> IAID; |
| 43 nonstd::unique_ptr<CJBig2_SymbolDict> pDict; | 43 std::unique_ptr<CJBig2_SymbolDict> pDict; |
| 44 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADH(new CJBig2_ArithIntDecoder); | 44 std::unique_ptr<CJBig2_ArithIntDecoder> IADH(new CJBig2_ArithIntDecoder); |
| 45 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADW(new CJBig2_ArithIntDecoder); | 45 std::unique_ptr<CJBig2_ArithIntDecoder> IADW(new CJBig2_ArithIntDecoder); |
| 46 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAAI(new CJBig2_ArithIntDecoder); | 46 std::unique_ptr<CJBig2_ArithIntDecoder> IAAI(new CJBig2_ArithIntDecoder); |
| 47 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDX(new CJBig2_ArithIntDecoder); | 47 std::unique_ptr<CJBig2_ArithIntDecoder> IARDX(new CJBig2_ArithIntDecoder); |
| 48 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDY(new CJBig2_ArithIntDecoder); | 48 std::unique_ptr<CJBig2_ArithIntDecoder> IARDY(new CJBig2_ArithIntDecoder); |
| 49 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAEX(new CJBig2_ArithIntDecoder); | 49 std::unique_ptr<CJBig2_ArithIntDecoder> IAEX(new CJBig2_ArithIntDecoder); |
| 50 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADT(new CJBig2_ArithIntDecoder); | 50 std::unique_ptr<CJBig2_ArithIntDecoder> IADT(new CJBig2_ArithIntDecoder); |
| 51 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAFS(new CJBig2_ArithIntDecoder); | 51 std::unique_ptr<CJBig2_ArithIntDecoder> IAFS(new CJBig2_ArithIntDecoder); |
| 52 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IADS(new CJBig2_ArithIntDecoder); | 52 std::unique_ptr<CJBig2_ArithIntDecoder> IADS(new CJBig2_ArithIntDecoder); |
| 53 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IAIT(new CJBig2_ArithIntDecoder); | 53 std::unique_ptr<CJBig2_ArithIntDecoder> IAIT(new CJBig2_ArithIntDecoder); |
| 54 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARI(new CJBig2_ArithIntDecoder); | 54 std::unique_ptr<CJBig2_ArithIntDecoder> IARI(new CJBig2_ArithIntDecoder); |
| 55 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDW(new CJBig2_ArithIntDecoder); | 55 std::unique_ptr<CJBig2_ArithIntDecoder> IARDW(new CJBig2_ArithIntDecoder); |
| 56 nonstd::unique_ptr<CJBig2_ArithIntDecoder> IARDH(new CJBig2_ArithIntDecoder); | 56 std::unique_ptr<CJBig2_ArithIntDecoder> IARDH(new CJBig2_ArithIntDecoder); |
| 57 nTmp = 0; | 57 nTmp = 0; |
| 58 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { | 58 while ((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { |
| 59 nTmp++; | 59 nTmp++; |
| 60 } | 60 } |
| 61 IAID.reset(new CJBig2_ArithIaidDecoder((uint8_t)nTmp)); | 61 IAID.reset(new CJBig2_ArithIaidDecoder((uint8_t)nTmp)); |
| 62 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); | 62 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); |
| 63 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); | 63 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
| 64 | 64 |
| 65 HCHEIGHT = 0; | 65 HCHEIGHT = 0; |
| 66 NSYMSDECODED = 0; | 66 NSYMSDECODED = 0; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 85 goto failed; | 85 goto failed; |
| 86 | 86 |
| 87 if (HCHEIGHT == 0 || SYMWIDTH == 0) { | 87 if (HCHEIGHT == 0 || SYMWIDTH == 0) { |
| 88 TOTWIDTH = TOTWIDTH + SYMWIDTH; | 88 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
| 89 SDNEWSYMS[NSYMSDECODED] = nullptr; | 89 SDNEWSYMS[NSYMSDECODED] = nullptr; |
| 90 NSYMSDECODED = NSYMSDECODED + 1; | 90 NSYMSDECODED = NSYMSDECODED + 1; |
| 91 continue; | 91 continue; |
| 92 } | 92 } |
| 93 TOTWIDTH = TOTWIDTH + SYMWIDTH; | 93 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
| 94 if (SDREFAGG == 0) { | 94 if (SDREFAGG == 0) { |
| 95 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc()); | 95 std::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc()); |
| 96 pGRD->MMR = 0; | 96 pGRD->MMR = 0; |
| 97 pGRD->GBW = SYMWIDTH; | 97 pGRD->GBW = SYMWIDTH; |
| 98 pGRD->GBH = HCHEIGHT; | 98 pGRD->GBH = HCHEIGHT; |
| 99 pGRD->GBTEMPLATE = SDTEMPLATE; | 99 pGRD->GBTEMPLATE = SDTEMPLATE; |
| 100 pGRD->TPGDON = 0; | 100 pGRD->TPGDON = 0; |
| 101 pGRD->USESKIP = 0; | 101 pGRD->USESKIP = 0; |
| 102 pGRD->GBAT[0] = SDAT[0]; | 102 pGRD->GBAT[0] = SDAT[0]; |
| 103 pGRD->GBAT[1] = SDAT[1]; | 103 pGRD->GBAT[1] = SDAT[1]; |
| 104 pGRD->GBAT[2] = SDAT[2]; | 104 pGRD->GBAT[2] = SDAT[2]; |
| 105 pGRD->GBAT[3] = SDAT[3]; | 105 pGRD->GBAT[3] = SDAT[3]; |
| 106 pGRD->GBAT[4] = SDAT[4]; | 106 pGRD->GBAT[4] = SDAT[4]; |
| 107 pGRD->GBAT[5] = SDAT[5]; | 107 pGRD->GBAT[5] = SDAT[5]; |
| 108 pGRD->GBAT[6] = SDAT[6]; | 108 pGRD->GBAT[6] = SDAT[6]; |
| 109 pGRD->GBAT[7] = SDAT[7]; | 109 pGRD->GBAT[7] = SDAT[7]; |
| 110 BS = pGRD->decode_Arith(pArithDecoder, gbContext->data()); | 110 BS = pGRD->decode_Arith(pArithDecoder, gbContext->data()); |
| 111 if (!BS) { | 111 if (!BS) { |
| 112 goto failed; | 112 goto failed; |
| 113 } | 113 } |
| 114 } else { | 114 } else { |
| 115 IAAI->decode(pArithDecoder, (int*)&REFAGGNINST); | 115 IAAI->decode(pArithDecoder, (int*)&REFAGGNINST); |
| 116 if (REFAGGNINST > 1) { | 116 if (REFAGGNINST > 1) { |
| 117 nonstd::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); | 117 std::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); |
| 118 pDecoder->SBHUFF = SDHUFF; | 118 pDecoder->SBHUFF = SDHUFF; |
| 119 pDecoder->SBREFINE = 1; | 119 pDecoder->SBREFINE = 1; |
| 120 pDecoder->SBW = SYMWIDTH; | 120 pDecoder->SBW = SYMWIDTH; |
| 121 pDecoder->SBH = HCHEIGHT; | 121 pDecoder->SBH = HCHEIGHT; |
| 122 pDecoder->SBNUMINSTANCES = REFAGGNINST; | 122 pDecoder->SBNUMINSTANCES = REFAGGNINST; |
| 123 pDecoder->SBSTRIPS = 1; | 123 pDecoder->SBSTRIPS = 1; |
| 124 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; | 124 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
| 125 SBNUMSYMS = pDecoder->SBNUMSYMS; | 125 SBNUMSYMS = pDecoder->SBNUMSYMS; |
| 126 nTmp = 0; | 126 nTmp = 0; |
| 127 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { | 127 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
| 128 nTmp++; | 128 nTmp++; |
| 129 } | 129 } |
| 130 SBSYMCODELEN = (uint8_t)nTmp; | 130 SBSYMCODELEN = (uint8_t)nTmp; |
| 131 pDecoder->SBSYMCODELEN = SBSYMCODELEN; | 131 pDecoder->SBSYMCODELEN = SBSYMCODELEN; |
| 132 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 132 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
| 133 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 133 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 134 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 134 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 135 NSYMSDECODED * sizeof(CJBig2_Image*)); | 135 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 136 pDecoder->SBSYMS = SBSYMS; | 136 pDecoder->SBSYMS = SBSYMS; |
| 137 pDecoder->SBDEFPIXEL = 0; | 137 pDecoder->SBDEFPIXEL = 0; |
| 138 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; | 138 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
| 139 pDecoder->TRANSPOSED = 0; | 139 pDecoder->TRANSPOSED = 0; |
| 140 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; | 140 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
| 141 pDecoder->SBDSOFFSET = 0; | 141 pDecoder->SBDSOFFSET = 0; |
| 142 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS( | 142 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(new CJBig2_HuffmanTable( |
| 143 new CJBig2_HuffmanTable(HuffmanTable_B6, | 143 HuffmanTable_B6, FX_ArraySize(HuffmanTable_B6), |
| 144 FX_ArraySize(HuffmanTable_B6), | 144 HuffmanTable_HTOOB_B6)); |
| 145 HuffmanTable_HTOOB_B6)); | 145 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(new CJBig2_HuffmanTable( |
| 146 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS( | 146 HuffmanTable_B8, FX_ArraySize(HuffmanTable_B8), |
| 147 new CJBig2_HuffmanTable(HuffmanTable_B8, | 147 HuffmanTable_HTOOB_B8)); |
| 148 FX_ArraySize(HuffmanTable_B8), | 148 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(new CJBig2_HuffmanTable( |
| 149 HuffmanTable_HTOOB_B8)); | 149 HuffmanTable_B11, FX_ArraySize(HuffmanTable_B11), |
| 150 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT( | 150 HuffmanTable_HTOOB_B11)); |
| 151 new CJBig2_HuffmanTable(HuffmanTable_B11, | 151 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( |
| 152 FX_ArraySize(HuffmanTable_B11), | |
| 153 HuffmanTable_HTOOB_B11)); | |
| 154 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( | |
| 155 new CJBig2_HuffmanTable(HuffmanTable_B15, | 152 new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 156 FX_ArraySize(HuffmanTable_B15), | 153 FX_ArraySize(HuffmanTable_B15), |
| 157 HuffmanTable_HTOOB_B15)); | 154 HuffmanTable_HTOOB_B15)); |
| 158 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( | 155 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( |
| 159 new CJBig2_HuffmanTable(HuffmanTable_B15, | 156 new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 160 FX_ArraySize(HuffmanTable_B15), | 157 FX_ArraySize(HuffmanTable_B15), |
| 161 HuffmanTable_HTOOB_B15)); | 158 HuffmanTable_HTOOB_B15)); |
| 162 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( | 159 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( |
| 163 new CJBig2_HuffmanTable(HuffmanTable_B15, | 160 new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 164 FX_ArraySize(HuffmanTable_B15), | 161 FX_ArraySize(HuffmanTable_B15), |
| 165 HuffmanTable_HTOOB_B15)); | 162 HuffmanTable_HTOOB_B15)); |
| 166 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( | 163 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( |
| 167 new CJBig2_HuffmanTable(HuffmanTable_B15, | 164 new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 168 FX_ArraySize(HuffmanTable_B15), | 165 FX_ArraySize(HuffmanTable_B15), |
| 169 HuffmanTable_HTOOB_B15)); | 166 HuffmanTable_HTOOB_B15)); |
| 170 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( | 167 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( |
| 171 new CJBig2_HuffmanTable(HuffmanTable_B1, | 168 new CJBig2_HuffmanTable(HuffmanTable_B1, |
| 172 FX_ArraySize(HuffmanTable_B1), | 169 FX_ArraySize(HuffmanTable_B1), |
| 173 HuffmanTable_HTOOB_B1)); | 170 HuffmanTable_HTOOB_B1)); |
| 174 pDecoder->SBHUFFFS = SBHUFFFS.get(); | 171 pDecoder->SBHUFFFS = SBHUFFFS.get(); |
| 175 pDecoder->SBHUFFDS = SBHUFFDS.get(); | 172 pDecoder->SBHUFFDS = SBHUFFDS.get(); |
| 176 pDecoder->SBHUFFDT = SBHUFFDT.get(); | 173 pDecoder->SBHUFFDT = SBHUFFDT.get(); |
| 177 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); | 174 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); |
| 178 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); | 175 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); |
| 179 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); | 176 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); |
| 180 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); | 177 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 211 goto failed; | 208 goto failed; |
| 212 } | 209 } |
| 213 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 210 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
| 214 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 211 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 215 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 212 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 216 NSYMSDECODED * sizeof(CJBig2_Image*)); | 213 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 217 if (!SBSYMS[IDI]) { | 214 if (!SBSYMS[IDI]) { |
| 218 FX_Free(SBSYMS); | 215 FX_Free(SBSYMS); |
| 219 goto failed; | 216 goto failed; |
| 220 } | 217 } |
| 221 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc()); | 218 std::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc()); |
| 222 pGRRD->GRW = SYMWIDTH; | 219 pGRRD->GRW = SYMWIDTH; |
| 223 pGRRD->GRH = HCHEIGHT; | 220 pGRRD->GRH = HCHEIGHT; |
| 224 pGRRD->GRTEMPLATE = SDRTEMPLATE; | 221 pGRRD->GRTEMPLATE = SDRTEMPLATE; |
| 225 pGRRD->GRREFERENCE = SBSYMS[IDI]; | 222 pGRRD->GRREFERENCE = SBSYMS[IDI]; |
| 226 pGRRD->GRREFERENCEDX = RDXI; | 223 pGRRD->GRREFERENCEDX = RDXI; |
| 227 pGRRD->GRREFERENCEDY = RDYI; | 224 pGRRD->GRREFERENCEDY = RDYI; |
| 228 pGRRD->TPGRON = 0; | 225 pGRRD->TPGRON = 0; |
| 229 pGRRD->GRAT[0] = SDRAT[0]; | 226 pGRRD->GRAT[0] = SDRAT[0]; |
| 230 pGRRD->GRAT[1] = SDRAT[1]; | 227 pGRRD->GRAT[1] = SDRAT[1]; |
| 231 pGRRD->GRAT[2] = SDRAT[2]; | 228 pGRRD->GRAT[2] = SDRAT[2]; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 int32_t nVal, nBits; | 305 int32_t nVal, nBits; |
| 309 FX_DWORD nTmp; | 306 FX_DWORD nTmp; |
| 310 FX_DWORD SBNUMSYMS; | 307 FX_DWORD SBNUMSYMS; |
| 311 uint8_t SBSYMCODELEN; | 308 uint8_t SBSYMCODELEN; |
| 312 JBig2HuffmanCode* SBSYMCODES; | 309 JBig2HuffmanCode* SBSYMCODES; |
| 313 FX_DWORD IDI; | 310 FX_DWORD IDI; |
| 314 int32_t RDXI, RDYI; | 311 int32_t RDXI, RDYI; |
| 315 FX_DWORD BMSIZE; | 312 FX_DWORD BMSIZE; |
| 316 FX_DWORD stride; | 313 FX_DWORD stride; |
| 317 CJBig2_Image** SBSYMS; | 314 CJBig2_Image** SBSYMS; |
| 318 nonstd::unique_ptr<CJBig2_HuffmanDecoder> pHuffmanDecoder( | 315 std::unique_ptr<CJBig2_HuffmanDecoder> pHuffmanDecoder( |
| 319 new CJBig2_HuffmanDecoder(pStream)); | 316 new CJBig2_HuffmanDecoder(pStream)); |
| 320 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); | 317 SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); |
| 321 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); | 318 FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); |
| 322 SDNEWSYMWIDTHS = nullptr; | 319 SDNEWSYMWIDTHS = nullptr; |
| 323 BHC = nullptr; | 320 BHC = nullptr; |
| 324 if (SDREFAGG == 0) { | 321 if (SDREFAGG == 0) { |
| 325 SDNEWSYMWIDTHS = FX_Alloc(FX_DWORD, SDNUMNEWSYMS); | 322 SDNEWSYMWIDTHS = FX_Alloc(FX_DWORD, SDNUMNEWSYMS); |
| 326 FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(FX_DWORD)); | 323 FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(FX_DWORD)); |
| 327 } | 324 } |
| 328 nonstd::unique_ptr<CJBig2_SymbolDict> pDict(new CJBig2_SymbolDict()); | 325 std::unique_ptr<CJBig2_SymbolDict> pDict(new CJBig2_SymbolDict()); |
| 329 nonstd::unique_ptr<CJBig2_HuffmanTable> pTable; | 326 std::unique_ptr<CJBig2_HuffmanTable> pTable; |
| 330 | 327 |
| 331 HCHEIGHT = 0; | 328 HCHEIGHT = 0; |
| 332 NSYMSDECODED = 0; | 329 NSYMSDECODED = 0; |
| 333 BS = nullptr; | 330 BS = nullptr; |
| 334 while (NSYMSDECODED < SDNUMNEWSYMS) { | 331 while (NSYMSDECODED < SDNUMNEWSYMS) { |
| 335 if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { | 332 if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { |
| 336 goto failed; | 333 goto failed; |
| 337 } | 334 } |
| 338 HCHEIGHT = HCHEIGHT + HCDH; | 335 HCHEIGHT = HCHEIGHT + HCDH; |
| 339 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { | 336 if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 363 } | 360 } |
| 364 TOTWIDTH = TOTWIDTH + SYMWIDTH; | 361 TOTWIDTH = TOTWIDTH + SYMWIDTH; |
| 365 } | 362 } |
| 366 if (SDREFAGG == 1) { | 363 if (SDREFAGG == 1) { |
| 367 if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != | 364 if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != |
| 368 0) { | 365 0) { |
| 369 goto failed; | 366 goto failed; |
| 370 } | 367 } |
| 371 BS = nullptr; | 368 BS = nullptr; |
| 372 if (REFAGGNINST > 1) { | 369 if (REFAGGNINST > 1) { |
| 373 nonstd::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); | 370 std::unique_ptr<CJBig2_TRDProc> pDecoder(new CJBig2_TRDProc()); |
| 374 pDecoder->SBHUFF = SDHUFF; | 371 pDecoder->SBHUFF = SDHUFF; |
| 375 pDecoder->SBREFINE = 1; | 372 pDecoder->SBREFINE = 1; |
| 376 pDecoder->SBW = SYMWIDTH; | 373 pDecoder->SBW = SYMWIDTH; |
| 377 pDecoder->SBH = HCHEIGHT; | 374 pDecoder->SBH = HCHEIGHT; |
| 378 pDecoder->SBNUMINSTANCES = REFAGGNINST; | 375 pDecoder->SBNUMINSTANCES = REFAGGNINST; |
| 379 pDecoder->SBSTRIPS = 1; | 376 pDecoder->SBSTRIPS = 1; |
| 380 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; | 377 pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; |
| 381 SBNUMSYMS = pDecoder->SBNUMSYMS; | 378 SBNUMSYMS = pDecoder->SBNUMSYMS; |
| 382 SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS); | 379 SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS); |
| 383 nTmp = 1; | 380 nTmp = 1; |
| 384 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { | 381 while ((FX_DWORD)(1 << nTmp) < SBNUMSYMS) { |
| 385 nTmp++; | 382 nTmp++; |
| 386 } | 383 } |
| 387 for (I = 0; I < SBNUMSYMS; I++) { | 384 for (I = 0; I < SBNUMSYMS; I++) { |
| 388 SBSYMCODES[I].codelen = nTmp; | 385 SBSYMCODES[I].codelen = nTmp; |
| 389 SBSYMCODES[I].code = I; | 386 SBSYMCODES[I].code = I; |
| 390 } | 387 } |
| 391 pDecoder->SBSYMCODES = SBSYMCODES; | 388 pDecoder->SBSYMCODES = SBSYMCODES; |
| 392 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 389 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
| 393 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 390 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 394 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 391 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 395 NSYMSDECODED * sizeof(CJBig2_Image*)); | 392 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 396 pDecoder->SBSYMS = SBSYMS; | 393 pDecoder->SBSYMS = SBSYMS; |
| 397 pDecoder->SBDEFPIXEL = 0; | 394 pDecoder->SBDEFPIXEL = 0; |
| 398 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; | 395 pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; |
| 399 pDecoder->TRANSPOSED = 0; | 396 pDecoder->TRANSPOSED = 0; |
| 400 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; | 397 pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; |
| 401 pDecoder->SBDSOFFSET = 0; | 398 pDecoder->SBDSOFFSET = 0; |
| 402 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS( | 399 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFFS(new CJBig2_HuffmanTable( |
| 403 new CJBig2_HuffmanTable(HuffmanTable_B6, | 400 HuffmanTable_B6, FX_ArraySize(HuffmanTable_B6), |
| 404 FX_ArraySize(HuffmanTable_B6), | 401 HuffmanTable_HTOOB_B6)); |
| 405 HuffmanTable_HTOOB_B6)); | 402 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS(new CJBig2_HuffmanTable( |
| 406 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDS( | 403 HuffmanTable_B8, FX_ArraySize(HuffmanTable_B8), |
| 407 new CJBig2_HuffmanTable(HuffmanTable_B8, | 404 HuffmanTable_HTOOB_B8)); |
| 408 FX_ArraySize(HuffmanTable_B8), | 405 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT(new CJBig2_HuffmanTable( |
| 409 HuffmanTable_HTOOB_B8)); | 406 HuffmanTable_B11, FX_ArraySize(HuffmanTable_B11), |
| 410 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFDT( | 407 HuffmanTable_HTOOB_B11)); |
| 411 new CJBig2_HuffmanTable(HuffmanTable_B11, | 408 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( |
| 412 FX_ArraySize(HuffmanTable_B11), | |
| 413 HuffmanTable_HTOOB_B11)); | |
| 414 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDW( | |
| 415 new CJBig2_HuffmanTable(HuffmanTable_B15, | 409 new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 416 FX_ArraySize(HuffmanTable_B15), | 410 FX_ArraySize(HuffmanTable_B15), |
| 417 HuffmanTable_HTOOB_B15)); | 411 HuffmanTable_HTOOB_B15)); |
| 418 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( | 412 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDH( |
| 419 new CJBig2_HuffmanTable(HuffmanTable_B15, | 413 new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 420 FX_ArraySize(HuffmanTable_B15), | 414 FX_ArraySize(HuffmanTable_B15), |
| 421 HuffmanTable_HTOOB_B15)); | 415 HuffmanTable_HTOOB_B15)); |
| 422 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( | 416 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( |
| 423 new CJBig2_HuffmanTable(HuffmanTable_B15, | 417 new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 424 FX_ArraySize(HuffmanTable_B15), | 418 FX_ArraySize(HuffmanTable_B15), |
| 425 HuffmanTable_HTOOB_B15)); | 419 HuffmanTable_HTOOB_B15)); |
| 426 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( | 420 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDY( |
| 427 new CJBig2_HuffmanTable(HuffmanTable_B15, | 421 new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 428 FX_ArraySize(HuffmanTable_B15), | 422 FX_ArraySize(HuffmanTable_B15), |
| 429 HuffmanTable_HTOOB_B15)); | 423 HuffmanTable_HTOOB_B15)); |
| 430 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( | 424 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( |
| 431 new CJBig2_HuffmanTable(HuffmanTable_B1, | 425 new CJBig2_HuffmanTable(HuffmanTable_B1, |
| 432 FX_ArraySize(HuffmanTable_B1), | 426 FX_ArraySize(HuffmanTable_B1), |
| 433 HuffmanTable_HTOOB_B1)); | 427 HuffmanTable_HTOOB_B1)); |
| 434 pDecoder->SBHUFFFS = SBHUFFFS.get(); | 428 pDecoder->SBHUFFFS = SBHUFFFS.get(); |
| 435 pDecoder->SBHUFFDS = SBHUFFDS.get(); | 429 pDecoder->SBHUFFDS = SBHUFFDS.get(); |
| 436 pDecoder->SBHUFFDT = SBHUFFDT.get(); | 430 pDecoder->SBHUFFDT = SBHUFFDT.get(); |
| 437 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); | 431 pDecoder->SBHUFFRDW = SBHUFFRDW.get(); |
| 438 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); | 432 pDecoder->SBHUFFRDH = SBHUFFRDH.get(); |
| 439 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); | 433 pDecoder->SBHUFFRDX = SBHUFFRDX.get(); |
| 440 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); | 434 pDecoder->SBHUFFRDY = SBHUFFRDY.get(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 if ((nVal == SBSYMCODES[IDI].code) && | 470 if ((nVal == SBSYMCODES[IDI].code) && |
| 477 (nBits == SBSYMCODES[IDI].codelen)) { | 471 (nBits == SBSYMCODES[IDI].codelen)) { |
| 478 break; | 472 break; |
| 479 } | 473 } |
| 480 } | 474 } |
| 481 if (IDI < SBNUMSYMS) { | 475 if (IDI < SBNUMSYMS) { |
| 482 break; | 476 break; |
| 483 } | 477 } |
| 484 } | 478 } |
| 485 FX_Free(SBSYMCODES); | 479 FX_Free(SBSYMCODES); |
| 486 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( | 480 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRDX( |
| 487 new CJBig2_HuffmanTable(HuffmanTable_B15, | 481 new CJBig2_HuffmanTable(HuffmanTable_B15, |
| 488 FX_ArraySize(HuffmanTable_B15), | 482 FX_ArraySize(HuffmanTable_B15), |
| 489 HuffmanTable_HTOOB_B15)); | 483 HuffmanTable_HTOOB_B15)); |
| 490 nonstd::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( | 484 std::unique_ptr<CJBig2_HuffmanTable> SBHUFFRSIZE( |
| 491 new CJBig2_HuffmanTable(HuffmanTable_B1, | 485 new CJBig2_HuffmanTable(HuffmanTable_B1, |
| 492 FX_ArraySize(HuffmanTable_B1), | 486 FX_ArraySize(HuffmanTable_B1), |
| 493 HuffmanTable_HTOOB_B1)); | 487 HuffmanTable_HTOOB_B1)); |
| 494 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDXI) != 0) || | 488 if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDXI) != 0) || |
| 495 (pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDYI) != 0) || | 489 (pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDYI) != 0) || |
| 496 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE.get(), &nVal) != 0)) { | 490 (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE.get(), &nVal) != 0)) { |
| 497 goto failed; | 491 goto failed; |
| 498 } | 492 } |
| 499 pStream->alignByte(); | 493 pStream->alignByte(); |
| 500 nTmp = pStream->getOffset(); | 494 nTmp = pStream->getOffset(); |
| 501 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); | 495 SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); |
| 502 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); | 496 JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); |
| 503 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, | 497 JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, |
| 504 NSYMSDECODED * sizeof(CJBig2_Image*)); | 498 NSYMSDECODED * sizeof(CJBig2_Image*)); |
| 505 nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc()); | 499 std::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc()); |
| 506 pGRRD->GRW = SYMWIDTH; | 500 pGRRD->GRW = SYMWIDTH; |
| 507 pGRRD->GRH = HCHEIGHT; | 501 pGRRD->GRH = HCHEIGHT; |
| 508 pGRRD->GRTEMPLATE = SDRTEMPLATE; | 502 pGRRD->GRTEMPLATE = SDRTEMPLATE; |
| 509 pGRRD->GRREFERENCE = SBSYMS[IDI]; | 503 pGRRD->GRREFERENCE = SBSYMS[IDI]; |
| 510 pGRRD->GRREFERENCEDX = RDXI; | 504 pGRRD->GRREFERENCEDX = RDXI; |
| 511 pGRRD->GRREFERENCEDY = RDYI; | 505 pGRRD->GRREFERENCEDY = RDYI; |
| 512 pGRRD->TPGRON = 0; | 506 pGRRD->TPGRON = 0; |
| 513 pGRRD->GRAT[0] = SDRAT[0]; | 507 pGRRD->GRAT[0] = SDRAT[0]; |
| 514 pGRRD->GRAT[1] = SDRAT[1]; | 508 pGRRD->GRAT[1] = SDRAT[1]; |
| 515 pGRRD->GRAT[2] = SDRAT[2]; | 509 pGRRD->GRAT[2] = SDRAT[2]; |
| 516 pGRRD->GRAT[3] = SDRAT[3]; | 510 pGRRD->GRAT[3] = SDRAT[3]; |
| 517 nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder( | 511 std::unique_ptr<CJBig2_ArithDecoder> pArithDecoder( |
| 518 new CJBig2_ArithDecoder(pStream)); | 512 new CJBig2_ArithDecoder(pStream)); |
| 519 BS = pGRRD->decode(pArithDecoder.get(), grContext->data()); | 513 BS = pGRRD->decode(pArithDecoder.get(), grContext->data()); |
| 520 if (!BS) { | 514 if (!BS) { |
| 521 FX_Free(SBSYMS); | 515 FX_Free(SBSYMS); |
| 522 goto failed; | 516 goto failed; |
| 523 } | 517 } |
| 524 pStream->alignByte(); | 518 pStream->alignByte(); |
| 525 pStream->offset(2); | 519 pStream->offset(2); |
| 526 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { | 520 if ((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) { |
| 527 delete BS; | 521 delete BS; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 548 BHC = new CJBig2_Image(TOTWIDTH, HCHEIGHT); | 542 BHC = new CJBig2_Image(TOTWIDTH, HCHEIGHT); |
| 549 for (I = 0; I < HCHEIGHT; I++) { | 543 for (I = 0; I < HCHEIGHT; I++) { |
| 550 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, | 544 JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, |
| 551 pStream->getPointer(), stride); | 545 pStream->getPointer(), stride); |
| 552 pStream->offset(stride); | 546 pStream->offset(stride); |
| 553 } | 547 } |
| 554 } else { | 548 } else { |
| 555 goto failed; | 549 goto failed; |
| 556 } | 550 } |
| 557 } else { | 551 } else { |
| 558 nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc()); | 552 std::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc()); |
| 559 pGRD->MMR = 1; | 553 pGRD->MMR = 1; |
| 560 pGRD->GBW = TOTWIDTH; | 554 pGRD->GBW = TOTWIDTH; |
| 561 pGRD->GBH = HCHEIGHT; | 555 pGRD->GBH = HCHEIGHT; |
| 562 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream, nullptr); | 556 FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream, nullptr); |
| 563 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 557 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
| 564 pGRD->Continue_decode(pPause); | 558 pGRD->Continue_decode(pPause); |
| 565 } | 559 } |
| 566 pStream->alignByte(); | 560 pStream->alignByte(); |
| 567 } | 561 } |
| 568 nTmp = 0; | 562 nTmp = 0; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 621 failed: | 615 failed: |
| 622 for (I = 0; I < NSYMSDECODED; I++) { | 616 for (I = 0; I < NSYMSDECODED; I++) { |
| 623 delete SDNEWSYMS[I]; | 617 delete SDNEWSYMS[I]; |
| 624 } | 618 } |
| 625 FX_Free(SDNEWSYMS); | 619 FX_Free(SDNEWSYMS); |
| 626 if (SDREFAGG == 0) { | 620 if (SDREFAGG == 0) { |
| 627 FX_Free(SDNEWSYMWIDTHS); | 621 FX_Free(SDNEWSYMWIDTHS); |
| 628 } | 622 } |
| 629 return nullptr; | 623 return nullptr; |
| 630 } | 624 } |
| OLD | NEW |