OLD | NEW |
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 <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "../../../include/fxcodec/fx_codec.h" | 10 #include "../../../include/fxcodec/fx_codec.h" |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 && (img->comps[1].dy == 1) | 344 && (img->comps[1].dy == 1) |
345 && (img->comps[2].dy == 1)) { | 345 && (img->comps[2].dy == 1)) { |
346 sycc444_to_rgb(img); | 346 sycc444_to_rgb(img); |
347 } else { | 347 } else { |
348 return; | 348 return; |
349 } | 349 } |
350 img->color_space = OPJ_CLRSPC_SRGB; | 350 img->color_space = OPJ_CLRSPC_SRGB; |
351 } | 351 } |
352 void color_apply_icc_profile(opj_image_t *image) | 352 void color_apply_icc_profile(opj_image_t *image) |
353 { | 353 { |
354 cmsHPROFILE in_prof, out_prof; | 354 cmsHPROFILE out_prof; |
355 cmsHTRANSFORM transform; | 355 cmsUInt32Number in_type; |
356 cmsColorSpaceSignature in_space, out_space; | 356 cmsUInt32Number out_type; |
357 cmsUInt32Number intent, in_type, out_type, nr_samples; | 357 int *r; |
358 int *r, *g, *b; | 358 int *g; |
359 int prec, i, max, max_w, max_h; | 359 int *b; |
360 OPJ_COLOR_SPACE oldspace; | 360 int max; |
361 in_prof = | 361 cmsHPROFILE in_prof = |
362 cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len); | 362 cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len); |
363 if(in_prof == NULL) { | 363 if(in_prof == NULL) { |
364 return; | 364 return; |
365 } | 365 } |
366 in_space = cmsGetPCS(in_prof); | 366 cmsColorSpaceSignature out_space = cmsGetColorSpace(in_prof); |
367 out_space = cmsGetColorSpace(in_prof); | 367 cmsUInt32Number intent = cmsGetHeaderRenderingIntent(in_prof); |
368 intent = cmsGetHeaderRenderingIntent(in_prof); | 368 int max_w = (int)image->comps[0].w; |
369 max_w = (int)image->comps[0].w; | 369 int max_h = (int)image->comps[0].h; |
370 max_h = (int)image->comps[0].h; | 370 int prec = (int)image->comps[0].prec; |
371 prec = (int)image->comps[0].prec; | 371 OPJ_COLOR_SPACE oldspace = image->color_space; |
372 oldspace = image->color_space; | |
373 if(out_space == cmsSigRgbData) { | 372 if(out_space == cmsSigRgbData) { |
374 if( prec <= 8 ) { | 373 if( prec <= 8 ) { |
375 in_type = TYPE_RGB_8; | 374 in_type = TYPE_RGB_8; |
376 out_type = TYPE_RGB_8; | 375 out_type = TYPE_RGB_8; |
377 } else { | 376 } else { |
378 in_type = TYPE_RGB_16; | 377 in_type = TYPE_RGB_16; |
379 out_type = TYPE_RGB_16; | 378 out_type = TYPE_RGB_16; |
380 } | 379 } |
381 out_prof = cmsCreate_sRGBProfile(); | 380 out_prof = cmsCreate_sRGBProfile(); |
382 image->color_space = OPJ_CLRSPC_SRGB; | 381 image->color_space = OPJ_CLRSPC_SRGB; |
383 } else if(out_space == cmsSigGrayData) { | 382 } else if(out_space == cmsSigGrayData) { |
384 if( prec <= 8 ) { | 383 if( prec <= 8 ) { |
385 in_type = TYPE_GRAY_8; | 384 in_type = TYPE_GRAY_8; |
386 out_type = TYPE_RGB_8; | 385 out_type = TYPE_RGB_8; |
387 } else { | 386 } else { |
388 in_type = TYPE_GRAY_16; | 387 in_type = TYPE_GRAY_16; |
389 out_type = TYPE_RGB_16; | 388 out_type = TYPE_RGB_16; |
390 } | 389 } |
391 out_prof = cmsCreate_sRGBProfile(); | 390 out_prof = cmsCreate_sRGBProfile(); |
392 image->color_space = OPJ_CLRSPC_SRGB; | 391 image->color_space = OPJ_CLRSPC_SRGB; |
393 } else if(out_space == cmsSigYCbCrData) { | 392 } else if(out_space == cmsSigYCbCrData) { |
394 in_type = TYPE_YCbCr_16; | 393 in_type = TYPE_YCbCr_16; |
395 out_type = TYPE_RGB_16; | 394 out_type = TYPE_RGB_16; |
396 out_prof = cmsCreate_sRGBProfile(); | 395 out_prof = cmsCreate_sRGBProfile(); |
397 image->color_space = OPJ_CLRSPC_SRGB; | 396 image->color_space = OPJ_CLRSPC_SRGB; |
398 } else { | 397 } else { |
399 return; | 398 return; |
400 } | 399 } |
401 transform = cmsCreateTransform(in_prof, in_type, | 400 cmsHTRANSFORM transform = |
402 out_prof, out_type, intent, 0); | 401 cmsCreateTransform(in_prof, in_type, out_prof, out_type, intent, 0); |
403 cmsCloseProfile(in_prof); | 402 cmsCloseProfile(in_prof); |
404 cmsCloseProfile(out_prof); | 403 cmsCloseProfile(out_prof); |
405 if(transform == NULL) { | 404 if(transform == NULL) { |
406 image->color_space = oldspace; | 405 image->color_space = oldspace; |
407 return; | 406 return; |
408 } | 407 } |
409 if(image->numcomps > 2) { | 408 if(image->numcomps > 2) { |
410 if( prec <= 8 ) { | 409 if( prec <= 8 ) { |
411 unsigned char *inbuf, *outbuf, *in, *out; | 410 unsigned char *inbuf, *outbuf, *in, *out; |
412 max = max_w * max_h; | 411 max = max_w * max_h; |
413 nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsi
gned char); | 412 cmsUInt32Number nr_samples = max * 3 * sizeof(unsigned char); |
414 in = inbuf = FX_Alloc(unsigned char, nr_samples); | 413 in = inbuf = FX_Alloc(unsigned char, nr_samples); |
415 out = outbuf = FX_Alloc(unsigned char, nr_samples); | 414 out = outbuf = FX_Alloc(unsigned char, nr_samples); |
416 r = image->comps[0].data; | 415 r = image->comps[0].data; |
417 g = image->comps[1].data; | 416 g = image->comps[1].data; |
418 b = image->comps[2].data; | 417 b = image->comps[2].data; |
419 for(i = 0; i < max; ++i) { | 418 for(int i = 0; i < max; ++i) { |
420 *in++ = (unsigned char) * r++; | 419 *in++ = (unsigned char) * r++; |
421 *in++ = (unsigned char) * g++; | 420 *in++ = (unsigned char) * g++; |
422 *in++ = (unsigned char) * b++; | 421 *in++ = (unsigned char) * b++; |
423 } | 422 } |
424 cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); | 423 cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); |
425 r = image->comps[0].data; | 424 r = image->comps[0].data; |
426 g = image->comps[1].data; | 425 g = image->comps[1].data; |
427 b = image->comps[2].data; | 426 b = image->comps[2].data; |
428 for(i = 0; i < max; ++i) { | 427 for(int i = 0; i < max; ++i) { |
429 *r++ = (int) * out++; | 428 *r++ = (int) * out++; |
430 *g++ = (int) * out++; | 429 *g++ = (int) * out++; |
431 *b++ = (int) * out++; | 430 *b++ = (int) * out++; |
432 } | 431 } |
433 FX_Free(inbuf); | 432 FX_Free(inbuf); |
434 FX_Free(outbuf); | 433 FX_Free(outbuf); |
435 } else { | 434 } else { |
436 unsigned short *inbuf, *outbuf, *in, *out; | 435 unsigned short *inbuf, *outbuf, *in, *out; |
437 max = max_w * max_h; | 436 max = max_w * max_h; |
438 nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsi
gned short); | 437 cmsUInt32Number nr_samples = max * 3 * sizeof(unsigned short); |
439 in = inbuf = FX_Alloc(unsigned short, nr_samples); | 438 in = inbuf = FX_Alloc(unsigned short, nr_samples); |
440 out = outbuf = FX_Alloc(unsigned short, nr_samples); | 439 out = outbuf = FX_Alloc(unsigned short, nr_samples); |
441 r = image->comps[0].data; | 440 r = image->comps[0].data; |
442 g = image->comps[1].data; | 441 g = image->comps[1].data; |
443 b = image->comps[2].data; | 442 b = image->comps[2].data; |
444 for(i = 0; i < max; ++i) { | 443 for(int i = 0; i < max; ++i) { |
445 *in++ = (unsigned short) * r++; | 444 *in++ = (unsigned short) * r++; |
446 *in++ = (unsigned short) * g++; | 445 *in++ = (unsigned short) * g++; |
447 *in++ = (unsigned short) * b++; | 446 *in++ = (unsigned short) * b++; |
448 } | 447 } |
449 cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); | 448 cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); |
450 r = image->comps[0].data; | 449 r = image->comps[0].data; |
451 g = image->comps[1].data; | 450 g = image->comps[1].data; |
452 b = image->comps[2].data; | 451 b = image->comps[2].data; |
453 for(i = 0; i < max; ++i) { | 452 for(int i = 0; i < max; ++i) { |
454 *r++ = (int) * out++; | 453 *r++ = (int) * out++; |
455 *g++ = (int) * out++; | 454 *g++ = (int) * out++; |
456 *b++ = (int) * out++; | 455 *b++ = (int) * out++; |
457 } | 456 } |
458 FX_Free(inbuf); | 457 FX_Free(inbuf); |
459 FX_Free(outbuf); | 458 FX_Free(outbuf); |
460 } | 459 } |
461 } else { | 460 } else { |
462 unsigned char *in, *inbuf, *out, *outbuf; | 461 unsigned char *in, *inbuf, *out, *outbuf; |
463 max = max_w * max_h; | 462 max = max_w * max_h; |
464 nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char); | 463 cmsUInt32Number nr_samples = |
| 464 (cmsUInt32Number)max * 3 * sizeof(unsigned char); |
465 in = inbuf = FX_Alloc(unsigned char, nr_samples); | 465 in = inbuf = FX_Alloc(unsigned char, nr_samples); |
466 out = outbuf = FX_Alloc(unsigned char, nr_samples); | 466 out = outbuf = FX_Alloc(unsigned char, nr_samples); |
467 image->comps = (opj_image_comp_t*) | 467 image->comps = (opj_image_comp_t*) |
468 realloc(image->comps, (image->numcomps + 2) * sizeof(opj_
image_comp_t)); | 468 realloc(image->comps, (image->numcomps + 2) * sizeof(opj_
image_comp_t)); |
469 if(image->numcomps == 2) { | 469 if(image->numcomps == 2) { |
470 image->comps[3] = image->comps[1]; | 470 image->comps[3] = image->comps[1]; |
471 } | 471 } |
472 image->comps[1] = image->comps[0]; | 472 image->comps[1] = image->comps[0]; |
473 image->comps[2] = image->comps[0]; | 473 image->comps[2] = image->comps[0]; |
474 image->comps[1].data = FX_Alloc(int, (size_t)max); | 474 image->comps[1].data = FX_Alloc(int, (size_t)max); |
475 FXSYS_memset8(image->comps[1].data, 0, sizeof(int) * (size_t)max); | 475 FXSYS_memset8(image->comps[1].data, 0, sizeof(int) * (size_t)max); |
476 image->comps[2].data = FX_Alloc(int, (size_t)max); | 476 image->comps[2].data = FX_Alloc(int, (size_t)max); |
477 FXSYS_memset8(image->comps[2].data, 0, sizeof(int) * (size_t)max); | 477 FXSYS_memset8(image->comps[2].data, 0, sizeof(int) * (size_t)max); |
478 image->numcomps += 2; | 478 image->numcomps += 2; |
479 r = image->comps[0].data; | 479 r = image->comps[0].data; |
480 for(i = 0; i < max; ++i) { | 480 for(int i = 0; i < max; ++i) { |
481 *in++ = (unsigned char) * r++; | 481 *in++ = (unsigned char) * r++; |
482 } | 482 } |
483 cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); | 483 cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); |
484 r = image->comps[0].data; | 484 r = image->comps[0].data; |
485 g = image->comps[1].data; | 485 g = image->comps[1].data; |
486 b = image->comps[2].data; | 486 b = image->comps[2].data; |
487 for(i = 0; i < max; ++i) { | 487 for(int i = 0; i < max; ++i) { |
488 *r++ = (int) * out++; | 488 *r++ = (int) * out++; |
489 *g++ = (int) * out++; | 489 *g++ = (int) * out++; |
490 *b++ = (int) * out++; | 490 *b++ = (int) * out++; |
491 } | 491 } |
492 FX_Free(inbuf); | 492 FX_Free(inbuf); |
493 FX_Free(outbuf); | 493 FX_Free(outbuf); |
494 } | 494 } |
495 cmsDeleteTransform(transform); | 495 cmsDeleteTransform(transform); |
496 } | 496 } |
497 void color_apply_conversion(opj_image_t *image) | 497 void color_apply_conversion(opj_image_t *image) |
498 { | 498 { |
499 int *row; | 499 int *row; |
500 int enumcs, numcomps; | 500 int enumcs, numcomps; |
501 numcomps = image->numcomps; | 501 numcomps = image->numcomps; |
502 if(numcomps < 3) { | 502 if(numcomps < 3) { |
503 return; | 503 return; |
504 } | 504 } |
505 row = (int*)image->icc_profile_buf; | 505 row = (int*)image->icc_profile_buf; |
506 enumcs = row[0]; | 506 enumcs = row[0]; |
507 if(enumcs == 14) { | 507 if(enumcs == 14) { |
508 int *L, *a, *b, *red, *green, *blue, *src0, *src1, *src2; | 508 int *L, *a, *b, *red, *green, *blue, *src0, *src1, *src2; |
509 double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2; | 509 double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2; |
510 double minL, maxL, mina, maxa, minb, maxb; | 510 double minL, maxL, mina, maxa, minb, maxb; |
511 unsigned int default_type, il; | 511 unsigned int default_type; |
512 unsigned int i, max, illu; | 512 unsigned int i, max; |
513 cmsHPROFILE in, out; | 513 cmsHPROFILE in, out; |
514 cmsHTRANSFORM transform; | 514 cmsHTRANSFORM transform; |
515 cmsUInt16Number RGB[3]; | 515 cmsUInt16Number RGB[3]; |
516 cmsCIELab Lab; | 516 cmsCIELab Lab; |
517 illu = 0; | |
518 il = 0; | |
519 in = cmsCreateLab4Profile(NULL); | 517 in = cmsCreateLab4Profile(NULL); |
520 out = cmsCreate_sRGBProfile(); | 518 out = cmsCreate_sRGBProfile(); |
521 transform = | 519 transform = |
522 cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16, | 520 cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16, |
523 INTENT_PERCEPTUAL, 0); | 521 INTENT_PERCEPTUAL, 0); |
524 cmsCloseProfile(in); | 522 cmsCloseProfile(in); |
525 cmsCloseProfile(out); | 523 cmsCloseProfile(out); |
526 if(transform == NULL) { | 524 if(transform == NULL) { |
527 return; | 525 return; |
528 } | 526 } |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 return TRUE; | 697 return TRUE; |
700 } | 698 } |
701 void CJPX_Decoder::GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestre
am_nComps, FX_DWORD& output_nComps) | 699 void CJPX_Decoder::GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestre
am_nComps, FX_DWORD& output_nComps) |
702 { | 700 { |
703 width = (FX_DWORD)image->x1; | 701 width = (FX_DWORD)image->x1; |
704 height = (FX_DWORD)image->y1; | 702 height = (FX_DWORD)image->y1; |
705 output_nComps = codestream_nComps = (FX_DWORD)image->numcomps; | 703 output_nComps = codestream_nComps = (FX_DWORD)image->numcomps; |
706 } | 704 } |
707 FX_BOOL CJPX_Decoder::Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateCo
lor, FX_LPBYTE offsets) | 705 FX_BOOL CJPX_Decoder::Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateCo
lor, FX_LPBYTE offsets) |
708 { | 706 { |
709 FX_BYTE** channel_bufs; | |
710 int* adjust_comps; | |
711 int i, wid, hei, row, col, channel, src; | 707 int i, wid, hei, row, col, channel, src; |
712 FX_BOOL flag; | |
713 FX_LPBYTE pChannel, pScanline, pPixel; | 708 FX_LPBYTE pChannel, pScanline, pPixel; |
714 | 709 |
715 if(image->comps[0].w != image->x1 || image->comps[0].h != image->y1) { | 710 if(image->comps[0].w != image->x1 || image->comps[0].h != image->y1) { |
716 return FALSE; | 711 return FALSE; |
717 } | 712 } |
718 if(pitch < (int)(image->comps[0].w * 8 * image->numcomps + 31) >> 5 << 2) { | 713 if(pitch < (int)(image->comps[0].w * 8 * image->numcomps + 31) >> 5 << 2) { |
719 return FALSE; | 714 return FALSE; |
720 } | 715 } |
721 FXSYS_memset8(dest_buf, 0xff, image->y1 * pitch); | 716 FXSYS_memset8(dest_buf, 0xff, image->y1 * pitch); |
722 channel_bufs = FX_Alloc(FX_BYTE*, image->numcomps); | 717 FX_BYTE** channel_bufs = FX_Alloc(FX_BYTE*, image->numcomps); |
723 if (channel_bufs == NULL) { | 718 if (channel_bufs == NULL) { |
724 return FALSE; | 719 return FALSE; |
725 } | 720 } |
726 adjust_comps = FX_Alloc(int, image->numcomps); | 721 FX_BOOL result = FALSE; |
| 722 int* adjust_comps = FX_Alloc(int, image->numcomps); |
727 if (adjust_comps == NULL) { | 723 if (adjust_comps == NULL) { |
728 FX_Free(channel_bufs); | 724 goto done; |
729 return FALSE; | |
730 } | 725 } |
731 flag = TRUE; | |
732 for (i = 0; i < (int)image->numcomps; i ++) { | 726 for (i = 0; i < (int)image->numcomps; i ++) { |
733 channel_bufs[i] = dest_buf + offsets[i]; | 727 channel_bufs[i] = dest_buf + offsets[i]; |
734 adjust_comps[i] = image->comps[i].prec - 8; | 728 adjust_comps[i] = image->comps[i].prec - 8; |
735 if(i > 0) { | 729 if(i > 0) { |
736 if(image->comps[i].dx != image->comps[i - 1].dx | 730 if(image->comps[i].dx != image->comps[i - 1].dx |
737 || image->comps[i].dy != image->comps[i - 1].dy | 731 || image->comps[i].dy != image->comps[i - 1].dy |
738 || image->comps[i].prec != image->comps[i - 1].prec) { | 732 || image->comps[i].prec != image->comps[i - 1].prec) { |
739 flag = FALSE; | 733 goto done; |
740 goto failed; | |
741 } | 734 } |
742 } | 735 } |
743 } | 736 } |
744 wid = image->comps[0].w; | 737 wid = image->comps[0].w; |
745 hei = image->comps[0].h; | 738 hei = image->comps[0].h; |
746 for (channel = 0; channel < (int)image->numcomps; channel++) { | 739 for (channel = 0; channel < (int)image->numcomps; channel++) { |
747 pChannel = channel_bufs[channel]; | 740 pChannel = channel_bufs[channel]; |
748 if(adjust_comps[channel] < 0) { | 741 if(adjust_comps[channel] < 0) { |
749 for(row = 0; row < hei; row++) { | 742 for(row = 0; row < hei; row++) { |
750 pScanline = pChannel + row * pitch; | 743 pScanline = pChannel + row * pitch; |
(...skipping 26 matching lines...) Expand all Loading... |
777 tmpPixel = 255; | 770 tmpPixel = 255; |
778 } else if (tmpPixel < 0) { | 771 } else if (tmpPixel < 0) { |
779 tmpPixel = 0; | 772 tmpPixel = 0; |
780 } | 773 } |
781 *pPixel = (FX_BYTE)tmpPixel; | 774 *pPixel = (FX_BYTE)tmpPixel; |
782 } | 775 } |
783 } | 776 } |
784 } | 777 } |
785 } | 778 } |
786 } | 779 } |
| 780 result = TRUE; |
787 | 781 |
| 782 done: |
788 FX_Free(channel_bufs); | 783 FX_Free(channel_bufs); |
789 FX_Free(adjust_comps); | 784 FX_Free(adjust_comps); |
790 return TRUE; | 785 return result; |
791 failed: | |
792 FX_Free(channel_bufs); | |
793 FX_Free(adjust_comps); | |
794 return FALSE; | |
795 } | 786 } |
796 void initialize_transition_table(); | 787 void initialize_transition_table(); |
797 void initialize_significance_luts(); | 788 void initialize_significance_luts(); |
798 void initialize_sign_lut(); | 789 void initialize_sign_lut(); |
799 CCodec_JpxModule::CCodec_JpxModule() | 790 CCodec_JpxModule::CCodec_JpxModule() |
800 { | 791 { |
801 } | 792 } |
802 void* CCodec_JpxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size , FX
_BOOL useColorSpace) | 793 void* CCodec_JpxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size , FX
_BOOL useColorSpace) |
803 { | 794 { |
804 CJPX_Decoder* pDecoder = new CJPX_Decoder; | 795 CJPX_Decoder* pDecoder = new CJPX_Decoder; |
(...skipping 13 matching lines...) Expand all Loading... |
818 FX_BOOL CCodec_JpxModule::Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_B
OOL bTranslateColor, FX_LPBYTE offsets) | 809 FX_BOOL CCodec_JpxModule::Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_B
OOL bTranslateColor, FX_LPBYTE offsets) |
819 { | 810 { |
820 CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx; | 811 CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx; |
821 return pDecoder->Decode(dest_data, pitch, bTranslateColor, offsets); | 812 return pDecoder->Decode(dest_data, pitch, bTranslateColor, offsets); |
822 } | 813 } |
823 void CCodec_JpxModule::DestroyDecoder(void* ctx) | 814 void CCodec_JpxModule::DestroyDecoder(void* ctx) |
824 { | 815 { |
825 CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx; | 816 CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx; |
826 delete pDecoder; | 817 delete pDecoder; |
827 } | 818 } |
OLD | NEW |