91 M2G_DEBUG_2("M2G_DEBUG: CM2GRenderContext::~CM2GRenderContext() - proxy=%d, engine=%d", iProxy, iEngineHandle); |
91 M2G_DEBUG_2("M2G_DEBUG: CM2GRenderContext::~CM2GRenderContext() - proxy=%d, engine=%d", iProxy, iEngineHandle); |
92 if ((iEngineHandle != M2G_INVALID_HANDLE) && (iProxy != NULL)) |
92 if ((iEngineHandle != M2G_INVALID_HANDLE) && (iProxy != NULL)) |
93 { |
93 { |
94 TRAP_IGNORE(iProxy->DeleteSvgEngineL(iEngineHandle)); |
94 TRAP_IGNORE(iProxy->DeleteSvgEngineL(iEngineHandle)); |
95 } |
95 } |
96 if(iWindowSurface) |
96 if (iWindowSurface) |
97 { |
97 { |
98 delete iWindowSurface; |
98 delete iWindowSurface; |
99 } |
99 } |
100 if(targetBitmap) |
100 if (targetBitmap) |
101 { |
101 { |
102 delete targetBitmap; |
102 delete targetBitmap; |
103 } |
103 } |
104 if(iTargetQImage) |
104 if (iTargetQImage) |
105 { |
105 { |
106 delete iTargetQImage; |
106 delete iTargetQImage; |
107 } |
107 } |
108 if(tempBitmapForMask) |
108 if (tempBitmapForMask) |
109 { |
109 { |
110 delete tempBitmapForMask; |
110 delete tempBitmapForMask; |
111 } |
111 } |
112 delete iImgBmp; |
112 delete iImgBmp; |
113 iFbsSession.Disconnect(); |
113 iFbsSession.Disconnect(); |
114 } |
114 } |
115 |
115 |
116 // ----------------------------------------------------------------------------- |
116 // ----------------------------------------------------------------------------- |
117 // CM2GRenderContext::BindL |
117 // CM2GRenderContext::BindL |
118 // ----------------------------------------------------------------------------- |
118 // ----------------------------------------------------------------------------- |
119 void CM2GRenderContext::BindL(TInt& aTargetHandle) |
119 void CM2GRenderContext::BindL(TInt& aTargetHandle) |
120 { |
120 { |
121 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::BindL()"); |
121 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::BindL()"); |
122 // get the screen size |
122 // get the screen size |
123 TSize screenSize = CEikonEnv::Static()->ScreenDevice()->SizeInPixels(); |
123 TSize screenSize = CEikonEnv::Static()->ScreenDevice()->SizeInPixels(); |
124 |
124 |
125 iWindowSurface = (reinterpret_cast<Java::GFX::WindowSurface*>(aTargetHandle)); |
125 iWindowSurface = (reinterpret_cast<Java::GFX::WindowSurface*>(aTargetHandle)); |
126 //wSurfaceType = (Java::GFX::WindowSurfaceType)iWindowSurface->getType(); |
126 |
127 wSurfaceType = Java::GFX::WsTypeQtImage; |
127 iWindowSurface->bind(Java::GFX::WsTypeQtImage); |
128 |
128 |
129 iWindowSurface->bind(wSurfaceType); |
129 wSurfaceType = (Java::GFX::WindowSurfaceType)iWindowSurface->getType(); |
130 |
130 |
131 switch(wSurfaceType) |
131 switch (wSurfaceType) |
132 { |
132 { |
133 case Java::GFX::WsTypeQtImage: |
133 case Java::GFX::WsTypeQtImage: |
134 User::LeaveIfNull(iOffScreenQImage = iWindowSurface->getQtImage()); |
134 User::LeaveIfNull(iOffScreenQImage = iWindowSurface->getQtImage()); |
135 targetBitmap = new CSvgtBitmap ((TInt8*)iOffScreenQImage->bits(), |
135 targetBitmap = new CSvgtBitmap((TInt8*)iOffScreenQImage->bits(), |
136 TSize(iOffScreenQImage->size().width(),iOffScreenQImage->size().height()), |
136 TSize(iOffScreenQImage->size().width(),iOffScreenQImage->size().height()), |
137 EColor16MA,iOffScreenQImage->bytesPerLine()); |
137 EColor16MA,iOffScreenQImage->bytesPerLine()); |
138 break; |
138 break; |
139 |
139 |
140 /*TODO for time being..case Java::GFX::WsTypeQtImage: |
140 case Java::GFX::WsTypeSymbianBitmap: |
141 User::LeaveIfNull(iTargetQImage = iWindowSurface->getQtImage()); |
141 break; |
142 InitializeQImageOffscreenBufferL(screenSize,iTargetQImage); |
142 |
143 break;*/ |
143 default: |
144 |
144 User::Leave(KErrNotSupported); |
145 case Java::GFX::WsTypeSymbianBitmap: |
145 break; |
146 CFbsBitmap* tempBitmap; |
146 } |
147 User::LeaveIfNull(tempBitmap = (reinterpret_cast<Java::GFX::WindowSurface*>(aTargetHandle)->getSymbianBitmap())); |
147 |
148 InitializeCFbsBitmapOffscreenBufferL(screenSize,tempBitmap); |
148 } |
149 //iOffScreenBitmap = new(ELeave) CFbsBitmap(); |
149 |
150 break; |
150 // ----------------------------------------------------------------------------- |
151 |
|
152 default: |
|
153 User::Leave(KErrNotSupported); |
|
154 break; |
|
155 } |
|
156 |
|
157 } |
|
158 |
|
159 // ----------------------------------------------------------------------------- |
|
160 // CM2GRenderContext::InitializeQImageOffscreenBufferL |
|
161 // ----------------------------------------------------------------------------- |
|
162 void CM2GRenderContext::InitializeQImageOffscreenBufferL(TSize aScreenSize,QImage* aQimage) |
|
163 { |
|
164 QSize aSize; |
|
165 aSize.setHeight(aScreenSize.iHeight); |
|
166 aSize.setWidth(aScreenSize.iWidth); |
|
167 iOffScreenQImage = new QImage(aSize,aQimage->format()); |
|
168 |
|
169 //TODO For time being the format is EColor16MU |
|
170 targetBitmap = new CSvgtBitmap ((TInt8*)iOffScreenQImage->bits(), |
|
171 TSize(iOffScreenQImage->size().width(),iOffScreenQImage->size().height()), |
|
172 EColor16MU,iOffScreenQImage->bytesPerLine()); |
|
173 } |
|
174 |
|
175 // ----------------------------------------------------------------------------- |
|
176 // CM2GRenderContext::InitializeCFbsBitmapOffscreenBufferL |
|
177 // ----------------------------------------------------------------------------- |
|
178 void CM2GRenderContext::InitializeCFbsBitmapOffscreenBufferL(TSize aScreenSize,CFbsBitmap* aBitmap) |
|
179 { |
|
180 |
|
181 iOffScreenBitmap = new(ELeave) CFbsBitmap(); |
|
182 User::LeaveIfError( |
|
183 iOffScreenBitmap->Create(aScreenSize, aBitmap->DisplayMode())); |
|
184 |
|
185 // TODO check for stride in case of bitmap. |
|
186 // iTargetBitmap = new CSvgtBitmap( (TInt8*)iOffScreenBitmap->DataAddress() ,aScreenSize,iOffScreenBitmap->DisplayMode()/*KDefaultDisplayMode TODO chk this*/,iOffScreenBitmap->ScanLineLength(iOffScreenBitmap->SizeInPixels().iWidth,KDefaultDisplayMode) ); |
|
187 } |
|
188 |
|
189 // ----------------------------------------------------------------------------- |
|
190 // CM2GRenderContext::GetImgHandleL |
|
191 // ----------------------------------------------------------------------------- |
|
192 /* |
|
193 * TODO we don't need method anymore as now we need Surface handle |
|
194 * TM2GBitmapHandle CM2GRenderContext::GetImgHandleL() const |
|
195 { |
|
196 User::LeaveIfNull(iImgBmp); |
|
197 |
|
198 return REINTERPRET_CAST(TM2GBitmapHandle, iImgBmp); |
|
199 }*/ |
|
200 |
|
201 |
|
202 // ----------------------------------------------------------------------------- |
151 // ----------------------------------------------------------------------------- |
203 // CM2GRenderContext::InitImageBitmapL |
152 // CM2GRenderContext::InitImageBitmapL |
204 // ----------------------------------------------------------------------------- |
153 // ----------------------------------------------------------------------------- |
205 void CM2GRenderContext::InitImageBitmapL() |
154 void CM2GRenderContext::InitImageBitmapL() |
206 { |
155 { |
207 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::InitImageBitmapL() - begin"); |
156 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::InitImageBitmapL() - begin"); |
208 // get the screen size |
157 // get the screen size |
209 TSize screenSize = CEikonEnv::Static()->ScreenDevice()->SizeInPixels(); |
158 TSize screenSize = CEikonEnv::Static()->ScreenDevice()->SizeInPixels(); |
210 switch (wSurfaceType) |
159 switch (wSurfaceType) |
211 { |
160 { |
212 case Java::GFX::WsTypeQtImage: |
161 case Java::GFX::WsTypeQtImage: |
213 { |
162 { |
214 break; |
163 break; |
215 } |
164 } |
216 case Java::GFX::WsTypeSymbianBitmap: |
165 case Java::GFX::WsTypeSymbianBitmap: |
217 { |
166 { |
218 break; |
167 break; |
219 } |
168 } |
220 |
169 |
221 default: |
170 default: |
222 break; |
171 break; |
223 } |
172 } |
224 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::InitImageBitmapL() - end"); |
173 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::InitImageBitmapL() - end"); |
225 } |
174 } |
226 // ----------------------------------------------------------------------------- |
|
227 // CM2GRenderContext::ReleaseL |
175 // CM2GRenderContext::ReleaseL |
228 // ----------------------------------------------------------------------------- |
176 // ----------------------------------------------------------------------------- |
229 void CM2GRenderContext::ReleaseL() |
177 void CM2GRenderContext::ReleaseL() |
230 { |
178 { |
231 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ReleaseL() - begin"); |
179 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ReleaseL() - begin"); |
232 |
180 |
233 iTargetQImage = NULL; |
181 iTargetQImage = NULL; |
234 iOffScreenQImage = NULL; |
182 iOffScreenQImage = NULL; |
235 iWindowSurface->release(); |
183 iWindowSurface->release(); |
236 |
184 |
237 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ReleaseL() - end"); |
185 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ReleaseL() - end"); |
238 } |
186 } |
239 |
187 |
240 // ----------------------------------------------------------------------------- |
188 // ----------------------------------------------------------------------------- |
241 // CM2GRenderContext::RenderL |
189 // CM2GRenderContext::RenderL |
242 // ----------------------------------------------------------------------------- |
190 // ----------------------------------------------------------------------------- |
243 void CM2GRenderContext::RenderLCDUIL( |
191 void CM2GRenderContext::RenderLCDUIL( |
364 } |
312 } |
365 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::PrepareViewbox() - end"); |
313 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::PrepareViewbox() - end"); |
366 } |
314 } |
367 |
315 |
368 void CM2GRenderContext::RenderLCDUIL( |
316 void CM2GRenderContext::RenderLCDUIL( |
369 TM2GSvgDocumentHandle& aSvgDocHandle, |
317 TM2GSvgDocumentHandle& aSvgDocHandle, |
370 TReal32 aCurrentTime, |
318 TReal32 aCurrentTime, |
371 const TRect& aViewbox, |
319 const TRect& /*aViewbox*/, |
372 const TPoint& aAnchor) |
320 const TPoint& /*aAnchor*/) |
373 { |
321 { |
374 M2G_DEBUG_4("M2G_DEBUG: CM2GRenderContext::RenderL() viewbox: x=%d, y=%d, w=%d, h=%d begin", aViewbox.iTl.iX, aViewbox.iTl.iY, aViewbox.Size().iWidth, aViewbox.Size().iHeight); |
322 M2G_DEBUG_4("M2G_DEBUG: CM2GRenderContext::RenderL() viewbox: x=%d, y=%d, w=%d, h=%d begin", aViewbox.iTl.iX, aViewbox.iTl.iY, aViewbox.Size().iWidth, aViewbox.Size().iHeight); |
375 |
323 |
376 // No need to render if content is fully transparency (i.e. alpha=0) |
324 // No need to render if content is fully transparency (i.e. alpha=0) |
377 if (iScaledAlpha == 0) |
325 if (iScaledAlpha == 0) |
378 { |
326 { |
379 return; |
327 return; |
380 } |
328 } |
381 |
329 |
382 QStringList list; |
|
383 list <<"QImage-Format_RGB32"; |
|
384 TBuf8<32> fname; |
|
385 |
|
386 // 1: render the svg document on the iImgBmp |
330 // 1: render the svg document on the iImgBmp |
387 iProxy->RenderDocumentL( |
331 iProxy->RenderDocumentL( |
388 iEngineHandle, |
332 iEngineHandle, |
389 aSvgDocHandle, |
333 aSvgDocHandle, |
390 (TM2GSvgBitmapHandle)targetBitmap |
334 (TM2GSvgBitmapHandle)targetBitmap |
391 , (TUint)NULL, aCurrentTime); |
335 , (TUint)NULL, aCurrentTime); |
392 |
336 |
393 fname.Zero(); |
337 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::RenderL() end"); |
394 fname.Format(_L8("c:\\%s.bmp"), list.at(0).toLocal8Bit().constData()); |
338 } |
395 TBool ret = iOffScreenQImage->save((const char*)fname.PtrZ()); |
339 |
396 |
340 // ----------------------------------------------------------------------------- |
397 QPixmap pixmap = QPixmap::fromImage(*iOffScreenQImage); |
341 /* |
398 tempBitmapForMask = pixmap.toSymbianCFbsBitmap(); |
342 * Write the separate RenderDocumentL method for QImage and CFbsBitmap |
399 |
|
400 TFileName bitmapFilename; |
|
401 bitmapFilename.Copy(_L("c:\\bugbitmap")); |
|
402 bitmapFilename.AppendNum(tempBitmapForMask->Handle()); |
|
403 bitmapFilename.Append(_L(".bmp")); |
|
404 SaveBitmapL(*tempBitmapForMask, bitmapFilename); |
|
405 //TODO Release function should be called from FrameWork |
|
406 //iWindowSurface->release(); |
|
407 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::RenderL() end"); |
|
408 } |
|
409 |
|
410 // ----------------------------------------------------------------------------- |
|
411 /*TODO |
|
412 * Write the separate RenderDocumentL method for QImage and CFbsBitmap |
|
413 * also handle subsequent BitBlt and |
343 * also handle subsequent BitBlt and |
414 * CreateAlphaBlendMaskL |
344 * CreateAlphaBlendMaskL |
415 * */ |
345 * */ |
416 void CM2GRenderContext::RenderESWTL( |
346 void CM2GRenderContext::RenderESWTL( |
417 TM2GSvgDocumentHandle& aSvgDocHandle, |
347 TM2GSvgDocumentHandle& aSvgDocHandle, |
418 TReal32 aCurrentTime, |
348 TReal32 aCurrentTime, |
419 const TRect& aViewbox, |
349 const TRect& /*aViewbox*/, |
420 const TPoint& aAnchor, |
350 const TPoint& /*aAnchor*/, |
421 TBool /*aUseNativeClear*/, |
351 TBool /*aUseNativeClear*/, |
422 TInt* aReturnData) |
352 TInt* /*aReturnData*/) |
423 { |
353 { |
424 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::RenderESWTL() Start"); |
354 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::RenderESWTL() Start"); |
425 // No need to render if content is fully transparency (i.e. alpha=0) |
355 // No need to render if content is fully transparency (i.e. alpha=0) |
426 if (iScaledAlpha == 0) |
356 if (iScaledAlpha == 0) |
427 { |
357 { |
428 return; |
358 return; |
429 } |
359 } |
430 |
360 |
431 // 1: render the svg document on the iImgBmp |
361 // 1: render the svg document on the iImgBmp |
432 iProxy->RenderDocumentL(iEngineHandle, |
362 iProxy->RenderDocumentL(iEngineHandle, |
433 aSvgDocHandle, |
363 aSvgDocHandle, |
434 (TM2GSvgBitmapHandle)targetBitmap, (TUint)NULL, aCurrentTime); |
364 (TM2GSvgBitmapHandle)targetBitmap, (TUint)NULL, aCurrentTime); |
435 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::RenderESWTL() end"); |
365 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::RenderESWTL() end"); |
436 |
366 |
437 } |
367 } |
438 // CM2GRenderContext::CreateAlphaBlendMask |
|
439 // ----------------------------------------------------------------------------- |
|
440 // ----------------------------------------------------------------------------- |
|
441 // CM2GRenderContext::ClearBitmapL |
|
442 // ----------------------------------------------------------------------------- |
|
443 void CM2GRenderContext::ClearBitmapL(CFbsBitmap* aBmp) |
|
444 { |
|
445 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ClearBitmap - begin"); |
|
446 |
|
447 User::LeaveIfNull(aBmp); |
|
448 |
|
449 TM2GBitmapLock lock(aBmp); |
|
450 |
|
451 TSize size = aBmp->SizeInPixels(); |
|
452 TInt scanlineLength = aBmp->ScanLineLength(size.iWidth, aBmp->DisplayMode()); |
|
453 |
|
454 TUint32* buf = aBmp->DataAddress(); |
|
455 char* bufBytes = REINTERPRET_CAST(char*, buf); |
|
456 |
|
457 Mem::FillZ(bufBytes, size.iHeight * scanlineLength); |
|
458 |
|
459 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ClearBitmap - end"); |
|
460 } |
|
461 |
|
462 |
|
463 void CM2GRenderContext::ClearSurfaceL(TM2GSvgBitmapHandle aSvgtBmpHandle ) |
|
464 { |
|
465 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ClearBitmap - begin"); |
|
466 //TODO As Currently we are not using this functionality. |
|
467 /* switch(wSurfaceType) |
|
468 { |
|
469 case Java::GFX::WsTypeQtImage: |
|
470 QImage* tempQImage; |
|
471 User::LeaveIfNull(tempQImage = (reinterpret_cast<Java::GFX::WindowSurface*>(aSvgtBmpHandle)->getQtImage())); |
|
472 //TODO Do we need to lock the qimage as implemented below TM2GBitmapLock lock(tempBitmap);? |
|
473 QSize sizeQimage = tempQImage->size();//TODO Check for SizeInPixels |
|
474 TInt scanlineLengthQimage = tempQImage->bytesPerLine(); |
|
475 //uchar* bufBytesQimage = REINTERPRET_CAST(uchar*, tempQImage->bits()); |
|
476 |
|
477 Mem::FillZ(tempQImage->bits(), sizeQimage.height() * scanlineLengthQimage); |
|
478 |
|
479 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ClearSurface Qimage Clear function- end"); |
|
480 break; |
|
481 |
|
482 case Java::GFX::WsTypeSymbianBitmap: |
|
483 CFbsBitmap* tempBitmap; |
|
484 User::LeaveIfNull(tempBitmap = (reinterpret_cast<Java::GFX::WindowSurface*>(aSvgtBmpHandle)->getSymbianBitmap())); |
|
485 TM2GBitmapLock lock(tempBitmap); |
|
486 TSize sizeBmp = tempBitmap->SizeInPixels(); |
|
487 TInt scanlineLengthBmp = tempBitmap->ScanLineLength(sizeBmp.iWidth, tempBitmap->DisplayMode()); |
|
488 TUint32* bufBmp = tempBitmap->DataAddress(); |
|
489 char* bufBytesBmp = REINTERPRET_CAST(char*, bufBmp); |
|
490 |
|
491 Mem::FillZ(bufBytesBmp, sizeBmp.iHeight * scanlineLengthBmp); |
|
492 |
|
493 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ClearSurface Bitmap Clear function- end"); |
|
494 break; |
|
495 |
|
496 default: |
|
497 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::ClearBitmap Type Not Supported.- end"); |
|
498 User::Leave(KErrNotSupported); |
|
499 break; |
|
500 } |
|
501 */ |
|
502 } |
|
503 |
|
504 // ----------------------------------------------------------------------------- |
|
505 // CM2GRenderContext::FillBitmapL |
|
506 // ----------------------------------------------------------------------------- |
|
507 void CM2GRenderContext::FillBitmapL(CFbsBitmap* aBmp, const TUint8& aChar) |
|
508 { |
|
509 M2G_DEBUG_1("M2G_DEBUG: CM2GRenderContext::FillBitmap() filled with=%d - begin", aChar); |
|
510 User::LeaveIfNull(aBmp); |
|
511 TM2GBitmapLock lock(aBmp); |
|
512 |
|
513 TSize size = aBmp->SizeInPixels(); |
|
514 TInt scanlineLength = aBmp->ScanLineLength(size.iWidth, aBmp->DisplayMode()); |
|
515 |
|
516 TUint32* buf = aBmp->DataAddress(); |
|
517 char* bufBytes = REINTERPRET_CAST(char*, buf); |
|
518 |
|
519 Mem::Fill(bufBytes, size.iHeight * scanlineLength, aChar); |
|
520 |
|
521 M2G_DEBUG_0("M2G_DEBUG: CM2GRenderContext::FillBitmap - end"); |
|
522 } |
|
523 |
|
524 // ----------------------------------------------------------------------------- |
|
525 // CM2GRenderContext::GetBufferHandleL |
|
526 // ----------------------------------------------------------------------------- |
|
527 TM2GSvgBitmapHandle CM2GRenderContext::GetBufferHandleL() const |
|
528 { |
|
529 switch(wSurfaceType) |
|
530 { |
|
531 case Java::GFX::WsTypeQtImage: |
|
532 User::LeaveIfNull(iOffScreenQImage); |
|
533 return REINTERPRET_CAST(TM2GSvgBitmapHandle , iOffScreenQImage); |
|
534 break; |
|
535 |
|
536 case Java::GFX::WsTypeSymbianBitmap: |
|
537 User::LeaveIfNull(iOffScreenBitmap); |
|
538 return REINTERPRET_CAST(TM2GSvgBitmapHandle , iOffScreenBitmap); |
|
539 break; |
|
540 |
|
541 default: |
|
542 User::Leave(KErrNotSupported); |
|
543 break; |
|
544 } |
|
545 |
|
546 } |
|
547 |
|
548 //CODE to check the Bitmap Contain. |
|
549 TInt CM2GRenderContext::SaveBitmapL(const CFbsBitmap& aNVGBitmap, const TFileName& aFileName) |
|
550 { |
|
551 TFileName bitmapFilename; |
|
552 bitmapFilename.Copy(aFileName); |
|
553 RFs aFs; |
|
554 User::LeaveIfError(aFs.Connect()); |
|
555 CImageEncoder * imgEncoder = 0; |
|
556 TRequestStatus requesStatus = 0; |
|
557 imgEncoder = CImageEncoder::FileNewL(aFs, bitmapFilename, _L8("image/bmp"), CImageEncoder::EOptionAlwaysThread); |
|
558 imgEncoder->Convert(&requesStatus, aNVGBitmap); |
|
559 User::WaitForRequest(requesStatus); |
|
560 delete imgEncoder; |
|
561 aFs.Close(); |
|
562 return 0; |
|
563 } |
|
564 |
368 |
565 M2G_NS_END |
369 M2G_NS_END |