Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(46)

Side by Side Diff: core/src/fxcodec/codec/fx_codec_jbig.cpp

Issue 453133004: clang-format all code (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 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 "../../../include/fxcodec/fx_codec.h" 7 #include "../../../include/fxcodec/fx_codec.h"
8 #include "codec_int.h" 8 #include "codec_int.h"
9 CCodec_Jbig2Context::CCodec_Jbig2Context() 9 CCodec_Jbig2Context::CCodec_Jbig2Context() {
10 { 10 FXSYS_memset32(this, 0, sizeof(CCodec_Jbig2Context));
11 FXSYS_memset32(this, 0, sizeof(CCodec_Jbig2Context)); 11 }
12 } 12 CCodec_Jbig2Module::~CCodec_Jbig2Module() {
13 CCodec_Jbig2Module::~CCodec_Jbig2Module() 13 }
14 { 14 void* CCodec_Jbig2Module::CreateJbig2Context() {
15 } 15 return FX_NEW CCodec_Jbig2Context();
16 void* CCodec_Jbig2Module::CreateJbig2Context() 16 }
17 { 17 void CCodec_Jbig2Module::DestroyJbig2Context(void* pJbig2Content) {
18 return FX_NEW CCodec_Jbig2Context(); 18 if (pJbig2Content) {
19 } 19 CJBig2_Context::DestroyContext(
20 void CCodec_Jbig2Module::DestroyJbig2Context(void* pJbig2Content) 20 ((CCodec_Jbig2Context*)pJbig2Content)->m_pContext);
21 { 21 delete (CCodec_Jbig2Context*)pJbig2Content;
22 if(pJbig2Content) { 22 }
23 CJBig2_Context::DestroyContext(((CCodec_Jbig2Context*)pJbig2Content)->m_ pContext); 23 pJbig2Content = NULL;
24 delete (CCodec_Jbig2Context*)pJbig2Content; 24 }
25 } 25 FX_BOOL CCodec_Jbig2Module::Decode(FX_DWORD width,
26 pJbig2Content = NULL; 26 FX_DWORD height,
27 } 27 FX_LPCBYTE src_buf,
28 FX_BOOL CCodec_Jbig2Module::Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE s rc_buf, FX_DWORD src_size, 28 FX_DWORD src_size,
29 FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch) 29 FX_LPCBYTE global_data,
30 { 30 FX_DWORD global_size,
31 FXSYS_memset32(dest_buf, 0, height * dest_pitch); 31 FX_LPBYTE dest_buf,
32 CJBig2_Context* pContext = CJBig2_Context::CreateContext(&m_Module, 32 FX_DWORD dest_pitch) {
33 (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)s rc_buf, src_size, JBIG2_EMBED_STREAM); 33 FXSYS_memset32(dest_buf, 0, height * dest_pitch);
34 if (pContext == NULL) { 34 CJBig2_Context* pContext =
35 return FALSE; 35 CJBig2_Context::CreateContext(&m_Module,
36 } 36 (FX_LPBYTE)global_data,
37 int ret = pContext->getFirstPage(dest_buf, width, height, dest_pitch, NULL); 37 global_size,
38 CJBig2_Context::DestroyContext(pContext); 38 (FX_LPBYTE)src_buf,
39 src_size,
40 JBIG2_EMBED_STREAM);
41 if (pContext == NULL) {
42 return FALSE;
43 }
44 int ret = pContext->getFirstPage(dest_buf, width, height, dest_pitch, NULL);
45 CJBig2_Context::DestroyContext(pContext);
46 if (ret != JBIG2_SUCCESS) {
47 return FALSE;
48 }
49 int dword_size = height * dest_pitch / 4;
50 FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
51 for (int i = 0; i < dword_size; i++) {
52 dword_buf[i] = ~dword_buf[i];
53 }
54 return TRUE;
55 }
56 FX_BOOL CCodec_Jbig2Module::Decode(IFX_FileRead* file_ptr,
57 FX_DWORD& width,
58 FX_DWORD& height,
59 FX_DWORD& pitch,
60 FX_LPBYTE& dest_buf) {
61 CJBig2_Context* pContext = NULL;
62 CJBig2_Image* dest_image = NULL;
63 FX_DWORD src_size = (FX_DWORD)file_ptr->GetSize();
64 FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);
65 if (src_buf == NULL) {
66 return FALSE;
67 }
68 int ret = 0;
69 if (!file_ptr->ReadBlock(src_buf, 0, src_size)) {
70 goto failed;
71 }
72 pContext = CJBig2_Context::CreateContext(
73 &m_Module, NULL, 0, src_buf, src_size, JBIG2_FILE_STREAM);
74 if (pContext == NULL) {
75 goto failed;
76 }
77 ret = pContext->getFirstPage(&dest_image, NULL);
78 CJBig2_Context::DestroyContext(pContext);
79 if (ret != JBIG2_SUCCESS) {
80 goto failed;
81 }
82 width = (FX_DWORD)dest_image->m_nWidth;
83 height = (FX_DWORD)dest_image->m_nHeight;
84 pitch = (FX_DWORD)dest_image->m_nStride;
85 dest_buf = dest_image->m_pData;
86 dest_image->m_bNeedFree = FALSE;
87 delete dest_image;
88 FX_Free(src_buf);
89 return TRUE;
90 failed:
91 if (src_buf) {
92 FX_Free(src_buf);
93 }
94 return FALSE;
95 }
96 FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context,
97 FX_DWORD width,
98 FX_DWORD height,
99 FX_LPCBYTE src_buf,
100 FX_DWORD src_size,
101 FX_LPCBYTE global_data,
102 FX_DWORD global_size,
103 FX_LPBYTE dest_buf,
104 FX_DWORD dest_pitch,
105 IFX_Pause* pPause) {
106 if (!pJbig2Context) {
107 return FXCODEC_STATUS_ERR_PARAMS;
108 }
109 CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
110 m_pJbig2Context->m_width = width;
111 m_pJbig2Context->m_height = height;
112 m_pJbig2Context->m_src_buf = (unsigned char*)src_buf;
113 m_pJbig2Context->m_src_size = src_size;
114 m_pJbig2Context->m_global_data = global_data;
115 m_pJbig2Context->m_global_size = global_size;
116 m_pJbig2Context->m_dest_buf = dest_buf;
117 m_pJbig2Context->m_dest_pitch = dest_pitch;
118 m_pJbig2Context->m_pPause = pPause;
119 m_pJbig2Context->m_bFileReader = FALSE;
120 FXSYS_memset32(dest_buf, 0, height * dest_pitch);
121 m_pJbig2Context->m_pContext =
122 CJBig2_Context::CreateContext(&m_Module,
123 (FX_LPBYTE)global_data,
124 global_size,
125 (FX_LPBYTE)src_buf,
126 src_size,
127 JBIG2_EMBED_STREAM,
128 pPause);
129 if (!m_pJbig2Context->m_pContext) {
130 return FXCODEC_STATUS_ERROR;
131 }
132 int ret = m_pJbig2Context->m_pContext->getFirstPage(
133 dest_buf, width, height, dest_pitch, pPause);
134 if (m_pJbig2Context->m_pContext->GetProcessiveStatus() ==
135 FXCODEC_STATUS_DECODE_FINISH) {
136 CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
137 m_pJbig2Context->m_pContext = NULL;
39 if (ret != JBIG2_SUCCESS) { 138 if (ret != JBIG2_SUCCESS) {
40 return FALSE; 139 return FXCODEC_STATUS_ERROR;
41 } 140 }
42 int dword_size = height * dest_pitch / 4; 141 int dword_size = height * dest_pitch / 4;
43 FX_DWORD* dword_buf = (FX_DWORD*)dest_buf; 142 FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
44 for (int i = 0; i < dword_size; i ++) { 143 for (int i = 0; i < dword_size; i++) {
45 dword_buf[i] = ~dword_buf[i]; 144 dword_buf[i] = ~dword_buf[i];
46 } 145 }
47 return TRUE; 146 return FXCODEC_STATUS_DECODE_FINISH;
48 } 147 }
49 FX_BOOL CCodec_Jbig2Module::Decode(IFX_FileRead* file_ptr, 148 return m_pJbig2Context->m_pContext->GetProcessiveStatus();
50 FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf) 149 }
51 { 150 FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context,
52 CJBig2_Context* pContext = NULL; 151 IFX_FileRead* file_ptr,
53 CJBig2_Image* dest_image = NULL; 152 FX_DWORD& width,
54 FX_DWORD src_size = (FX_DWORD)file_ptr->GetSize(); 153 FX_DWORD& height,
55 FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size); 154 FX_DWORD& pitch,
56 if (src_buf == NULL) { 155 FX_LPBYTE& dest_buf,
57 return FALSE; 156 IFX_Pause* pPause) {
58 } 157 if (!pJbig2Context) {
59 int ret = 0; 158 return FXCODEC_STATUS_ERR_PARAMS;
60 if(!file_ptr->ReadBlock(src_buf, 0, src_size)) { 159 }
61 goto failed; 160 CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
62 } 161 m_pJbig2Context->m_bFileReader = TRUE;
63 pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, src_buf, src_si ze, JBIG2_FILE_STREAM); 162 m_pJbig2Context->m_dest_image = NULL;
64 if(pContext == NULL) { 163 m_pJbig2Context->m_src_size = (FX_DWORD)file_ptr->GetSize();
65 goto failed; 164 m_pJbig2Context->m_src_buf = FX_Alloc(FX_BYTE, m_pJbig2Context->m_src_size);
66 } 165 if (m_pJbig2Context->m_src_buf == NULL) {
67 ret = pContext->getFirstPage(&dest_image, NULL); 166 return FXCODEC_STATUS_ERR_MEMORY;
68 CJBig2_Context::DestroyContext(pContext); 167 }
69 if (ret != JBIG2_SUCCESS) { 168 int ret = 0;
70 goto failed; 169 if (!file_ptr->ReadBlock(
71 } 170 (void*)m_pJbig2Context->m_src_buf, 0, m_pJbig2Context->m_src_size)) {
72 width = (FX_DWORD)dest_image->m_nWidth; 171 goto failed;
73 height = (FX_DWORD)dest_image->m_nHeight; 172 }
74 pitch = (FX_DWORD)dest_image->m_nStride; 173 m_pJbig2Context->m_pContext =
75 dest_buf = dest_image->m_pData; 174 CJBig2_Context::CreateContext(&m_Module,
76 dest_image->m_bNeedFree = FALSE; 175 NULL,
77 delete dest_image; 176 0,
78 FX_Free(src_buf); 177 m_pJbig2Context->m_src_buf,
79 return TRUE; 178 m_pJbig2Context->m_src_size,
80 failed: 179 JBIG2_FILE_STREAM,
81 if(src_buf) { 180 pPause);
82 FX_Free(src_buf); 181 if (m_pJbig2Context->m_pContext == NULL) {
83 } 182 goto failed;
84 return FALSE; 183 }
85 } 184 ret = m_pJbig2Context->m_pContext->getFirstPage(
86 FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, FX_DWORD wid th, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size, 185 &m_pJbig2Context->m_dest_image, pPause);
87 FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWO RD dest_pitch, IFX_Pause* pPause) 186 if (m_pJbig2Context->m_pContext->GetProcessiveStatus() ==
88 { 187 FXCODEC_STATUS_DECODE_TOBECONTINUE) {
89 if(!pJbig2Context) {
90 return FXCODEC_STATUS_ERR_PARAMS;
91 }
92 CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
93 m_pJbig2Context->m_width = width;
94 m_pJbig2Context->m_height = height;
95 m_pJbig2Context->m_src_buf = (unsigned char *)src_buf;
96 m_pJbig2Context->m_src_size = src_size;
97 m_pJbig2Context->m_global_data = global_data;
98 m_pJbig2Context->m_global_size = global_size;
99 m_pJbig2Context->m_dest_buf = dest_buf;
100 m_pJbig2Context->m_dest_pitch = dest_pitch;
101 m_pJbig2Context->m_pPause = pPause;
102 m_pJbig2Context->m_bFileReader = FALSE;
103 FXSYS_memset32(dest_buf, 0, height * dest_pitch);
104 m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module,
105 (FX_LPBYTE)global_data, global_size, (FX_LPBYT E)src_buf, src_size, JBIG2_EMBED_STREAM, pPause);
106 if(!m_pJbig2Context->m_pContext) {
107 return FXCODEC_STATUS_ERROR;
108 }
109 int ret = m_pJbig2Context->m_pContext->getFirstPage(dest_buf, width, height, dest_pitch, pPause);
110 if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECO DE_FINISH) {
111 CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
112 m_pJbig2Context->m_pContext = NULL;
113 if (ret != JBIG2_SUCCESS) {
114 return FXCODEC_STATUS_ERROR;
115 }
116 int dword_size = height * dest_pitch / 4;
117 FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
118 for (int i = 0; i < dword_size; i ++) {
119 dword_buf[i] = ~dword_buf[i];
120 }
121 return FXCODEC_STATUS_DECODE_FINISH;
122 }
123 return m_pJbig2Context->m_pContext->GetProcessiveStatus();
124 }
125 FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, IFX_FileRead * file_ptr,
126 FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause)
127 {
128 if(!pJbig2Context) {
129 return FXCODEC_STATUS_ERR_PARAMS;
130 }
131 CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
132 m_pJbig2Context->m_bFileReader = TRUE;
133 m_pJbig2Context->m_dest_image = NULL;
134 m_pJbig2Context->m_src_size = (FX_DWORD)file_ptr->GetSize();
135 m_pJbig2Context->m_src_buf = FX_Alloc(FX_BYTE, m_pJbig2Context->m_src_size);
136 if (m_pJbig2Context->m_src_buf == NULL) {
137 return FXCODEC_STATUS_ERR_MEMORY;
138 }
139 int ret = 0;
140 if(!file_ptr->ReadBlock((void*)m_pJbig2Context->m_src_buf, 0, m_pJbig2Contex t->m_src_size)) {
141 goto failed;
142 }
143 m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, m_pJbig2Context->m_src_buf, m_pJbig2Context->m_src_size, JBIG2_FILE_STREAM, pPause);
144 if(m_pJbig2Context->m_pContext == NULL) {
145 goto failed;
146 }
147 ret = m_pJbig2Context->m_pContext->getFirstPage(&m_pJbig2Context->m_dest_ima ge, pPause);
148 if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECO DE_TOBECONTINUE) {
149 width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;
150 height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;
151 pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;
152 dest_buf = m_pJbig2Context->m_dest_image->m_pData;
153 m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;
154 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
155 }
156 CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
157 m_pJbig2Context->m_pContext = NULL;
158 if (ret != JBIG2_SUCCESS) {
159 goto failed;
160 }
161 width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth; 188 width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;
162 height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight; 189 height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;
163 pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride; 190 pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;
164 dest_buf = m_pJbig2Context->m_dest_image->m_pData; 191 dest_buf = m_pJbig2Context->m_dest_image->m_pData;
165 m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE; 192 m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;
166 delete m_pJbig2Context->m_dest_image; 193 return FXCODEC_STATUS_DECODE_TOBECONTINUE;
194 }
195 CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
196 m_pJbig2Context->m_pContext = NULL;
197 if (ret != JBIG2_SUCCESS) {
198 goto failed;
199 }
200 width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;
201 height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;
202 pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;
203 dest_buf = m_pJbig2Context->m_dest_image->m_pData;
204 m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;
205 delete m_pJbig2Context->m_dest_image;
206 FX_Free(m_pJbig2Context->m_src_buf);
207 return FXCODEC_STATUS_DECODE_FINISH;
208 failed:
209 if (m_pJbig2Context->m_src_buf) {
167 FX_Free(m_pJbig2Context->m_src_buf); 210 FX_Free(m_pJbig2Context->m_src_buf);
168 return FXCODEC_STATUS_DECODE_FINISH; 211 }
169 failed: 212 m_pJbig2Context->m_src_buf = NULL;
170 if(m_pJbig2Context->m_src_buf) { 213 return FXCODEC_STATUS_ERROR;
171 FX_Free(m_pJbig2Context->m_src_buf); 214 }
215 FXCODEC_STATUS CCodec_Jbig2Module::ContinueDecode(void* pJbig2Context,
216 IFX_Pause* pPause) {
217 CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
218 int ret = m_pJbig2Context->m_pContext->Continue(pPause);
219 if (m_pJbig2Context->m_pContext->GetProcessiveStatus() ==
220 FXCODEC_STATUS_DECODE_FINISH) {
221 if (m_pJbig2Context->m_bFileReader) {
222 CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
223 m_pJbig2Context->m_pContext = NULL;
224 if (ret != JBIG2_SUCCESS) {
225 if (m_pJbig2Context->m_src_buf) {
226 FX_Free(m_pJbig2Context->m_src_buf);
227 }
228 m_pJbig2Context->m_src_buf = NULL;
229 return FXCODEC_STATUS_ERROR;
230 }
231 delete m_pJbig2Context->m_dest_image;
232 FX_Free(m_pJbig2Context->m_src_buf);
233 return FXCODEC_STATUS_DECODE_FINISH;
234 } else {
235 CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
236 m_pJbig2Context->m_pContext = NULL;
237 if (ret != JBIG2_SUCCESS) {
238 return FXCODEC_STATUS_ERROR;
239 }
240 int dword_size =
241 m_pJbig2Context->m_height * m_pJbig2Context->m_dest_pitch / 4;
242 FX_DWORD* dword_buf = (FX_DWORD*)m_pJbig2Context->m_dest_buf;
243 for (int i = 0; i < dword_size; i++) {
244 dword_buf[i] = ~dword_buf[i];
245 }
246 return FXCODEC_STATUS_DECODE_FINISH;
172 } 247 }
173 m_pJbig2Context->m_src_buf = NULL; 248 }
174 return FXCODEC_STATUS_ERROR; 249 return m_pJbig2Context->m_pContext->GetProcessiveStatus();
175 } 250 }
176 FXCODEC_STATUS CCodec_Jbig2Module::ContinueDecode(void* pJbig2Context, IFX_Pause * pPause)
177 {
178 CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
179 int ret = m_pJbig2Context->m_pContext->Continue(pPause);
180 if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECO DE_FINISH) {
181 if(m_pJbig2Context->m_bFileReader) {
182 CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
183 m_pJbig2Context->m_pContext = NULL;
184 if (ret != JBIG2_SUCCESS) {
185 if(m_pJbig2Context->m_src_buf) {
186 FX_Free(m_pJbig2Context->m_src_buf);
187 }
188 m_pJbig2Context->m_src_buf = NULL;
189 return FXCODEC_STATUS_ERROR;
190 }
191 delete m_pJbig2Context->m_dest_image;
192 FX_Free(m_pJbig2Context->m_src_buf);
193 return FXCODEC_STATUS_DECODE_FINISH;
194 } else {
195 CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
196 m_pJbig2Context->m_pContext = NULL;
197 if (ret != JBIG2_SUCCESS) {
198 return FXCODEC_STATUS_ERROR;
199 }
200 int dword_size = m_pJbig2Context->m_height * m_pJbig2Context->m_dest _pitch / 4;
201 FX_DWORD* dword_buf = (FX_DWORD*)m_pJbig2Context->m_dest_buf;
202 for (int i = 0; i < dword_size; i ++) {
203 dword_buf[i] = ~dword_buf[i];
204 }
205 return FXCODEC_STATUS_DECODE_FINISH;
206 }
207 }
208 return m_pJbig2Context->m_pContext->GetProcessiveStatus();
209 }
210
211
212
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698