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

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

Issue 1098583002: Fix a bunch of -Wunused-but-set-variable warnings. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: nits Created 5 years, 7 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
« no previous file with comments | « core/src/fpdftext/fpdf_text_int.cpp ('k') | core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <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
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
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
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
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 }
OLDNEW
« no previous file with comments | « core/src/fpdftext/fpdf_text_int.cpp ('k') | core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698