TRAVIS_PYTHON_VERSION=3.7 TRAVIS_OS_NAME=linux <<<<<< ENV .appveyor.yml .ci/after_success.sh .ci/build.sh .ci/install.sh .ci/test.sh .coveragerc .editorconfig .gitattributes .github/CONTRIBUTING.md .github/FUNDING.yml .github/ISSUE_TEMPLATE/ISSUE_REPORT.md .github/PULL_REQUEST_TEMPLATE.md .github/SECURITY.md .github/mergify.yml .github/workflows/lint.yml .github/workflows/macos-install.sh .github/workflows/system-info.py .github/workflows/test-docker.yml .github/workflows/test-windows.yml .github/workflows/test.yml .gitignore .pre-commit-config.yaml .readthedocs.yml .travis.yml CHANGES.rst LICENSE MANIFEST.in Makefile README.md RELEASING.md Tests/32bit_segfault_check.py Tests/README.rst Tests/__init__.py Tests/bench_cffi_access.py Tests/check_fli_oob.py Tests/check_fli_overflow.py Tests/check_icns_dos.py Tests/check_imaging_leaks.py Tests/check_j2k_dos.py Tests/check_j2k_leaks.py Tests/check_j2k_overflow.py Tests/check_jp2_overflow.py Tests/check_jpeg_leaks.py Tests/check_large_memory.py Tests/check_large_memory_numpy.py Tests/check_libtiff_segfault.py Tests/check_png_dos.py Tests/conftest.py Tests/createfontdatachunk.py Tests/fonts/10x20-ISO8859-1.pcf Tests/fonts/10x20.pbm Tests/fonts/10x20.pil Tests/fonts/AdobeVFPrototype.ttf Tests/fonts/ArefRuqaa-Regular.ttf Tests/fonts/BungeeColor-Regular_colr_Windows.ttf Tests/fonts/DejaVuSans-24-1-stripped.ttf Tests/fonts/DejaVuSans-24-2-stripped.ttf Tests/fonts/DejaVuSans-24-4-stripped.ttf Tests/fonts/DejaVuSans-24-8-stripped.ttf Tests/fonts/DejaVuSans.ttf Tests/fonts/FreeMono.ttf Tests/fonts/KhmerOSBattambang-Regular.ttf Tests/fonts/LICENSE.txt Tests/fonts/NotoColorEmoji.ttf Tests/fonts/NotoNastaliqUrdu-Regular.ttf Tests/fonts/NotoSans-Regular.ttf Tests/fonts/NotoSansJP-Regular.otf Tests/fonts/NotoSansSymbols-Regular.ttf Tests/fonts/OpenSansCondensed-LightItalic.ttf Tests/fonts/TINY5x3GX.ttf Tests/fonts/ter-x20b-cp1250.pbm Tests/fonts/ter-x20b-cp1250.pil Tests/fonts/ter-x20b-iso8859-1.pbm Tests/fonts/ter-x20b-iso8859-1.pil Tests/fonts/ter-x20b-iso8859-2.pbm Tests/fonts/ter-x20b-iso8859-2.pil Tests/fonts/ter-x20b.pcf Tests/helper.py Tests/icc/LICENSE.txt Tests/icc/sRGB_IEC61966-2-1_black_scaled.icc Tests/icc/sRGB_v4_ICC_preference.icc Tests/images/00r0_gray_l.jp2 Tests/images/00r1_graya_la.jp2 Tests/images/01r_00.pcx Tests/images/10ct_32bit_128.tiff Tests/images/12bit.cropped.tif Tests/images/12in16bit.tif Tests/images/16_bit_binary.pgm Tests/images/16_bit_binary_pgm.png Tests/images/16_bit_noise.tif Tests/images/16bit.MM.cropped.tif Tests/images/16bit.MM.deflate.tif Tests/images/16bit.cropped.j2k Tests/images/16bit.cropped.jp2 Tests/images/16bit.cropped.tif Tests/images/16bit.deflate.tif Tests/images/16bit.s.tif Tests/images/1_trns.png Tests/images/7x13.png Tests/images/DXGI_FORMAT_BC7_UNORM_SRGB.dds Tests/images/DXGI_FORMAT_BC7_UNORM_SRGB.png Tests/images/DXGI_FORMAT_R8G8B8A8_UNORM_SRGB.dds Tests/images/DXGI_FORMAT_R8G8B8A8_UNORM_SRGB.png Tests/images/WAlaska.wind.7days.grb Tests/images/a.fli Tests/images/a_fli.png Tests/images/anim_frame1.webp Tests/images/anim_frame2.webp Tests/images/apng/blend_op_over.png Tests/images/apng/blend_op_over_near_transparent.png Tests/images/apng/blend_op_source_near_transparent.png Tests/images/apng/blend_op_source_solid.png Tests/images/apng/blend_op_source_transparent.png Tests/images/apng/chunk_actl_after_idat.png Tests/images/apng/chunk_multi_actl.png Tests/images/apng/chunk_no_actl.png Tests/images/apng/chunk_no_fctl.png Tests/images/apng/chunk_no_fdat.png Tests/images/apng/chunk_repeat_fctl.png Tests/images/apng/delay.png Tests/images/apng/delay_round.png Tests/images/apng/delay_short_max.png Tests/images/apng/delay_zero_denom.png Tests/images/apng/delay_zero_numer.png Tests/images/apng/dispose_op_background.png Tests/images/apng/dispose_op_background_before_region.png Tests/images/apng/dispose_op_background_final.png Tests/images/apng/dispose_op_background_p_mode.png Tests/images/apng/dispose_op_background_region.png Tests/images/apng/dispose_op_none.png Tests/images/apng/dispose_op_none_region.png Tests/images/apng/dispose_op_previous.png Tests/images/apng/dispose_op_previous_final.png Tests/images/apng/dispose_op_previous_first.png Tests/images/apng/dispose_op_previous_region.png Tests/images/apng/fctl_actl.png Tests/images/apng/mode_16bit.png Tests/images/apng/mode_greyscale.png Tests/images/apng/mode_greyscale_alpha.png Tests/images/apng/mode_palette.png Tests/images/apng/mode_palette_1bit_alpha.png Tests/images/apng/mode_palette_alpha.png Tests/images/apng/num_plays.png Tests/images/apng/num_plays_1.png Tests/images/apng/sequence_fdat_fctl.png Tests/images/apng/sequence_gap.png Tests/images/apng/sequence_reorder.png Tests/images/apng/sequence_reorder_chunk.png Tests/images/apng/sequence_repeat.png Tests/images/apng/sequence_repeat_chunk.png Tests/images/apng/sequence_start.png Tests/images/apng/single_frame.png Tests/images/apng/single_frame_default.png Tests/images/apng/split_fdat.png Tests/images/apng/split_fdat_zero_chunk.png Tests/images/apng/syntax_num_frames_high.png Tests/images/apng/syntax_num_frames_invalid.png Tests/images/apng/syntax_num_frames_low.png Tests/images/apng/syntax_num_frames_zero.png Tests/images/apng/syntax_num_frames_zero_default.png Tests/images/app13-multiple.jpg Tests/images/app13.jpg Tests/images/argb-32bpp_MipMaps-1.dds Tests/images/argb-32bpp_MipMaps-1.png Tests/images/bad_palette_entry.gpl Tests/images/bad_palette_file.gpl Tests/images/balloon.jpf Tests/images/bc7-argb-8bpp_MipMaps-1.dds Tests/images/bc7-argb-8bpp_MipMaps-1.png Tests/images/binary_preview_map.eps Tests/images/bitmap_font_1_basic.png Tests/images/bitmap_font_1_raqm.png Tests/images/bitmap_font_2_basic.png Tests/images/bitmap_font_2_raqm.png Tests/images/bitmap_font_4_basic.png Tests/images/bitmap_font_4_raqm.png Tests/images/bitmap_font_8_basic.png Tests/images/bitmap_font_8_raqm.png Tests/images/blp/blp1_jpeg.blp Tests/images/blp/blp2_dxt1.blp Tests/images/blp/blp2_dxt1.png Tests/images/blp/blp2_dxt1a.blp Tests/images/blp/blp2_dxt1a.png Tests/images/blp/blp2_raw.blp Tests/images/blp/blp2_raw.png Tests/images/bmp/README.txt Tests/images/bmp/b/badbitcount.bmp Tests/images/bmp/b/badbitssize.bmp Tests/images/bmp/b/baddens1.bmp Tests/images/bmp/b/baddens2.bmp Tests/images/bmp/b/badfilesize.bmp Tests/images/bmp/b/badheadersize.bmp Tests/images/bmp/b/badpalettesize.bmp Tests/images/bmp/b/badplanes.bmp Tests/images/bmp/b/badrle.bmp Tests/images/bmp/b/badwidth.bmp Tests/images/bmp/b/pal8badindex.bmp Tests/images/bmp/b/reallybig.bmp Tests/images/bmp/b/rletopdown.bmp Tests/images/bmp/b/shortfile.bmp Tests/images/bmp/g/pal1.bmp Tests/images/bmp/g/pal1bg.bmp Tests/images/bmp/g/pal1wb.bmp Tests/images/bmp/g/pal4.bmp Tests/images/bmp/g/pal4rle.bmp Tests/images/bmp/g/pal8-0.bmp Tests/images/bmp/g/pal8.bmp Tests/images/bmp/g/pal8nonsquare.bmp Tests/images/bmp/g/pal8os2.bmp Tests/images/bmp/g/pal8rle.bmp Tests/images/bmp/g/pal8topdown.bmp Tests/images/bmp/g/pal8v4.bmp Tests/images/bmp/g/pal8v5.bmp Tests/images/bmp/g/pal8w124.bmp Tests/images/bmp/g/pal8w125.bmp Tests/images/bmp/g/pal8w126.bmp Tests/images/bmp/g/rgb16-565.bmp Tests/images/bmp/g/rgb16-565pal.bmp Tests/images/bmp/g/rgb16.bmp Tests/images/bmp/g/rgb24.bmp Tests/images/bmp/g/rgb24pal.bmp Tests/images/bmp/g/rgb32.bmp Tests/images/bmp/g/rgb32bf.bmp Tests/images/bmp/html/bkgd.png Tests/images/bmp/html/bmpsuite.html Tests/images/bmp/html/fakealpha.png Tests/images/bmp/html/pal1.png Tests/images/bmp/html/pal1bg.png Tests/images/bmp/html/pal1p1.png Tests/images/bmp/html/pal2.png Tests/images/bmp/html/pal4.png Tests/images/bmp/html/pal4rletrns-0.png Tests/images/bmp/html/pal4rletrns-b.png Tests/images/bmp/html/pal4rletrns.png Tests/images/bmp/html/pal8.png Tests/images/bmp/html/pal8nonsquare-e.png Tests/images/bmp/html/pal8nonsquare-v.png Tests/images/bmp/html/pal8rletrns-0.png Tests/images/bmp/html/pal8rletrns-b.png Tests/images/bmp/html/pal8rletrns.png Tests/images/bmp/html/pal8w124.png Tests/images/bmp/html/pal8w125.png Tests/images/bmp/html/pal8w126.png Tests/images/bmp/html/rgb16-231.png Tests/images/bmp/html/rgb16-565.png Tests/images/bmp/html/rgb16.png Tests/images/bmp/html/rgb24.jpg Tests/images/bmp/html/rgb24.png Tests/images/bmp/html/rgba16-4444.png Tests/images/bmp/html/rgba32.png Tests/images/bmp/q/pal1p1.bmp Tests/images/bmp/q/pal2.bmp Tests/images/bmp/q/pal4rletrns.bmp Tests/images/bmp/q/pal8offs.bmp Tests/images/bmp/q/pal8os2sp.bmp Tests/images/bmp/q/pal8os2v2-16.bmp Tests/images/bmp/q/pal8os2v2.bmp Tests/images/bmp/q/pal8oversizepal.bmp Tests/images/bmp/q/pal8rletrns.bmp Tests/images/bmp/q/rgb16-231.bmp Tests/images/bmp/q/rgb24jpeg.bmp Tests/images/bmp/q/rgb24largepal.bmp Tests/images/bmp/q/rgb24lprof.bmp Tests/images/bmp/q/rgb24png.bmp Tests/images/bmp/q/rgb24prof.bmp Tests/images/bmp/q/rgb32-111110.bmp Tests/images/bmp/q/rgb32bf-xbgr.bmp Tests/images/bmp/q/rgb32fakealpha.bmp Tests/images/bmp/q/rgba16-4444.bmp Tests/images/bmp/q/rgba32.bmp Tests/images/bmp/q/rgba32abf.bmp Tests/images/broken.png Tests/images/broken_data_stream.png Tests/images/bw_gradient.png Tests/images/caption_6_33_22.png Tests/images/cbdt_notocoloremoji.png Tests/images/cbdt_notocoloremoji_mask.png Tests/images/chi.gif Tests/images/clipboard.dib Tests/images/clipboard_target.png Tests/images/cmx3g8_wv_1998.260_0745_mcidas.ara Tests/images/cmx3g8_wv_1998.260_0745_mcidas.png Tests/images/color_snakes.png Tests/images/colr_bungee.png Tests/images/colr_bungee_mask.png Tests/images/combined_larger_than_size.psd Tests/images/compression.tif Tests/images/copyleft.png Tests/images/copyleft.tiff Tests/images/corner.lut Tests/images/courB08.bdf Tests/images/courB08.pbm Tests/images/courB08.pil Tests/images/create_eps.gnuplot Tests/images/custom_gimp_palette.gpl Tests/images/decompression_bomb.gif Tests/images/decompression_bomb.ico Tests/images/deerstalker.cur Tests/images/default_font.png Tests/images/dilation4.lut Tests/images/dilation8.lut Tests/images/dispose_bgnd.gif Tests/images/dispose_none.gif Tests/images/dispose_prev.gif Tests/images/drawing.emf Tests/images/drawing.wmf Tests/images/drawing_emf_ref.png Tests/images/drawing_roundDown.emf Tests/images/drawing_wmf_ref.png Tests/images/drawing_wmf_ref_144.png Tests/images/dummy.container Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.dds Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.png Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.dds Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.png Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.png Tests/images/edge.lut Tests/images/effect_mandelbrot.png Tests/images/effect_spread.png Tests/images/empty_gps_ifd.jpg Tests/images/erosion4.lut Tests/images/erosion8.lut Tests/images/exif-200dpcm.jpg Tests/images/exif-72dpi-int.jpg Tests/images/exif-dpi-zerodivision.jpg Tests/images/exif-ifd-offset.jpg Tests/images/exif.png Tests/images/exif_gps.jpg Tests/images/exif_gps_typeerror.jpg Tests/images/exif_imagemagick.png Tests/images/exif_text.png Tests/images/exif_typeerror.jpg Tests/images/fli_oob/02r/02r00.fli Tests/images/fli_oob/02r/notes Tests/images/fli_oob/02r/others/02r01.fli Tests/images/fli_oob/02r/others/02r02.fli Tests/images/fli_oob/02r/others/02r03.fli Tests/images/fli_oob/02r/others/02r04.fli Tests/images/fli_oob/02r/reproducing Tests/images/fli_oob/03r/03r00.fli Tests/images/fli_oob/03r/notes Tests/images/fli_oob/03r/others/03r01.fli Tests/images/fli_oob/03r/others/03r02.fli Tests/images/fli_oob/03r/others/03r03.fli Tests/images/fli_oob/03r/others/03r04.fli Tests/images/fli_oob/03r/others/03r05.fli Tests/images/fli_oob/03r/others/03r06.fli Tests/images/fli_oob/03r/others/03r07.fli Tests/images/fli_oob/03r/others/03r08.fli Tests/images/fli_oob/03r/others/03r09.fli Tests/images/fli_oob/03r/others/03r10.fli Tests/images/fli_oob/03r/others/03r11.fli Tests/images/fli_oob/03r/reproducing Tests/images/fli_oob/04r/04r00.fli Tests/images/fli_oob/04r/initial.fli Tests/images/fli_oob/04r/notes Tests/images/fli_oob/04r/others/04r01.fli Tests/images/fli_oob/04r/others/04r02.fli Tests/images/fli_oob/04r/others/04r03.fli Tests/images/fli_oob/04r/others/04r04.fli Tests/images/fli_oob/04r/others/04r05.fli Tests/images/fli_oob/04r/reproducing Tests/images/fli_oob/05r/05r00.fli Tests/images/fli_oob/05r/notes Tests/images/fli_oob/05r/others/05r01.fli Tests/images/fli_oob/05r/others/05r02.fli Tests/images/fli_oob/05r/others/05r03.fli Tests/images/fli_oob/05r/others/05r04.fli Tests/images/fli_oob/05r/others/05r05.fli Tests/images/fli_oob/05r/others/05r06.fli Tests/images/fli_oob/05r/others/05r07.fli Tests/images/fli_oob/05r/reproducing Tests/images/fli_oob/06r/06r00.fli Tests/images/fli_oob/06r/notes Tests/images/fli_oob/06r/others/06r01.fli Tests/images/fli_oob/06r/others/06r02.fli Tests/images/fli_oob/06r/others/06r03.fli Tests/images/fli_oob/06r/others/06r04.fli Tests/images/fli_oob/06r/reproducing Tests/images/fli_oob/patch0/000000 Tests/images/fli_oob/patch0/000001 Tests/images/fli_oob/patch0/000002 Tests/images/fli_oob/patch0/000003 Tests/images/fli_overflow.fli Tests/images/fli_overrun.bin Tests/images/fli_overrun2.bin Tests/images/flower.jpg Tests/images/flower.webp Tests/images/flower2.jpg Tests/images/flower2.webp Tests/images/frozenpond.mpo Tests/images/ftex_dxt1.ftc Tests/images/ftex_dxt1.png Tests/images/ftex_uncompressed.ftu Tests/images/ftex_uncompressed.png Tests/images/fujifilm.mpo Tests/images/g4-fillorder-test.png Tests/images/g4-fillorder-test.tif Tests/images/g4-multi.tiff Tests/images/g4_orientation_1.tif Tests/images/g4_orientation_2.tif Tests/images/g4_orientation_3.tif Tests/images/g4_orientation_4.tif Tests/images/g4_orientation_5.tif Tests/images/g4_orientation_6.tif Tests/images/g4_orientation_7.tif Tests/images/g4_orientation_8.tif Tests/images/gbr.gbr Tests/images/gbr.png Tests/images/gfs.t06z.rassda.tm00.bufr_d Tests/images/gif_header_data.pkl Tests/images/gimp_gradient.ggr Tests/images/gimp_gradient_with_name.ggr Tests/images/hdf5.h5 Tests/images/high_ascii_chars.png Tests/images/hopper-XYZ.png Tests/images/hopper.Lab.tif Tests/images/hopper.bmp Tests/images/hopper.bw Tests/images/hopper.dcx Tests/images/hopper.fits Tests/images/hopper.fli Tests/images/hopper.gd Tests/images/hopper.gif Tests/images/hopper.iccprofile.tif Tests/images/hopper.iccprofile_binary.tif Tests/images/hopper.ico Tests/images/hopper.im Tests/images/hopper.jpg Tests/images/hopper.mic Tests/images/hopper.msp Tests/images/hopper.p7 Tests/images/hopper.pcd Tests/images/hopper.png Tests/images/hopper.pnm Tests/images/hopper.ppm Tests/images/hopper.psd Tests/images/hopper.pxr Tests/images/hopper.ras Tests/images/hopper.rgb Tests/images/hopper.sgi Tests/images/hopper.spider Tests/images/hopper.tar Tests/images/hopper.tif Tests/images/hopper.wal Tests/images/hopper.webp Tests/images/hopper.xbm Tests/images/hopper.xpm Tests/images/hopper16.rgb Tests/images/hopper_16bit_qtables.jpg Tests/images/hopper_256x256.ico Tests/images/hopper_45.png Tests/images/hopper_bad.p7 Tests/images/hopper_bad_checksum.msp Tests/images/hopper_bad_exif.jpg Tests/images/hopper_bw_500.png Tests/images/hopper_draw.ico Tests/images/hopper_emboss.bmp Tests/images/hopper_emboss_more.bmp Tests/images/hopper_g4.tif Tests/images/hopper_g4_500.tif Tests/images/hopper_gray.jpg Tests/images/hopper_gray_4bpp.tif Tests/images/hopper_idat_after_image_end.png Tests/images/hopper_jpg.tif Tests/images/hopper_long_name.im Tests/images/hopper_lzw.tif Tests/images/hopper_merged.psd Tests/images/hopper_orientation_2.jpg Tests/images/hopper_orientation_2.webp Tests/images/hopper_orientation_3.jpg Tests/images/hopper_orientation_3.webp Tests/images/hopper_orientation_4.jpg Tests/images/hopper_orientation_4.webp Tests/images/hopper_orientation_5.jpg Tests/images/hopper_orientation_5.webp Tests/images/hopper_orientation_6.jpg Tests/images/hopper_orientation_6.webp Tests/images/hopper_orientation_7.jpg Tests/images/hopper_orientation_7.webp Tests/images/hopper_orientation_8.jpg Tests/images/hopper_orientation_8.webp Tests/images/hopper_roundDown.bmp Tests/images/hopper_roundDown_2.tif Tests/images/hopper_roundDown_3.tif Tests/images/hopper_roundDown_None.tif Tests/images/hopper_roundUp_2.tif Tests/images/hopper_roundUp_3.tif Tests/images/hopper_roundUp_None.tif Tests/images/hopper_underscore.xbm Tests/images/hopper_unexpected.ico Tests/images/hopper_unknown_pixel_mode.tif Tests/images/hopper_webp_bits.ppm Tests/images/hopper_webp_write.ppm Tests/images/hopper_zero_comment_subblocks.gif Tests/images/i_trns.png Tests/images/icc-after-SOF.jpg Tests/images/icc_profile.png Tests/images/icc_profile_big.jpg Tests/images/icc_profile_none.png Tests/images/ifd_tag_type.tiff Tests/images/illu10_no_preview.eps Tests/images/illu10_preview.eps Tests/images/illuCS6_no_preview.eps Tests/images/illuCS6_preview.eps Tests/images/imagedraw/line_horizontal_slope1px_w2px.png Tests/images/imagedraw/line_horizontal_w101px.png Tests/images/imagedraw/line_horizontal_w2px_inverted.png Tests/images/imagedraw/line_horizontal_w2px_normal.png Tests/images/imagedraw/line_horizontal_w3px.png Tests/images/imagedraw/line_oblique_45_w3px_a.png Tests/images/imagedraw/line_oblique_45_w3px_b.png Tests/images/imagedraw/line_vertical_slope1px_w2px.png Tests/images/imagedraw/line_vertical_w101px.png Tests/images/imagedraw/line_vertical_w2px_inverted.png Tests/images/imagedraw/line_vertical_w2px_normal.png Tests/images/imagedraw/line_vertical_w3px.png Tests/images/imagedraw/square.png Tests/images/imagedraw/triangle_right.png Tests/images/imagedraw2_text.png Tests/images/imagedraw_arc.png Tests/images/imagedraw_arc_end_le_start.png Tests/images/imagedraw_arc_high.png Tests/images/imagedraw_arc_no_loops.png Tests/images/imagedraw_arc_width.png Tests/images/imagedraw_arc_width_fill.png Tests/images/imagedraw_arc_width_non_whole_angle.png Tests/images/imagedraw_arc_width_pieslice.png Tests/images/imagedraw_big_rectangle.png Tests/images/imagedraw_bitmap.png Tests/images/imagedraw_chord_L.png Tests/images/imagedraw_chord_RGB.png Tests/images/imagedraw_chord_too_fat.png Tests/images/imagedraw_chord_width.png Tests/images/imagedraw_chord_width_fill.png Tests/images/imagedraw_chord_zero_width.png Tests/images/imagedraw_ellipse_L.png Tests/images/imagedraw_ellipse_RGB.png Tests/images/imagedraw_ellipse_edge.png Tests/images/imagedraw_ellipse_translucent.png Tests/images/imagedraw_ellipse_various_sizes.png Tests/images/imagedraw_ellipse_various_sizes_filled.png Tests/images/imagedraw_ellipse_width.png Tests/images/imagedraw_ellipse_width_fill.png Tests/images/imagedraw_ellipse_width_large.png Tests/images/imagedraw_ellipse_zero_width.png Tests/images/imagedraw_floodfill2.png Tests/images/imagedraw_floodfill_L.png Tests/images/imagedraw_floodfill_RGB.png Tests/images/imagedraw_floodfill_RGBA.png Tests/images/imagedraw_floodfill_not_negative.png Tests/images/imagedraw_line.png Tests/images/imagedraw_line_joint_curve.png Tests/images/imagedraw_outline_chord_L.png Tests/images/imagedraw_outline_chord_RGB.png Tests/images/imagedraw_outline_ellipse_L.png Tests/images/imagedraw_outline_ellipse_RGB.png Tests/images/imagedraw_outline_pieslice_L.png Tests/images/imagedraw_outline_pieslice_RGB.png Tests/images/imagedraw_outline_polygon_L.png Tests/images/imagedraw_outline_polygon_RGB.png Tests/images/imagedraw_outline_rectangle_L.png Tests/images/imagedraw_outline_rectangle_RGB.png Tests/images/imagedraw_outline_shape_L.png Tests/images/imagedraw_outline_shape_RGB.png Tests/images/imagedraw_pieslice.png Tests/images/imagedraw_pieslice_wide.png Tests/images/imagedraw_pieslice_width.png Tests/images/imagedraw_pieslice_width_fill.png Tests/images/imagedraw_pieslice_zero_width.png Tests/images/imagedraw_point.png Tests/images/imagedraw_polygon.png Tests/images/imagedraw_polygon_1px_high.png Tests/images/imagedraw_polygon_kite_L.png Tests/images/imagedraw_polygon_kite_RGB.png Tests/images/imagedraw_rectangle.png Tests/images/imagedraw_rectangle_I.png Tests/images/imagedraw_rectangle_width.png Tests/images/imagedraw_rectangle_width_fill.png Tests/images/imagedraw_rectangle_zero_width.png Tests/images/imagedraw_regular_octagon.png Tests/images/imagedraw_shape1.png Tests/images/imagedraw_shape2.png Tests/images/imagedraw_square.png Tests/images/imagedraw_square_rotate_45.png Tests/images/imagedraw_stroke_descender.png Tests/images/imagedraw_stroke_different.png Tests/images/imagedraw_stroke_multiline.png Tests/images/imagedraw_stroke_same.png Tests/images/imagedraw_wide_line_dot.png Tests/images/imagedraw_wide_line_larger_than_int.png Tests/images/imageops_pad_h_0.jpg Tests/images/imageops_pad_h_1.jpg Tests/images/imageops_pad_h_2.jpg Tests/images/imageops_pad_v_0.jpg Tests/images/imageops_pad_v_1.jpg Tests/images/imageops_pad_v_2.jpg Tests/images/input_bw_five_bands.fpx Tests/images/invalid-exif-without-x-resolution.jpg Tests/images/invalid-exif.jpg Tests/images/invalid.spider Tests/images/iptc.jpg Tests/images/iptc_roundDown.jpg Tests/images/iptc_roundUp.jpg Tests/images/iss634.apng Tests/images/iss634.gif Tests/images/iss634.webp Tests/images/issue_2278.tif Tests/images/issue_2811.gif Tests/images/itxt_chunks.png Tests/images/jpeg_ff00_header.jpg Tests/images/junk_jpeg_header.jpg Tests/images/l2rgb_read.bmp Tests/images/l_trns.png Tests/images/la.tga Tests/images/lab-green.tif Tests/images/lab-red.tif Tests/images/lab.tif Tests/images/libtiff_segfault.tif Tests/images/linear_gradient.png Tests/images/morph_a.png Tests/images/multiline_text.png Tests/images/multiline_text_center.png Tests/images/multiline_text_right.png Tests/images/multiline_text_spacing.png Tests/images/multipage-lastframe.tif Tests/images/multipage-mmap.tiff Tests/images/multipage.tiff Tests/images/negative_size.ppm Tests/images/no-dpi-in-exif.jpg Tests/images/no_cursors.cur Tests/images/no_rows_per_strip.tif Tests/images/non_zero_bb.eps Tests/images/non_zero_bb.png Tests/images/non_zero_bb_scale2.png Tests/images/old-style-jpeg-compression.png Tests/images/old-style-jpeg-compression.tif Tests/images/p_trns_single.png Tests/images/pcx_overrun.bin Tests/images/pcx_overrun2.bin Tests/images/photoshop-200dpi-broken.jpg Tests/images/photoshop-200dpi.jpg Tests/images/pil123p.png Tests/images/pil123rgba.png Tests/images/pil136.png Tests/images/pil136.tiff Tests/images/pil168.png Tests/images/pil168.tif Tests/images/pil184.pcx Tests/images/pil_sample_cmyk.eps Tests/images/pil_sample_cmyk.jpg Tests/images/pil_sample_rgb.jpg Tests/images/pillow.icns Tests/images/pillow.ico Tests/images/pillow2.icns Tests/images/pillow3.icns Tests/images/png_decompression_dos.png Tests/images/pngtest_bad.png.bin Tests/images/pport_g4.tif Tests/images/python.ico Tests/images/radial_gradient.png Tests/images/radial_gradients.png Tests/images/raw_negative_stride.bin Tests/images/rdf.tif Tests/images/rectangle_surrounding_text.png Tests/images/reqd_showpage.eps Tests/images/reqd_showpage.png Tests/images/rgb.jpg Tests/images/rgb32bf-rgba.bmp Tests/images/rgb32rle.tga Tests/images/rgb_trns.png Tests/images/rgb_trns_ycbc.j2k Tests/images/rgb_trns_ycbc.jp2 Tests/images/rotate_45_no_fill.png Tests/images/rotate_45_with_fill.png Tests/images/sgi_crash.bin Tests/images/sgi_overrun.bin Tests/images/sgi_overrun_expandrow.bin Tests/images/sgi_overrun_expandrow2.bin Tests/images/sgi_overrun_expandrowF04.bin Tests/images/standard_embedded.png Tests/images/sugarshack.mpo Tests/images/sugarshack_bad_mpo_header.jpg Tests/images/sugarshack_frame_size.mpo Tests/images/sugarshack_ifd_offset.mpo Tests/images/sugarshack_no_data.mpo Tests/images/sunraster.im1 Tests/images/sunraster.im1.png Tests/images/tRNS_null_1x1.png Tests/images/test-card-lossless.jp2 Tests/images/test-card-lossy-tiled.jp2 Tests/images/test-card.png Tests/images/test-ole-file.doc Tests/images/test.colors.gif Tests/images/test.gpl Tests/images/test_Nastalifont_text.png Tests/images/test_anchor_multiline_lm_center.png Tests/images/test_anchor_multiline_lm_left.png Tests/images/test_anchor_multiline_lm_right.png Tests/images/test_anchor_multiline_ma_center.png Tests/images/test_anchor_multiline_md_center.png Tests/images/test_anchor_multiline_mm_center.png Tests/images/test_anchor_multiline_mm_left.png Tests/images/test_anchor_multiline_mm_right.png Tests/images/test_anchor_multiline_rm_center.png Tests/images/test_anchor_multiline_rm_left.png Tests/images/test_anchor_multiline_rm_right.png Tests/images/test_anchor_quick_ls.png Tests/images/test_anchor_quick_ma.png Tests/images/test_anchor_quick_mb.png Tests/images/test_anchor_quick_md.png Tests/images/test_anchor_quick_mm.png Tests/images/test_anchor_quick_ms.png Tests/images/test_anchor_quick_mt.png Tests/images/test_anchor_quick_rs.png Tests/images/test_anchor_ttb_f_lt.png Tests/images/test_anchor_ttb_f_mm.png Tests/images/test_anchor_ttb_f_rb.png Tests/images/test_anchor_ttb_f_sm.png Tests/images/test_arabictext_features.png Tests/images/test_combine_caron.png Tests/images/test_combine_caron_below.png Tests/images/test_combine_caron_below_lb.png Tests/images/test_combine_caron_below_ld.png Tests/images/test_combine_caron_below_ls.png Tests/images/test_combine_caron_below_ttb.png Tests/images/test_combine_caron_below_ttb_lb.png Tests/images/test_combine_caron_la.png Tests/images/test_combine_caron_ls.png Tests/images/test_combine_caron_lt.png Tests/images/test_combine_caron_ttb.png Tests/images/test_combine_caron_ttb_lt.png Tests/images/test_combine_double_breve_below.png Tests/images/test_combine_double_breve_below_ma.png Tests/images/test_combine_double_breve_below_ra.png Tests/images/test_combine_double_breve_below_ttb.png Tests/images/test_combine_double_breve_below_ttb_mt.png Tests/images/test_combine_double_breve_below_ttb_rt.png Tests/images/test_combine_double_breve_below_ttb_st.png Tests/images/test_combine_multiline_lm_center.png Tests/images/test_combine_multiline_lm_left.png Tests/images/test_combine_multiline_lm_right.png Tests/images/test_combine_multiline_mm_center.png Tests/images/test_combine_multiline_mm_left.png Tests/images/test_combine_multiline_mm_right.png Tests/images/test_combine_multiline_rm_center.png Tests/images/test_combine_multiline_rm_left.png Tests/images/test_combine_multiline_rm_right.png Tests/images/test_combine_overline.png Tests/images/test_combine_overline_la.png Tests/images/test_combine_overline_ra.png Tests/images/test_combine_overline_ttb.png Tests/images/test_combine_overline_ttb_mt.png Tests/images/test_combine_overline_ttb_rt.png Tests/images/test_combine_overline_ttb_st.png Tests/images/test_complex_unicode_text.png Tests/images/test_complex_unicode_text2.png Tests/images/test_direction_ltr.png Tests/images/test_direction_rtl.png Tests/images/test_direction_ttb.png Tests/images/test_direction_ttb_stroke.png Tests/images/test_draw_pbm_target.png Tests/images/test_draw_pbm_ter_en_target.png Tests/images/test_draw_pbm_ter_pl_target.png Tests/images/test_extents.gif Tests/images/test_kerning_features.png Tests/images/test_language.png Tests/images/test_ligature_features.png Tests/images/test_text.png Tests/images/test_x_max_and_y_offset.png Tests/images/test_y_offset.png Tests/images/text_mono.gif Tests/images/tga/common/1x1_l.png Tests/images/tga/common/1x1_l_bl_raw.tga Tests/images/tga/common/1x1_l_bl_rle.tga Tests/images/tga/common/1x1_l_tl_raw.tga Tests/images/tga/common/1x1_l_tl_rle.tga Tests/images/tga/common/200x32_l.png Tests/images/tga/common/200x32_l_bl_raw.tga Tests/images/tga/common/200x32_l_bl_rle.tga Tests/images/tga/common/200x32_l_tl_raw.tga Tests/images/tga/common/200x32_l_tl_rle.tga Tests/images/tga/common/200x32_la.png Tests/images/tga/common/200x32_la_bl_raw.tga Tests/images/tga/common/200x32_la_bl_rle.tga Tests/images/tga/common/200x32_la_tl_raw.tga Tests/images/tga/common/200x32_la_tl_rle.tga Tests/images/tga/common/200x32_p.png Tests/images/tga/common/200x32_p_bl_raw.tga Tests/images/tga/common/200x32_p_bl_rle.tga Tests/images/tga/common/200x32_p_tl_raw.tga Tests/images/tga/common/200x32_p_tl_rle.tga Tests/images/tga/common/200x32_rgb.png Tests/images/tga/common/200x32_rgb_bl_raw.tga Tests/images/tga/common/200x32_rgb_bl_rle.tga Tests/images/tga/common/200x32_rgb_tl_raw.tga Tests/images/tga/common/200x32_rgb_tl_rle.tga Tests/images/tga/common/200x32_rgba.png Tests/images/tga/common/200x32_rgba_bl_raw.tga Tests/images/tga/common/200x32_rgba_bl_rle.tga Tests/images/tga/common/200x32_rgba_tl_raw.tga Tests/images/tga/common/200x32_rgba_tl_rle.tga Tests/images/tga/common/readme.txt Tests/images/tga_id_field.tga Tests/images/tiff_16bit_RGB.tiff Tests/images/tiff_16bit_RGB_target.png Tests/images/tiff_16bit_RGBa.tiff Tests/images/tiff_16bit_RGBa_target.png Tests/images/tiff_adobe_deflate.png Tests/images/tiff_adobe_deflate.tif Tests/images/tiff_gray_2_4_bpp/hopper2.tif Tests/images/tiff_gray_2_4_bpp/hopper2I.tif Tests/images/tiff_gray_2_4_bpp/hopper2IR.tif Tests/images/tiff_gray_2_4_bpp/hopper2R.tif Tests/images/tiff_gray_2_4_bpp/hopper4.tif Tests/images/tiff_gray_2_4_bpp/hopper4I.tif Tests/images/tiff_gray_2_4_bpp/hopper4IR.tif Tests/images/tiff_gray_2_4_bpp/hopper4R.tif Tests/images/tiff_overflow_rows_per_strip.tif Tests/images/tiff_strip_cmyk_16l_jpeg.tif Tests/images/tiff_strip_cmyk_jpeg.tif Tests/images/tiff_strip_planar_raw.tif Tests/images/tiff_strip_planar_raw_with_overviews.tif Tests/images/tiff_strip_raw.tif Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif Tests/images/tiff_tiled_cmyk_jpeg.tif Tests/images/tiff_tiled_planar_raw.tif Tests/images/tiff_tiled_raw.tif Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif Tests/images/tiff_wrong_bits_per_sample.tiff Tests/images/total-pages-zero.tif Tests/images/transparent.gif Tests/images/transparent.png Tests/images/transparent.sgi Tests/images/transparent.webp Tests/images/transparent_background_text.png Tests/images/truncated_image.png Tests/images/truncated_jpeg.jpg Tests/images/tv.rgb Tests/images/tv16.sgi Tests/images/uint16_1_4660.tif Tests/images/unbound_variable.jp2 Tests/images/uncompressed_rgb.dds Tests/images/uncompressed_rgb.png Tests/images/unicode_extended.png Tests/images/unimplemented_dxgi_format.dds Tests/images/unimplemented_pixel_format.dds Tests/images/variation_adobe.png Tests/images/variation_adobe_axes.png Tests/images/variation_adobe_name.png Tests/images/variation_adobe_older_harfbuzz.png Tests/images/variation_adobe_older_harfbuzz_axes.png Tests/images/variation_adobe_older_harfbuzz_name.png Tests/images/variation_tiny.png Tests/images/variation_tiny_axes.png Tests/images/variation_tiny_name.png Tests/images/xmp_tags_orientation.png Tests/images/zero_bb.eps Tests/images/zero_bb.png Tests/images/zero_bb_emptyline.eps Tests/images/zero_bb_scale2.png Tests/test_000_sanity.py Tests/test_binary.py Tests/test_bmp_reference.py Tests/test_box_blur.py Tests/test_color_lut.py Tests/test_core_resources.py Tests/test_decompression_bomb.py Tests/test_features.py Tests/test_file_apng.py Tests/test_file_blp.py Tests/test_file_bmp.py Tests/test_file_bufrstub.py Tests/test_file_container.py Tests/test_file_cur.py Tests/test_file_dcx.py Tests/test_file_dds.py Tests/test_file_eps.py Tests/test_file_fitsstub.py Tests/test_file_fli.py Tests/test_file_fpx.py Tests/test_file_ftex.py Tests/test_file_gbr.py Tests/test_file_gd.py Tests/test_file_gif.py Tests/test_file_gimpgradient.py Tests/test_file_gimppalette.py Tests/test_file_gribstub.py Tests/test_file_hdf5stub.py Tests/test_file_icns.py Tests/test_file_ico.py Tests/test_file_im.py Tests/test_file_iptc.py Tests/test_file_jpeg.py Tests/test_file_jpeg2k.py Tests/test_file_libtiff.py Tests/test_file_libtiff_small.py Tests/test_file_mcidas.py Tests/test_file_mic.py Tests/test_file_mpo.py Tests/test_file_msp.py Tests/test_file_palm.py Tests/test_file_pcd.py Tests/test_file_pcx.py Tests/test_file_pdf.py Tests/test_file_pixar.py Tests/test_file_png.py Tests/test_file_ppm.py Tests/test_file_psd.py Tests/test_file_sgi.py Tests/test_file_spider.py Tests/test_file_sun.py Tests/test_file_tar.py Tests/test_file_tga.py Tests/test_file_tiff.py Tests/test_file_tiff_metadata.py Tests/test_file_wal.py Tests/test_file_webp.py Tests/test_file_webp_alpha.py Tests/test_file_webp_animated.py Tests/test_file_webp_lossless.py Tests/test_file_webp_metadata.py Tests/test_file_wmf.py Tests/test_file_xbm.py Tests/test_file_xpm.py Tests/test_file_xvthumb.py Tests/test_font_bdf.py Tests/test_font_leaks.py Tests/test_font_pcf.py Tests/test_font_pcf_charsets.py Tests/test_format_hsv.py Tests/test_format_lab.py Tests/test_image.py Tests/test_image_access.py Tests/test_image_array.py Tests/test_image_convert.py Tests/test_image_copy.py Tests/test_image_crop.py Tests/test_image_draft.py Tests/test_image_entropy.py Tests/test_image_filter.py Tests/test_image_frombytes.py Tests/test_image_fromqimage.py Tests/test_image_getbands.py Tests/test_image_getbbox.py Tests/test_image_getcolors.py Tests/test_image_getdata.py Tests/test_image_getextrema.py Tests/test_image_getim.py Tests/test_image_getpalette.py Tests/test_image_getprojection.py Tests/test_image_histogram.py Tests/test_image_load.py Tests/test_image_mode.py Tests/test_image_paste.py Tests/test_image_point.py Tests/test_image_putalpha.py Tests/test_image_putdata.py Tests/test_image_putpalette.py Tests/test_image_quantize.py Tests/test_image_reduce.py Tests/test_image_resample.py Tests/test_image_resize.py Tests/test_image_rotate.py Tests/test_image_split.py Tests/test_image_thumbnail.py Tests/test_image_tobitmap.py Tests/test_image_tobytes.py Tests/test_image_transform.py Tests/test_image_transpose.py Tests/test_imagechops.py Tests/test_imagecms.py Tests/test_imagecolor.py Tests/test_imagedraw.py Tests/test_imagedraw2.py Tests/test_imageenhance.py Tests/test_imagefile.py Tests/test_imagefont.py Tests/test_imagefontctl.py Tests/test_imagegrab.py Tests/test_imagemath.py Tests/test_imagemorph.py Tests/test_imageops.py Tests/test_imageops_usm.py Tests/test_imagepalette.py Tests/test_imagepath.py Tests/test_imageqt.py Tests/test_imagesequence.py Tests/test_imageshow.py Tests/test_imagestat.py Tests/test_imagetk.py Tests/test_imagewin.py Tests/test_imagewin_pointers.py Tests/test_lib_image.py Tests/test_lib_pack.py Tests/test_locale.py Tests/test_main.py Tests/test_map.py Tests/test_mode_i16.py Tests/test_numpy.py Tests/test_pdfparser.py Tests/test_pickle.py Tests/test_psdraw.py Tests/test_pyroma.py Tests/test_qt_image_fromqpixmap.py Tests/test_qt_image_toqimage.py Tests/test_qt_image_toqpixmap.py Tests/test_sgi_crash.py Tests/test_shell_injection.py Tests/test_tiff_crashes.py Tests/test_tiff_ifdrational.py Tests/test_uploader.py Tests/test_util.py Tests/test_webp_leaks.py codecov.yml conftest.py depends/README.rst depends/diffcover-install.sh depends/diffcover-run.sh depends/download-and-extract.sh depends/install_extra_test_images.sh depends/install_imagequant.sh depends/install_openjpeg.sh depends/install_raqm.sh depends/install_raqm_cmake.sh depends/install_webp.sh depends/termux.sh docs/COPYING docs/Guardfile docs/Makefile docs/PIL.rst docs/about.rst docs/conf.py docs/deprecations.rst docs/example/DdsImagePlugin.py docs/example/anchors.png docs/example/anchors.py docs/handbook/appendices.rst docs/handbook/concepts.rst docs/handbook/image-file-formats.rst docs/handbook/index.rst docs/handbook/overview.rst docs/handbook/text-anchors.rst docs/handbook/tutorial.rst docs/handbook/writing-your-own-file-decoder.rst docs/index.rst docs/installation.rst docs/make.bat docs/porting.rst docs/reference/ExifTags.rst docs/reference/Image.rst docs/reference/ImageChops.rst docs/reference/ImageCms.rst docs/reference/ImageColor.rst docs/reference/ImageDraw.rst docs/reference/ImageEnhance.rst docs/reference/ImageFile.rst docs/reference/ImageFilter.rst docs/reference/ImageFont.rst docs/reference/ImageGrab.rst docs/reference/ImageMath.rst docs/reference/ImageMorph.rst docs/reference/ImageOps.rst docs/reference/ImagePalette.rst docs/reference/ImagePath.rst docs/reference/ImageQt.rst docs/reference/ImageSequence.rst docs/reference/ImageShow.rst docs/reference/ImageStat.rst docs/reference/ImageTk.rst docs/reference/ImageWin.rst docs/reference/JpegPresets.rst docs/reference/PSDraw.rst docs/reference/PixelAccess.rst docs/reference/PyAccess.rst docs/reference/TiffTags.rst docs/reference/block_allocator.rst docs/reference/features.rst docs/reference/index.rst docs/reference/internal_design.rst docs/reference/internal_modules.rst docs/reference/limits.rst docs/reference/open_files.rst docs/reference/plugins.rst docs/releasenotes/2.7.0.rst docs/releasenotes/2.8.0.rst docs/releasenotes/3.0.0.rst docs/releasenotes/3.1.0.rst docs/releasenotes/3.1.1.rst docs/releasenotes/3.1.2.rst docs/releasenotes/3.2.0.rst docs/releasenotes/3.3.0.rst docs/releasenotes/3.3.2.rst docs/releasenotes/3.4.0.rst docs/releasenotes/4.0.0.rst docs/releasenotes/4.1.0.rst docs/releasenotes/4.1.1.rst docs/releasenotes/4.2.0.rst docs/releasenotes/4.2.1.rst docs/releasenotes/4.3.0.rst docs/releasenotes/5.0.0.rst docs/releasenotes/5.1.0.rst docs/releasenotes/5.2.0.rst docs/releasenotes/5.3.0.rst docs/releasenotes/5.4.0.rst docs/releasenotes/5.4.1.rst docs/releasenotes/6.0.0.rst docs/releasenotes/6.1.0.rst docs/releasenotes/6.2.0.rst docs/releasenotes/6.2.1.rst docs/releasenotes/6.2.2.rst docs/releasenotes/7.0.0.rst docs/releasenotes/7.1.0.rst docs/releasenotes/7.1.1.rst docs/releasenotes/7.1.2.rst docs/releasenotes/7.2.0.rst docs/releasenotes/8.0.0.rst docs/releasenotes/8.0.1.rst docs/releasenotes/index.rst docs/releasenotes/template.rst docs/resources/anchor_horizontal.svg docs/resources/anchor_vertical.svg docs/resources/css/dark.css docs/resources/favicon.ico docs/resources/js/script.js requirements.txt selftest.py setup.cfg setup.py src/PIL/BdfFontFile.py src/PIL/BlpImagePlugin.py src/PIL/BmpImagePlugin.py src/PIL/BufrStubImagePlugin.py src/PIL/ContainerIO.py src/PIL/CurImagePlugin.py src/PIL/DcxImagePlugin.py src/PIL/DdsImagePlugin.py src/PIL/EpsImagePlugin.py src/PIL/ExifTags.py src/PIL/FitsStubImagePlugin.py src/PIL/FliImagePlugin.py src/PIL/FontFile.py src/PIL/FpxImagePlugin.py src/PIL/FtexImagePlugin.py src/PIL/GbrImagePlugin.py src/PIL/GdImageFile.py src/PIL/GifImagePlugin.py src/PIL/GimpGradientFile.py src/PIL/GimpPaletteFile.py src/PIL/GribStubImagePlugin.py src/PIL/Hdf5StubImagePlugin.py src/PIL/IcnsImagePlugin.py src/PIL/IcoImagePlugin.py src/PIL/ImImagePlugin.py src/PIL/Image.py src/PIL/ImageChops.py src/PIL/ImageCms.py src/PIL/ImageColor.py src/PIL/ImageDraw.py src/PIL/ImageDraw2.py src/PIL/ImageEnhance.py src/PIL/ImageFile.py src/PIL/ImageFilter.py src/PIL/ImageFont.py src/PIL/ImageGrab.py src/PIL/ImageMath.py src/PIL/ImageMode.py src/PIL/ImageMorph.py src/PIL/ImageOps.py src/PIL/ImagePalette.py src/PIL/ImagePath.py src/PIL/ImageQt.py src/PIL/ImageSequence.py src/PIL/ImageShow.py src/PIL/ImageStat.py src/PIL/ImageTk.py src/PIL/ImageTransform.py src/PIL/ImageWin.py src/PIL/ImtImagePlugin.py src/PIL/IptcImagePlugin.py src/PIL/Jpeg2KImagePlugin.py src/PIL/JpegImagePlugin.py src/PIL/JpegPresets.py src/PIL/McIdasImagePlugin.py src/PIL/MicImagePlugin.py src/PIL/MpegImagePlugin.py src/PIL/MpoImagePlugin.py src/PIL/MspImagePlugin.py src/PIL/PSDraw.py src/PIL/PaletteFile.py src/PIL/PalmImagePlugin.py src/PIL/PcdImagePlugin.py src/PIL/PcfFontFile.py src/PIL/PcxImagePlugin.py src/PIL/PdfImagePlugin.py src/PIL/PdfParser.py src/PIL/PixarImagePlugin.py src/PIL/PngImagePlugin.py src/PIL/PpmImagePlugin.py src/PIL/PsdImagePlugin.py src/PIL/PyAccess.py src/PIL/SgiImagePlugin.py src/PIL/SpiderImagePlugin.py src/PIL/SunImagePlugin.py src/PIL/TarIO.py src/PIL/TgaImagePlugin.py src/PIL/TiffImagePlugin.py src/PIL/TiffTags.py src/PIL/WalImageFile.py src/PIL/WebPImagePlugin.py src/PIL/WmfImagePlugin.py src/PIL/XVThumbImagePlugin.py src/PIL/XbmImagePlugin.py src/PIL/XpmImagePlugin.py src/PIL/__init__.py src/PIL/__main__.py src/PIL/_binary.py src/PIL/_tkinter_finder.py src/PIL/_util.py src/PIL/_version.py src/PIL/features.py src/Tk/_tkmini.h src/Tk/tkImaging.c src/_imaging.c src/_imagingcms.c src/_imagingft.c src/_imagingmath.c src/_imagingmorph.c src/_imagingtk.c src/_webp.c src/decode.c src/display.c src/encode.c src/libImaging/Access.c src/libImaging/AlphaComposite.c src/libImaging/Bands.c src/libImaging/BcnDecode.c src/libImaging/Bit.h src/libImaging/BitDecode.c src/libImaging/Blend.c src/libImaging/BoxBlur.c src/libImaging/Chops.c src/libImaging/ColorLUT.c src/libImaging/Convert.c src/libImaging/ConvertYCbCr.c src/libImaging/Copy.c src/libImaging/Crop.c src/libImaging/Dib.c src/libImaging/Draw.c src/libImaging/Effects.c src/libImaging/EpsEncode.c src/libImaging/Except.c src/libImaging/File.c src/libImaging/Fill.c src/libImaging/Filter.c src/libImaging/FliDecode.c src/libImaging/Geometry.c src/libImaging/GetBBox.c src/libImaging/Gif.h src/libImaging/GifDecode.c src/libImaging/GifEncode.c src/libImaging/HexDecode.c src/libImaging/Histo.c src/libImaging/ImDib.h src/libImaging/ImPlatform.h src/libImaging/Imaging.h src/libImaging/ImagingUtils.h src/libImaging/Jpeg.h src/libImaging/Jpeg2K.h src/libImaging/Jpeg2KDecode.c src/libImaging/Jpeg2KEncode.c src/libImaging/JpegDecode.c src/libImaging/JpegEncode.c src/libImaging/Matrix.c src/libImaging/ModeFilter.c src/libImaging/Negative.c src/libImaging/Offset.c src/libImaging/Pack.c src/libImaging/PackDecode.c src/libImaging/Palette.c src/libImaging/Paste.c src/libImaging/PcdDecode.c src/libImaging/PcxDecode.c src/libImaging/PcxEncode.c src/libImaging/Point.c src/libImaging/Quant.c src/libImaging/QuantHash.c src/libImaging/QuantHash.h src/libImaging/QuantHeap.c src/libImaging/QuantHeap.h src/libImaging/QuantOctree.c src/libImaging/QuantOctree.h src/libImaging/QuantPngQuant.c src/libImaging/QuantPngQuant.h src/libImaging/QuantTypes.h src/libImaging/RankFilter.c src/libImaging/Raw.h src/libImaging/RawDecode.c src/libImaging/RawEncode.c src/libImaging/Reduce.c src/libImaging/Resample.c src/libImaging/Sgi.h src/libImaging/SgiRleDecode.c src/libImaging/Storage.c src/libImaging/SunRleDecode.c src/libImaging/TgaRleDecode.c src/libImaging/TgaRleEncode.c src/libImaging/TiffDecode.c src/libImaging/TiffDecode.h src/libImaging/Unpack.c src/libImaging/UnpackYCC.c src/libImaging/UnsharpMask.c src/libImaging/XbmDecode.c src/libImaging/XbmEncode.c src/libImaging/ZipCodecs.h src/libImaging/ZipDecode.c src/libImaging/ZipEncode.c src/libImaging/codec_fd.c src/libImaging/raqm.h src/map.c src/outline.c src/path.c tox.ini winbuild/README.md winbuild/build.rst winbuild/build_prepare.py winbuild/fribidi.cmake winbuild/raqm.cmake winbuild/tiff.opt <<<<<< network # path=/home/travis/build/python-pillow/Pillow/src#libImaging#PcxEncode.c.gcov -: 0:Source:src/libImaging/PcxEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/PcxEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/PcxEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * encoder for PCX data -: 6: * -: 7: * history: -: 8: * 99-02-07 fl created -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1999. -: 11: * Copyright (c) Secret Labs AB 1999. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19:enum { INIT, FETCH, ENCODE }; -: 20: -: 21:/* we're reusing "ystep" to store the last value */ -: 22:#define LAST ystep -: 23: -: 24:int function ImagingPcxEncode called 40 returned 100% blocks executed 96% 40: 25:ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 26:{ -: 27: UINT8* ptr; -: 28: int this; 40: 29: int bytes_per_line = 0; 40: 30: int padding = 0; 40: 31: int stride = 0; 40: 32: int bpp = 0; 40: 33: int planes = 1; -: 34: int i; -: 35: 40: 36: ptr = buf; -: 37: 40: 38: if (!state->state) { branch 0 taken 43% (fallthrough) branch 1 taken 58% -: 39: /* sanity check */ 17: 40: if (state->xsize <= 0 || state->ysize <= 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 41: state->errcode = IMAGING_CODEC_END; #####: 42: return 0; -: 43: } 17: 44: state->state = FETCH; -: 45: } -: 46: 40: 47: bpp = state->bits; 40: 48: if (state->bits == 24){ branch 0 taken 30% (fallthrough) branch 1 taken 70% 12: 49: planes = 3; 12: 50: bpp = 8; -: 51: } -: 52: 40: 53: bytes_per_line = (state->xsize*bpp + 7) / 8; -: 54: /* The stride here needs to be kept in sync with the version in -: 55: PcxImagePlugin.py. If it's not, the header and the body of the -: 56: image will be out of sync and bad things will happen on decode. -: 57: */ 40: 58: stride = bytes_per_line + (bytes_per_line % 2); -: 59: 40: 60: padding = stride - bytes_per_line; -: 61: -: 62: -: 63: for (;;) { -: 64: 3883: 65: switch (state->state) { branch 0 taken 0% branch 1 taken 99% branch 2 taken 1% -: 66: case FETCH: -: 67: -: 68: /* get a line of data */ 3860: 69: if (state->y >= state->ysize) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 17: 70: state->errcode = IMAGING_CODEC_END; 17: 71: return ptr - buf; -: 72: } -: 73: 7686: 74: state->shuffle(state->buffer, call 0 returned 100% 3843: 75: (UINT8*) im->image[state->y + state->yoff] + 3843: 76: state->xoff * im->pixelsize, state->xsize); -: 77: 3843: 78: state->y += 1; -: 79: 3843: 80: state->count = 1; 3843: 81: state->LAST = state->buffer[0]; -: 82: 3843: 83: state->x = 1; -: 84: 3843: 85: state->state = ENCODE; -: 86: /* fall through */ -: 87: -: 88: case ENCODE: -: 89: /* compress this line */ -: 90: -: 91: /* when we arrive here, "count" contains the number of -: 92: bytes having the value of "LAST" that we've already -: 93: seen */ -: 94: do { -: 95: /* If we're encoding an odd width file, and we've -: 96: got more than one plane, we need to pad each -: 97: color row with padding bytes at the end. Since -: 98: The pixels are stored RRRRRGGGGGBBBBB, so we need -: 99: to have the padding be RRRRRPGGGGGPBBBBBP. Hence -: 100: the double loop -: 101: */ 2430497: 102: while (state->x % bytes_per_line) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 103: 2425372: 104: if (state->count == 63) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 105: /* this run is full; flush it */ 239: 106: if (bytes < 2) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 107: return ptr - buf; -: 108: } 238: 109: ptr[0] = 0xff; 238: 110: ptr[1] = state->LAST; 238: 111: ptr += 2; 238: 112: bytes -= 2; -: 113: 238: 114: state->count = 0; -: 115: } -: 116: 2425371: 117: this = state->buffer[state->x]; -: 118: 2425371: 119: if (this == state->LAST) { branch 0 taken 63% (fallthrough) branch 1 taken 37% -: 120: /* extend the current run */ 1517079: 121: state->x += 1; 1517079: 122: state->count += 1; -: 123: -: 124: } else { -: 125: /* start a new run */ 908292: 126: if (state->count == 1 && (state->LAST < 0xc0)) { branch 0 taken 67% (fallthrough) branch 1 taken 33% branch 2 taken 87% (fallthrough) branch 3 taken 13% 531522: 127: if (bytes < 1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 5: 128: return ptr - buf; -: 129: } 531517: 130: ptr[0] = state->LAST; 531517: 131: ptr += 1; 531517: 132: bytes -= 1; -: 133: } else { 376770: 134: if (state->count > 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 376668: 135: if (bytes < 2) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 13: 136: return ptr - buf; -: 137: } 376655: 138: ptr[0] = 0xc0 | state->count; 376655: 139: ptr[1] = state->LAST; 376655: 140: ptr += 2; 376655: 141: bytes -= 2; -: 142: } -: 143: } -: 144: 908274: 145: state->LAST = this; 908274: 146: state->count = 1; -: 147: 908274: 148: state->x += 1; -: 149: } -: 150: } -: 151: -: 152: /* end of line; flush the current run */ 5125: 153: if (state->count == 1 && (state->LAST < 0xc0)) { branch 0 taken 26% (fallthrough) branch 1 taken 74% branch 2 taken 67% (fallthrough) branch 3 taken 33% 907: 154: if (bytes < 1 + padding) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2: 155: return ptr - buf; -: 156: } 905: 157: ptr[0] = state->LAST; 905: 158: ptr += 1; 905: 159: bytes -= 1; -: 160: } else { 4218: 161: if (state->count > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 4218: 162: if (bytes < 2 + padding) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2: 163: return ptr - buf; -: 164: } 4216: 165: ptr[0] = 0xc0 | state->count; 4216: 166: ptr[1] = state->LAST; 4216: 167: ptr += 2; 4216: 168: bytes -= 2; -: 169: } -: 170: } -: 171: /* add the padding */ 2816: 172: for (i = 0; i < padding; i++) { branch 0 taken 35% branch 1 taken 65% (fallthrough) 2816: 173: ptr[0] = 0; 2816: 174: ptr += 1; 2816: 175: bytes -= 1; -: 176: } -: 177: /* reset for the next color plane. */ 5121: 178: if (state->x < planes * bytes_per_line) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 1278: 179: state->count = 1; 1278: 180: state->LAST = state->buffer[state->x]; 1278: 181: state->x += 1; -: 182: } 5121: 183: } while (state->x < planes * bytes_per_line); branch 0 taken 25% branch 1 taken 75% (fallthrough) -: 184: -: 185: /* read next line */ 3843: 186: state->state = FETCH; 3843: 187: break; -: 188: } -: 189: } -: 190:} -: 191: <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#UnsharpMask.c.gcov -: 0:Source:src/libImaging/UnsharpMask.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/UnsharpMask.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/UnsharpMask.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* PILusm, a gaussian blur and unsharp masking library for PIL -: 2: By Kevin Cazabon, copyright 2003 -: 3: kevin_cazabon@hotmail.com -: 4: kevin@cazabon.com */ -: 5: -: 6:/* Originally released under LGPL. Graciously donated to PIL -: 7: for distribution under the standard PIL license in 2009." */ -: 8: -: 9:#include "Imaging.h" -: 10: -: 11: -: 12:typedef UINT8 pixel[4]; -: 13: -: 14: -: 15:static inline UINT8 clip8(int in) -: 16:{ 286515: 17: if (in >= 255) { branch 0 taken 88% (fallthrough) branch 1 taken 12% branch 2 taken 74% (fallthrough) branch 3 taken 26% branch 4 taken 78% (fallthrough) branch 5 taken 22% branch 6 taken 81% (fallthrough) branch 7 taken 19% branch 8 never executed branch 9 never executed -: 18: return 255; -: 19: } 225782: 20: if (in <= 0) { branch 0 taken 57% (fallthrough) branch 1 taken 43% branch 2 taken 62% (fallthrough) branch 3 taken 38% branch 4 taken 65% (fallthrough) branch 5 taken 35% branch 6 taken 73% (fallthrough) branch 7 taken 27% branch 8 never executed branch 9 never executed -: 21: return 0; -: 22: } 148379: 23: return (UINT8) in; -: 24:} -: 25: -: 26: -: 27:Imaging function ImagingUnsharpMask called 16 returned 100% blocks executed 90% 16: 28:ImagingUnsharpMask(Imaging imOut, Imaging imIn, float radius, int percent, -: 29: int threshold) -: 30:{ -: 31: ImagingSectionCookie cookie; -: 32: Imaging result; -: 33: -: 34: int x, y, diff; -: 35: 16: 36: pixel *lineIn = NULL; 16: 37: pixel *lineOut = NULL; 16: 38: UINT8 *lineIn8 = NULL; 16: 39: UINT8 *lineOut8 = NULL; -: 40: -: 41: /* First, do a gaussian blur on the image, putting results in imOut -: 42: temporarily. All format checks are in gaussian blur. */ 16: 43: result = ImagingGaussianBlur(imOut, imIn, radius, 3); call 0 returned 100% 16: 44: if (!result) { branch 0 taken 75% (fallthrough) branch 1 taken 25% -: 45: return NULL; -: 46: } -: 47: -: 48: /* Now, go through each pixel, compare "normal" pixel to blurred -: 49: pixel. If the difference is more than threshold values, apply -: 50: the OPPOSITE correction to the amount of blur, multiplied by -: 51: percent. */ -: 52: 12: 53: ImagingSectionEnter(&cookie); -: 54: 1430: 55: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 1418: 56: if (imIn->image8) branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 57: { 384: 58: lineIn8 = imIn->image8[y]; 384: 59: lineOut8 = imOut->image8[y]; 49536: 60: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% -: 61: /* compare in/out pixels, apply sharpening */ 49152: 62: diff = lineIn8[x] - lineOut8[x]; 49152: 63: if (abs(diff) > threshold) { branch 0 taken 66% (fallthrough) branch 1 taken 34% -: 64: /* add the diff*percent to the original pixel */ 65182: 65: lineOut8[x] = clip8(lineIn8[x] + diff * percent / 100); -: 66: } else { -: 67: /* new pixel is the same as imIn */ 16561: 68: lineOut8[x] = lineIn8[x]; -: 69: } -: 70: } -: 71: } else { 1034: 72: lineIn = (pixel *)imIn->image32[y]; 1034: 73: lineOut = (pixel *)imOut->image32[y]; 132206: 74: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 75: /* compare in/out pixels, apply sharpening */ 131172: 76: diff = lineIn[x][0] - lineOut[x][0]; 216833: 77: lineOut[x][0] = abs(diff) > threshold ? branch 0 taken 65% (fallthrough) branch 1 taken 35% 85661: 78: clip8(lineIn[x][0] + diff * percent / 100) : lineIn[x][0]; -: 79: 131172: 80: diff = lineIn[x][1] - lineOut[x][1]; 213432: 81: lineOut[x][1] = abs(diff) > threshold ? branch 0 taken 63% (fallthrough) branch 1 taken 37% 82260: 82: clip8(lineIn[x][1] + diff * percent / 100) : lineIn[x][1]; -: 83: 131172: 84: diff = lineIn[x][2] - lineOut[x][2]; 217175: 85: lineOut[x][2] = abs(diff) > threshold ? branch 0 taken 66% (fallthrough) branch 1 taken 34% 86003: 86: clip8(lineIn[x][2] + diff * percent / 100) : lineIn[x][2]; -: 87: 131172: 88: diff = lineIn[x][3] - lineOut[x][3]; 131172: 89: lineOut[x][3] = abs(diff) > threshold ? branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 90: clip8(lineIn[x][3] + diff * percent / 100) : lineIn[x][3]; -: 91: } -: 92: } -: 93: } -: 94: 12: 95: ImagingSectionLeave(&cookie); call 0 returned 100% -: 96: 12: 97: return imOut; -: 98:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#_webp.c.gcov -: 0:Source:src/_webp.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:#define PY_SSIZE_T_CLEAN -: 2:#include -: 3:#include "libImaging/Imaging.h" -: 4:#include -: 5:#include -: 6:#include -: 7: -: 8:#ifdef HAVE_WEBPMUX -: 9:#include -: 10:#include -: 11: -: 12:/* -: 13: * Check the versions from mux.h and demux.h, to ensure the WebPAnimEncoder and -: 14: * WebPAnimDecoder APIs are present (initial support was added in 0.5.0). The -: 15: * very early versions had some significant differences, so we require later -: 16: * versions, before enabling animation support. -: 17: */ -: 18:#if WEBP_MUX_ABI_VERSION >= 0x0104 && WEBP_DEMUX_ABI_VERSION >= 0x0105 -: 19:#define HAVE_WEBPANIM -: 20:#endif -: 21: -: 22:#endif -: 23: function ImagingSectionEnter called 16 returned 100% blocks executed 100% 16: 24:void ImagingSectionEnter(ImagingSectionCookie* cookie) { 16: 25: *cookie = (PyThreadState *) PyEval_SaveThread(); call 0 returned 100% 16: 26:} -: 27: function ImagingSectionLeave called 16 returned 100% blocks executed 100% 16: 28:void ImagingSectionLeave(ImagingSectionCookie* cookie) { 16: 29: PyEval_RestoreThread((PyThreadState*) *cookie); call 0 returned 100% 16: 30:} -: 31: -: 32:/* -------------------------------------------------------------------- */ -: 33:/* WebP Muxer Error Handling */ -: 34:/* -------------------------------------------------------------------- */ -: 35: -: 36:#ifdef HAVE_WEBPMUX -: 37: -: 38:static const char* const kErrorMessages[-WEBP_MUX_NOT_ENOUGH_DATA + 1] = { -: 39: "WEBP_MUX_NOT_FOUND", "WEBP_MUX_INVALID_ARGUMENT", "WEBP_MUX_BAD_DATA", -: 40: "WEBP_MUX_MEMORY_ERROR", "WEBP_MUX_NOT_ENOUGH_DATA" -: 41:}; -: 42: function HandleMuxError called 0 returned 0% blocks executed 0% #####: 43:PyObject* HandleMuxError(WebPMuxError err, char* chunk) { -: 44: char message[100]; -: 45: int message_len; -: 46: assert(err <= WEBP_MUX_NOT_FOUND && err >= WEBP_MUX_NOT_ENOUGH_DATA); -: 47: -: 48: // Check for a memory error first #####: 49: if (err == WEBP_MUX_MEMORY_ERROR) { branch 0 never executed branch 1 never executed #####: 50: return PyErr_NoMemory(); call 0 never executed -: 51: } -: 52: -: 53: // Create the error message #####: 54: if (chunk == NULL) { branch 0 never executed branch 1 never executed #####: 55: message_len = sprintf(message, "could not assemble chunks: %s", kErrorMessages[-err]); -: 56: } else { #####: 57: message_len = sprintf(message, "could not set %.4s chunk: %s", chunk, kErrorMessages[-err]); -: 58: } #####: 59: if (message_len < 0) { branch 0 never executed branch 1 never executed #####: 60: PyErr_SetString(PyExc_RuntimeError, "failed to construct error message"); call 0 never executed #####: 61: return NULL; -: 62: } -: 63: -: 64: // Set the proper error type #####: 65: switch (err) { branch 0 never executed branch 1 never executed branch 2 never executed -: 66: case WEBP_MUX_NOT_FOUND: -: 67: case WEBP_MUX_INVALID_ARGUMENT: #####: 68: PyErr_SetString(PyExc_ValueError, message); call 0 never executed #####: 69: break; -: 70: -: 71: case WEBP_MUX_BAD_DATA: -: 72: case WEBP_MUX_NOT_ENOUGH_DATA: #####: 73: PyErr_SetString(PyExc_OSError, message); call 0 never executed #####: 74: break; -: 75: -: 76: default: #####: 77: PyErr_SetString(PyExc_RuntimeError, message); call 0 never executed #####: 78: break; -: 79: } -: 80: return NULL; -: 81:} -: 82: -: 83:#endif -: 84: -: 85:/* -------------------------------------------------------------------- */ -: 86:/* WebP Animation Support */ -: 87:/* -------------------------------------------------------------------- */ -: 88: -: 89:#ifdef HAVE_WEBPANIM -: 90: -: 91:// Encoder type -: 92:typedef struct { -: 93: PyObject_HEAD -: 94: WebPAnimEncoder* enc; -: 95: WebPPicture frame; -: 96:} WebPAnimEncoderObject; -: 97: -: 98:static PyTypeObject WebPAnimEncoder_Type; -: 99: -: 100:// Decoder type -: 101:typedef struct { -: 102: PyObject_HEAD -: 103: WebPAnimDecoder* dec; -: 104: WebPAnimInfo info; -: 105: WebPData data; -: 106: char* mode; -: 107:} WebPAnimDecoderObject; -: 108: -: 109:static PyTypeObject WebPAnimDecoder_Type; -: 110: -: 111:// Encoder functions function _anim_encoder_new called 8 returned 100% blocks executed 64% 8: 112:PyObject* _anim_encoder_new(PyObject* self, PyObject* args) -: 113:{ -: 114: int width, height; -: 115: uint32_t bgcolor; -: 116: int loop_count; -: 117: int minimize_size; -: 118: int kmin, kmax; -: 119: int allow_mixed; -: 120: int verbose; -: 121: WebPAnimEncoderOptions enc_options; 8: 122: WebPAnimEncoderObject* encp = NULL; 8: 123: WebPAnimEncoder* enc = NULL; -: 124: 8: 125: if (!PyArg_ParseTuple(args, "iiIiiiiii", call 0 returned 100% branch 1 taken 88% (fallthrough) branch 2 taken 13% -: 126: &width, &height, &bgcolor, &loop_count, &minimize_size, -: 127: &kmin, &kmax, &allow_mixed, &verbose)) { -: 128: return NULL; -: 129: } -: 130: -: 131: // Setup and configure the encoder's options (these are animation-specific) 7: 132: if (!WebPAnimEncoderOptionsInit(&enc_options)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 133: PyErr_SetString(PyExc_RuntimeError, "failed to initialize encoder options"); call 0 never executed #####: 134: return NULL; -: 135: } 7: 136: enc_options.anim_params.bgcolor = bgcolor; 7: 137: enc_options.anim_params.loop_count = loop_count; 7: 138: enc_options.minimize_size = minimize_size; 7: 139: enc_options.kmin = kmin; 7: 140: enc_options.kmax = kmax; 7: 141: enc_options.allow_mixed = allow_mixed; 7: 142: enc_options.verbose = verbose; -: 143: -: 144: // Validate canvas dimensions 7: 145: if (width <= 0 || height <= 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 146: PyErr_SetString(PyExc_ValueError, "invalid canvas dimensions"); call 0 never executed #####: 147: return NULL; -: 148: } -: 149: -: 150: // Create a new animation encoder and picture frame 7: 151: encp = PyObject_New(WebPAnimEncoderObject, &WebPAnimEncoder_Type); call 0 returned 100% 7: 152: if (encp) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 14: 153: if (WebPPictureInit(&(encp->frame))) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 14: 154: enc = WebPAnimEncoderNew(width, height, &enc_options); 7: 155: if (enc) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 7: 156: encp->enc = enc; 7: 157: return (PyObject*) encp; -: 158: } #####: 159: WebPPictureFree(&(encp->frame)); call 0 never executed -: 160: } #####: 161: PyObject_Del(encp); call 0 never executed -: 162: } #####: 163: PyErr_SetString(PyExc_RuntimeError, "could not create encoder object"); call 0 never executed #####: 164: return NULL; -: 165:} -: 166: function _anim_encoder_dealloc called 7 returned 100% blocks executed 100% 7: 167:PyObject* _anim_encoder_dealloc(PyObject* self) -: 168:{ 7: 169: WebPAnimEncoderObject* encp = (WebPAnimEncoderObject*)self; 7: 170: WebPPictureFree(&(encp->frame)); call 0 returned 100% 7: 171: WebPAnimEncoderDelete(encp->enc); call 0 returned 100% 7: 172: Py_RETURN_NONE; -: 173:} -: 174: function _anim_encoder_add called 98 returned 100% blocks executed 68% 98: 175:PyObject* _anim_encoder_add(PyObject* self, PyObject* args) -: 176:{ -: 177: uint8_t* rgb; -: 178: Py_ssize_t size; -: 179: int timestamp; -: 180: int width; -: 181: int height; -: 182: char* mode; -: 183: int lossless; -: 184: float quality_factor; -: 185: int method; -: 186: WebPConfig config; 98: 187: WebPAnimEncoderObject* encp = (WebPAnimEncoderObject*)self; 98: 188: WebPAnimEncoder* enc = encp->enc; 98: 189: WebPPicture* frame = &(encp->frame); -: 190: 98: 191: if (!PyArg_ParseTuple(args, "z#iiisifi", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 192: (char**)&rgb, &size, ×tamp, &width, &height, &mode, -: 193: &lossless, &quality_factor, &method)) { -: 194: return NULL; -: 195: } -: 196: -: 197: // Check for NULL frame, which sets duration of final frame 98: 198: if (!rgb) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 7: 199: WebPAnimEncoderAdd(enc, NULL, timestamp, NULL); call 0 returned 100% 7: 200: Py_RETURN_NONE; -: 201: } -: 202: -: 203: // Setup config for this frame 91: 204: if (!WebPConfigInit(&config)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 205: PyErr_SetString(PyExc_RuntimeError, "failed to initialize config!"); call 0 never executed #####: 206: return NULL; -: 207: } 91: 208: config.lossless = lossless; 91: 209: config.quality = quality_factor; 91: 210: config.method = method; -: 211: -: 212: // Validate the config 91: 213: if (!WebPValidateConfig(&config)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 214: PyErr_SetString(PyExc_ValueError, "invalid configuration"); call 0 never executed #####: 215: return NULL; -: 216: } -: 217: -: 218: // Populate the frame with raw bytes passed to us 91: 219: frame->width = width; 91: 220: frame->height = height; 91: 221: frame->use_argb = 1; // Don't convert RGB pixels to YUV 91: 222: if (strcmp(mode, "RGBA")==0) { branch 0 taken 34% (fallthrough) branch 1 taken 66% 31: 223: WebPPictureImportRGBA(frame, rgb, 4 * width); call 0 returned 100% 60: 224: } else if (strcmp(mode, "RGBX")==0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 60: 225: WebPPictureImportRGBX(frame, rgb, 4 * width); call 0 returned 100% -: 226: } else { #####: 227: WebPPictureImportRGB(frame, rgb, 3 * width); call 0 never executed -: 228: } -: 229: -: 230: // Add the frame to the encoder 91: 231: if (!WebPAnimEncoderAdd(enc, frame, timestamp, &config)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 232: PyErr_SetString(PyExc_RuntimeError, WebPAnimEncoderGetError(enc)); call 0 never executed call 1 never executed #####: 233: return NULL; -: 234: } -: 235: 91: 236: Py_RETURN_NONE; -: 237:} -: 238: function _anim_encoder_assemble called 7 returned 100% blocks executed 73% 7: 239:PyObject* _anim_encoder_assemble(PyObject* self, PyObject* args) -: 240:{ -: 241: uint8_t* icc_bytes; -: 242: uint8_t* exif_bytes; -: 243: uint8_t* xmp_bytes; -: 244: Py_ssize_t icc_size; -: 245: Py_ssize_t exif_size; -: 246: Py_ssize_t xmp_size; -: 247: WebPData webp_data; 7: 248: WebPAnimEncoderObject* encp = (WebPAnimEncoderObject*)self; 7: 249: WebPAnimEncoder* enc = encp->enc; 7: 250: WebPMux* mux = NULL; 7: 251: PyObject* ret = NULL; -: 252: 7: 253: if (!PyArg_ParseTuple(args, "s#s#s#", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 254: &icc_bytes, &icc_size, &exif_bytes, &exif_size, &xmp_bytes, &xmp_size)) { -: 255: return NULL; -: 256: } -: 257: -: 258: // Init the output buffer 7: 259: WebPDataInit(&webp_data); -: 260: -: 261: // Assemble everything into the output buffer 7: 262: if (!WebPAnimEncoderAssemble(enc, &webp_data)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 263: PyErr_SetString(PyExc_RuntimeError, WebPAnimEncoderGetError(enc)); call 0 never executed call 1 never executed #####: 264: return NULL; -: 265: } -: 266: -: 267: // Re-mux to add metadata as needed 7: 268: if (icc_size > 0 || exif_size > 0 || xmp_size > 0) { branch 0 taken 86% (fallthrough) branch 1 taken 14% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% 1: 269: WebPMuxError err = WEBP_MUX_OK; 1: 270: int i_icc_size = (int)icc_size; 1: 271: int i_exif_size = (int)exif_size; 1: 272: int i_xmp_size = (int)xmp_size; 1: 273: WebPData icc_profile = { icc_bytes, i_icc_size }; 1: 274: WebPData exif = { exif_bytes, i_exif_size }; 1: 275: WebPData xmp = { xmp_bytes, i_xmp_size }; -: 276: 1: 277: mux = WebPMuxCreate(&webp_data, 1); 1: 278: if (mux == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 279: PyErr_SetString(PyExc_RuntimeError, "could not re-mux to add metadata"); call 0 never executed #####: 280: return NULL; -: 281: } 1: 282: WebPDataClear(&webp_data); call 0 returned 100% -: 283: -: 284: // Add ICCP chunk 1: 285: if (i_icc_size > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 286: err = WebPMuxSetChunk(mux, "ICCP", &icc_profile, 1); call 0 returned 100% 1: 287: if (err != WEBP_MUX_OK) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 288: return HandleMuxError(err, "ICCP"); call 0 never executed -: 289: } -: 290: } -: 291: -: 292: // Add EXIF chunk 1: 293: if (i_exif_size > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 294: err = WebPMuxSetChunk(mux, "EXIF", &exif, 1); call 0 returned 100% 1: 295: if (err != WEBP_MUX_OK) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 296: return HandleMuxError(err, "EXIF"); call 0 never executed -: 297: } -: 298: } -: 299: -: 300: // Add XMP chunk 1: 301: if (i_xmp_size > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 302: err = WebPMuxSetChunk(mux, "XMP ", &xmp, 1); call 0 returned 100% 1: 303: if (err != WEBP_MUX_OK) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 304: return HandleMuxError(err, "XMP"); call 0 never executed -: 305: } -: 306: } -: 307: 1: 308: err = WebPMuxAssemble(mux, &webp_data); call 0 returned 100% 1: 309: if (err != WEBP_MUX_OK) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 310: return HandleMuxError(err, NULL); call 0 never executed -: 311: } -: 312: } -: 313: -: 314: // Convert to Python bytes 7: 315: ret = PyBytes_FromStringAndSize((char*)webp_data.bytes, webp_data.size); call 0 returned 100% 7: 316: WebPDataClear(&webp_data); call 0 returned 100% -: 317: -: 318: // If we had to re-mux, we should free it now that we're done with it 7: 319: if (mux != NULL) { branch 0 taken 14% (fallthrough) branch 1 taken 86% 1: 320: WebPMuxDelete(mux); call 0 returned 100% -: 321: } -: 322: -: 323: return ret; -: 324:} -: 325: -: 326:// Decoder functions function _anim_decoder_new called 161 returned 100% blocks executed 85% 161: 327:PyObject* _anim_decoder_new(PyObject* self, PyObject* args) -: 328:{ -: 329: PyBytesObject *webp_string; -: 330: const uint8_t *webp; -: 331: Py_ssize_t size; -: 332: WebPData webp_src; -: 333: char* mode; -: 334: WebPDecoderConfig config; 161: 335: WebPAnimDecoderObject* decp = NULL; 161: 336: WebPAnimDecoder* dec = NULL; -: 337: 161: 338: if (!PyArg_ParseTuple(args, "S", &webp_string)) { call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 339: return NULL; -: 340: } 160: 341: PyBytes_AsStringAndSize((PyObject *)webp_string, (char**)&webp, &size); call 0 returned 100% 160: 342: webp_src.bytes = webp; 160: 343: webp_src.size = size; -: 344: -: 345: // Sniff the mode, since the decoder API doesn't tell us 160: 346: mode = "RGBA"; 320: 347: if (WebPGetFeatures(webp, size, &config.input) == VP8_STATUS_OK) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 160: 348: if (!config.input.has_alpha) { branch 0 taken 92% (fallthrough) branch 1 taken 8% 147: 349: mode = "RGBX"; -: 350: } -: 351: } -: 352: -: 353: // Create the decoder (default mode is RGBA, if no options passed) 160: 354: decp = PyObject_New(WebPAnimDecoderObject, &WebPAnimDecoder_Type); call 0 returned 100% 160: 355: if (decp) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 160: 356: decp->mode = mode; 160: 357: if (WebPDataCopy(&webp_src, &(decp->data))) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 320: 358: dec = WebPAnimDecoderNew(&(decp->data), NULL); 160: 359: if (dec) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 160: 360: if (WebPAnimDecoderGetInfo(dec, &(decp->info))) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 160: 361: decp->dec = dec; 160: 362: return (PyObject*)decp; -: 363: } -: 364: } -: 365: } #####: 366: PyObject_Del(decp); call 0 never executed -: 367: } #####: 368: PyErr_SetString(PyExc_RuntimeError, "could not create decoder object"); call 0 never executed #####: 369: return NULL; -: 370:} -: 371: function _anim_decoder_dealloc called 160 returned 100% blocks executed 100% 160: 372:PyObject* _anim_decoder_dealloc(PyObject* self) -: 373:{ 160: 374: WebPAnimDecoderObject* decp = (WebPAnimDecoderObject *)self; 160: 375: WebPDataClear(&(decp->data)); call 0 returned 100% 160: 376: WebPAnimDecoderDelete(decp->dec); call 0 returned 100% 160: 377: Py_RETURN_NONE; -: 378:} -: 379: function _anim_decoder_get_info called 160 returned 100% blocks executed 100% 160: 380:PyObject* _anim_decoder_get_info(PyObject* self) -: 381:{ 160: 382: WebPAnimDecoderObject* decp = (WebPAnimDecoderObject *)self; 160: 383: WebPAnimInfo* info = &(decp->info); -: 384: 160: 385: return Py_BuildValue("IIIIIs", call 0 returned 100% -: 386: info->canvas_width, info->canvas_height, -: 387: info->loop_count, -: 388: info->bgcolor, -: 389: info->frame_count, -: 390: decp->mode -: 391: ); -: 392:} -: 393: function _anim_decoder_get_chunk called 480 returned 100% blocks executed 100% 480: 394:PyObject* _anim_decoder_get_chunk(PyObject* self, PyObject* args) -: 395:{ -: 396: char* mode; 480: 397: WebPAnimDecoderObject* decp = (WebPAnimDecoderObject *)self; -: 398: const WebPDemuxer* demux; -: 399: WebPChunkIterator iter; -: 400: PyObject *ret; -: 401: 480: 402: if (!PyArg_ParseTuple(args, "s", &mode)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 403: return NULL; -: 404: } -: 405: 480: 406: demux = WebPAnimDecoderGetDemuxer(decp->dec); call 0 returned 100% 480: 407: if (!WebPDemuxGetChunk(demux, mode, 1, &iter)) { call 0 returned 100% branch 1 taken 96% (fallthrough) branch 2 taken 4% 459: 408: Py_RETURN_NONE; -: 409: } -: 410: 21: 411: ret = PyBytes_FromStringAndSize((const char*)iter.chunk.bytes, iter.chunk.size); call 0 returned 100% 21: 412: WebPDemuxReleaseChunkIterator(&iter); call 0 returned 100% -: 413: 21: 414: return ret; -: 415:} -: 416: function _anim_decoder_get_next called 209 returned 100% blocks executed 67% 209: 417:PyObject* _anim_decoder_get_next(PyObject* self) -: 418:{ -: 419: uint8_t* buf; -: 420: int timestamp; -: 421: PyObject* bytes; -: 422: PyObject* ret; 209: 423: WebPAnimDecoderObject* decp = (WebPAnimDecoderObject*)self; -: 424: 209: 425: if (!WebPAnimDecoderGetNext(decp->dec, &buf, ×tamp)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 426: PyErr_SetString(PyExc_OSError, "failed to read next frame"); call 0 never executed #####: 427: return NULL; -: 428: } -: 429: 418: 430: bytes = PyBytes_FromStringAndSize((char *)buf, call 0 returned 100% 209: 431: decp->info.canvas_width * 4 * decp->info.canvas_height); -: 432: 209: 433: ret = Py_BuildValue("Si", bytes, timestamp); call 0 returned 100% -: 434: 209: 435: Py_DECREF(bytes); branch 0 taken 0% (fallthrough) branch 1 taken 100% call 2 never executed -: 436: return ret; -: 437:} -: 438: function _anim_decoder_reset called 4 returned 100% blocks executed 100% 4: 439:PyObject* _anim_decoder_reset(PyObject* self) -: 440:{ 4: 441: WebPAnimDecoderObject* decp = (WebPAnimDecoderObject *)self; 4: 442: WebPAnimDecoderReset(decp->dec); call 0 returned 100% 4: 443: Py_RETURN_NONE; -: 444:} -: 445: -: 446:/* -------------------------------------------------------------------- */ -: 447:/* Type Definitions */ -: 448:/* -------------------------------------------------------------------- */ -: 449: -: 450:// WebPAnimEncoder methods -: 451:static struct PyMethodDef _anim_encoder_methods[] = { -: 452: {"add", (PyCFunction)_anim_encoder_add, METH_VARARGS, "add"}, -: 453: {"assemble", (PyCFunction)_anim_encoder_assemble, METH_VARARGS, "assemble"}, -: 454: {NULL, NULL} /* sentinel */ -: 455:}; -: 456: -: 457:// WebPAnimDecoder type definition -: 458:static PyTypeObject WebPAnimEncoder_Type = { -: 459: PyVarObject_HEAD_INIT(NULL, 0) -: 460: "WebPAnimEncoder", /*tp_name */ -: 461: sizeof(WebPAnimEncoderObject), /*tp_size */ -: 462: 0, /*tp_itemsize */ -: 463: /* methods */ -: 464: (destructor)_anim_encoder_dealloc, /*tp_dealloc*/ -: 465: 0, /*tp_print*/ -: 466: 0, /*tp_getattr*/ -: 467: 0, /*tp_setattr*/ -: 468: 0, /*tp_compare*/ -: 469: 0, /*tp_repr*/ -: 470: 0, /*tp_as_number */ -: 471: 0, /*tp_as_sequence */ -: 472: 0, /*tp_as_mapping */ -: 473: 0, /*tp_hash*/ -: 474: 0, /*tp_call*/ -: 475: 0, /*tp_str*/ -: 476: 0, /*tp_getattro*/ -: 477: 0, /*tp_setattro*/ -: 478: 0, /*tp_as_buffer*/ -: 479: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 480: 0, /*tp_doc*/ -: 481: 0, /*tp_traverse*/ -: 482: 0, /*tp_clear*/ -: 483: 0, /*tp_richcompare*/ -: 484: 0, /*tp_weaklistoffset*/ -: 485: 0, /*tp_iter*/ -: 486: 0, /*tp_iternext*/ -: 487: _anim_encoder_methods, /*tp_methods*/ -: 488: 0, /*tp_members*/ -: 489: 0, /*tp_getset*/ -: 490:}; -: 491: -: 492:// WebPAnimDecoder methods -: 493:static struct PyMethodDef _anim_decoder_methods[] = { -: 494: {"get_info", (PyCFunction)_anim_decoder_get_info, METH_NOARGS, "get_info"}, -: 495: {"get_chunk", (PyCFunction)_anim_decoder_get_chunk, METH_VARARGS, "get_chunk"}, -: 496: {"get_next", (PyCFunction)_anim_decoder_get_next, METH_NOARGS, "get_next"}, -: 497: {"reset", (PyCFunction)_anim_decoder_reset, METH_NOARGS, "reset"}, -: 498: {NULL, NULL} /* sentinel */ -: 499:}; -: 500: -: 501:// WebPAnimDecoder type definition -: 502:static PyTypeObject WebPAnimDecoder_Type = { -: 503: PyVarObject_HEAD_INIT(NULL, 0) -: 504: "WebPAnimDecoder", /*tp_name */ -: 505: sizeof(WebPAnimDecoderObject), /*tp_size */ -: 506: 0, /*tp_itemsize */ -: 507: /* methods */ -: 508: (destructor)_anim_decoder_dealloc, /*tp_dealloc*/ -: 509: 0, /*tp_print*/ -: 510: 0, /*tp_getattr*/ -: 511: 0, /*tp_setattr*/ -: 512: 0, /*tp_compare*/ -: 513: 0, /*tp_repr*/ -: 514: 0, /*tp_as_number */ -: 515: 0, /*tp_as_sequence */ -: 516: 0, /*tp_as_mapping */ -: 517: 0, /*tp_hash*/ -: 518: 0, /*tp_call*/ -: 519: 0, /*tp_str*/ -: 520: 0, /*tp_getattro*/ -: 521: 0, /*tp_setattro*/ -: 522: 0, /*tp_as_buffer*/ -: 523: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 524: 0, /*tp_doc*/ -: 525: 0, /*tp_traverse*/ -: 526: 0, /*tp_clear*/ -: 527: 0, /*tp_richcompare*/ -: 528: 0, /*tp_weaklistoffset*/ -: 529: 0, /*tp_iter*/ -: 530: 0, /*tp_iternext*/ -: 531: _anim_decoder_methods, /*tp_methods*/ -: 532: 0, /*tp_members*/ -: 533: 0, /*tp_getset*/ -: 534:}; -: 535: -: 536:#endif -: 537: -: 538:/* -------------------------------------------------------------------- */ -: 539:/* Legacy WebP Support */ -: 540:/* -------------------------------------------------------------------- */ -: 541: function WebPEncode_wrapper called 17 returned 100% blocks executed 73% 17: 542:PyObject* WebPEncode_wrapper(PyObject* self, PyObject* args) -: 543:{ -: 544: int width; -: 545: int height; -: 546: int lossless; -: 547: float quality_factor; -: 548: int method; -: 549: uint8_t* rgb; -: 550: uint8_t* icc_bytes; -: 551: uint8_t* exif_bytes; -: 552: uint8_t* xmp_bytes; -: 553: uint8_t* output; -: 554: char* mode; -: 555: Py_ssize_t size; -: 556: Py_ssize_t icc_size; -: 557: Py_ssize_t exif_size; -: 558: Py_ssize_t xmp_size; -: 559: size_t ret_size; -: 560: int rgba_mode; -: 561: int channels; -: 562: int ok; -: 563: ImagingSectionCookie cookie; -: 564: WebPConfig config; -: 565: WebPMemoryWriter writer; -: 566: WebPPicture pic; -: 567: 17: 568: if (!PyArg_ParseTuple(args, "y#iiifss#is#s#", call 0 returned 100% branch 1 taken 94% (fallthrough) branch 2 taken 6% -: 569: (char**)&rgb, &size, &width, &height, &lossless, &quality_factor, &mode, -: 570: &icc_bytes, &icc_size, &method, &exif_bytes, &exif_size, &xmp_bytes, &xmp_size)) { -: 571: return NULL; -: 572: } -: 573: 16: 574: rgba_mode = strcmp(mode, "RGBA") == 0; 16: 575: if (!rgba_mode && strcmp(mode, "RGB") != 0) { branch 0 taken 81% (fallthrough) branch 1 taken 19% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 0% (fallthrough) branch 9 taken 100% #####: 576: Py_RETURN_NONE; -: 577: } -: 578: 16: 579: channels = rgba_mode ? 4 : 3; branch 0 taken 81% (fallthrough) branch 1 taken 19% 16: 580: if (size < width * height * channels) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 581: Py_RETURN_NONE; -: 582: } -: 583: -: 584: // Setup config for this frame 16: 585: if (!WebPConfigInit(&config)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 586: PyErr_SetString(PyExc_RuntimeError, "failed to initialize config!"); call 0 never executed #####: 587: return NULL; -: 588: } 16: 589: config.lossless = lossless; 16: 590: config.quality = quality_factor; 16: 591: config.method = method; -: 592: -: 593: // Validate the config 16: 594: if (!WebPValidateConfig(&config)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 595: PyErr_SetString(PyExc_ValueError, "invalid configuration"); call 0 never executed #####: 596: return NULL; -: 597: } -: 598: 16: 599: if (!WebPPictureInit(&pic)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 600: PyErr_SetString(PyExc_ValueError, "could not initialise picture"); call 0 never executed #####: 601: return NULL; -: 602: } 16: 603: pic.width = width; 16: 604: pic.height = height; 16: 605: pic.use_argb = 1; // Don't convert RGB pixels to YUV -: 606: 16: 607: if (rgba_mode) { branch 0 taken 19% (fallthrough) branch 1 taken 81% 3: 608: WebPPictureImportRGBA(&pic, rgb, channels * width); call 0 returned 100% -: 609: } else { 13: 610: WebPPictureImportRGB(&pic, rgb, channels * width); call 0 returned 100% -: 611: } -: 612: 16: 613: WebPMemoryWriterInit(&writer); call 0 returned 100% 16: 614: pic.writer = WebPMemoryWrite; 16: 615: pic.custom_ptr = &writer; -: 616: 16: 617: ImagingSectionEnter(&cookie); call 0 returned 100% 16: 618: ok = WebPEncode(&config, &pic); call 0 returned 100% 16: 619: ImagingSectionLeave(&cookie); call 0 returned 100% -: 620: 16: 621: WebPPictureFree(&pic); call 0 returned 100% 16: 622: if (!ok) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 623: PyErr_SetString(PyExc_ValueError, "encoding error"); call 0 never executed #####: 624: return NULL; -: 625: } 16: 626: output = writer.mem; 16: 627: ret_size = writer.size; -: 628: -: 629:#ifndef HAVE_WEBPMUX -: 630: if (ret_size > 0) { -: 631: PyObject *ret = PyBytes_FromStringAndSize((char*)output, ret_size); -: 632: free(output); -: 633: return ret; -: 634: } -: 635:#else -: 636: { -: 637: /* I want to truncate the *_size items that get passed into WebP -: 638: data. Pypy2.1.0 had some issues where the Py_ssize_t items had -: 639: data in the upper byte. (Not sure why, it shouldn't have been there) -: 640: */ 16: 641: int i_icc_size = (int)icc_size; 16: 642: int i_exif_size = (int)exif_size; 16: 643: int i_xmp_size = (int)xmp_size; 16: 644: WebPData output_data = {0}; 16: 645: WebPData image = { output, ret_size }; 16: 646: WebPData icc_profile = { icc_bytes, i_icc_size }; 16: 647: WebPData exif = { exif_bytes, i_exif_size }; 16: 648: WebPData xmp = { xmp_bytes, i_xmp_size }; -: 649: WebPMuxError err; 16: 650: int dbg = 0; -: 651: 16: 652: int copy_data = 0; // value 1 indicates given data WILL be copied to the mux -: 653: // and value 0 indicates data will NOT be copied. -: 654: 16: 655: WebPMux* mux = WebPMuxNew(); 16: 656: WebPMuxSetImage(mux, &image, copy_data); call 0 returned 100% -: 657: -: 658: if (dbg) { -: 659: /* was getting %ld icc_size == 0, icc_size>0 was true */ -: 660: fprintf(stderr, "icc size %d, %d \n", i_icc_size, i_icc_size > 0); -: 661: } -: 662: 16: 663: if (i_icc_size > 0) { branch 0 taken 6% (fallthrough) branch 1 taken 94% -: 664: if (dbg) { -: 665: fprintf(stderr, "Adding ICC Profile\n"); -: 666: } 1: 667: err = WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data); call 0 returned 100% 1: 668: if (err != WEBP_MUX_OK) { branch 0 taken 0% (fallthrough) branch 1 taken 100% 16: 669: return HandleMuxError(err, "ICCP"); call 0 never executed -: 670: } -: 671: } -: 672: -: 673: if (dbg) { -: 674: fprintf(stderr, "exif size %d \n", i_exif_size); -: 675: } 16: 676: if (i_exif_size > 0) { branch 0 taken 19% (fallthrough) branch 1 taken 81% -: 677: if (dbg) { -: 678: fprintf(stderr, "Adding Exif Data\n"); -: 679: } 3: 680: err = WebPMuxSetChunk(mux, "EXIF", &exif, copy_data); call 0 returned 100% 3: 681: if (err != WEBP_MUX_OK) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 682: return HandleMuxError(err, "EXIF"); call 0 never executed -: 683: } -: 684: } -: 685: -: 686: if (dbg) { -: 687: fprintf(stderr, "xmp size %d \n", i_xmp_size); -: 688: } 16: 689: if (i_xmp_size > 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 690: if (dbg){ -: 691: fprintf(stderr, "Adding XMP Data\n"); -: 692: } #####: 693: err = WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data); call 0 never executed #####: 694: if (err != WEBP_MUX_OK) { branch 0 never executed branch 1 never executed #####: 695: return HandleMuxError(err, "XMP "); call 0 never executed -: 696: } -: 697: } -: 698: 16: 699: WebPMuxAssemble(mux, &output_data); call 0 returned 100% 16: 700: WebPMuxDelete(mux); call 0 returned 100% 16: 701: free(output); -: 702: 16: 703: ret_size = output_data.size; 16: 704: if (ret_size > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 16: 705: PyObject *ret = PyBytes_FromStringAndSize((char*)output_data.bytes, ret_size); call 0 returned 100% 16: 706: WebPDataClear(&output_data); call 0 returned 100% 16: 707: return ret; -: 708: } -: 709: } -: 710:#endif #####: 711: Py_RETURN_NONE; -: 712:} -: 713: function WebPDecode_wrapper called 1 returned 100% blocks executed 6% 1: 714:PyObject* WebPDecode_wrapper(PyObject* self, PyObject* args) -: 715:{ -: 716: PyBytesObject* webp_string; -: 717: const uint8_t* webp; -: 718: Py_ssize_t size; 1: 719: PyObject *ret = Py_None, *bytes = NULL, *pymode = NULL, *icc_profile = NULL, *exif = NULL; -: 720: WebPDecoderConfig config; 1: 721: VP8StatusCode vp8_status_code = VP8_STATUS_OK; 1: 722: char* mode = "RGB"; -: 723: 1: 724: if (!PyArg_ParseTuple(args, "S", &webp_string)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 725: return NULL; -: 726: } -: 727: #####: 728: if (!WebPInitDecoderConfig(&config)) { branch 0 never executed branch 1 never executed #####: 729: Py_RETURN_NONE; -: 730: } -: 731: #####: 732: PyBytes_AsStringAndSize((PyObject*) webp_string, (char**)&webp, &size); call 0 never executed -: 733: #####: 734: vp8_status_code = WebPGetFeatures(webp, size, &config.input); #####: 735: if (vp8_status_code == VP8_STATUS_OK) { branch 0 never executed branch 1 never executed -: 736: // If we don't set it, we don't get alpha. -: 737: // Initialized to MODE_RGB #####: 738: if (config.input.has_alpha) { branch 0 never executed branch 1 never executed #####: 739: config.output.colorspace = MODE_RGBA; #####: 740: mode = "RGBA"; -: 741: } -: 742: -: 743:#ifndef HAVE_WEBPMUX -: 744: vp8_status_code = WebPDecode(webp, size, &config); -: 745:#else -: 746: { #####: 747: int copy_data = 0; #####: 748: WebPData data = { webp, size }; -: 749: WebPMuxFrameInfo image; #####: 750: WebPData icc_profile_data = {0}; #####: 751: WebPData exif_data = {0}; -: 752: #####: 753: WebPMux* mux = WebPMuxCreate(&data, copy_data); #####: 754: if (NULL == mux) { branch 0 never executed branch 1 never executed -: 755: goto end; -: 756: } -: 757: #####: 758: if (WEBP_MUX_OK != WebPMuxGetFrame(mux, 1, &image)) call 0 never executed branch 1 never executed branch 2 never executed -: 759: { #####: 760: WebPMuxDelete(mux); call 0 never executed #####: 761: goto end; -: 762: } -: 763: #####: 764: webp = image.bitstream.bytes; #####: 765: size = image.bitstream.size; -: 766: #####: 767: vp8_status_code = WebPDecode(webp, size, &config); call 0 never executed -: 768: #####: 769: if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "ICCP", &icc_profile_data)) { call 0 never executed branch 1 never executed branch 2 never executed #####: 770: icc_profile = PyBytes_FromStringAndSize((const char*)icc_profile_data.bytes, icc_profile_data.size); call 0 never executed -: 771: } -: 772: #####: 773: if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "EXIF", &exif_data)) { call 0 never executed branch 1 never executed branch 2 never executed #####: 774: exif = PyBytes_FromStringAndSize((const char*)exif_data.bytes, exif_data.size); call 0 never executed -: 775: } -: 776: #####: 777: WebPDataClear(&image.bitstream); call 0 never executed #####: 778: WebPMuxDelete(mux); call 0 never executed -: 779: } -: 780:#endif -: 781: } -: 782: #####: 783: if (vp8_status_code != VP8_STATUS_OK) { branch 0 never executed branch 1 never executed -: 784: goto end; -: 785: } -: 786: #####: 787: if (config.output.colorspace < MODE_YUV) { branch 0 never executed branch 1 never executed #####: 788: bytes = PyBytes_FromStringAndSize((char*)config.output.u.RGBA.rgba, call 0 never executed #####: 789: config.output.u.RGBA.size); -: 790: } else { -: 791: // Skipping YUV for now. Need Test Images. -: 792: // UNDONE -- unclear if we'll ever get here if we set mode_rgb* #####: 793: bytes = PyBytes_FromStringAndSize((char*)config.output.u.YUVA.y, call 0 never executed #####: 794: config.output.u.YUVA.y_size); -: 795: } -: 796: #####: 797: pymode = PyUnicode_FromString(mode); call 0 never executed #####: 798: ret = Py_BuildValue("SiiSSS", bytes, config.output.width, branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed call 4 never executed -: 799: config.output.height, pymode, -: 800: NULL == icc_profile ? Py_None : icc_profile, -: 801: NULL == exif ? Py_None : exif); -: 802: -: 803:end: #####: 804: WebPFreeDecBuffer(&config.output); call 0 never executed -: 805: #####: 806: Py_XDECREF(bytes); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed call 4 never executed #####: 807: Py_XDECREF(pymode); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed call 4 never executed #####: 808: Py_XDECREF(icc_profile); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed call 4 never executed #####: 809: Py_XDECREF(exif); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed call 4 never executed -: 810: #####: 811: if (Py_None == ret) { branch 0 never executed branch 1 never executed #####: 812: Py_RETURN_NONE; -: 813: } -: 814: -: 815: return ret; -: 816:} -: 817: -: 818:// Return the decoder's version number, packed in hexadecimal using 8bits for -: 819:// each of major/minor/revision. E.g: v2.5.7 is 0x020507. function WebPDecoderVersion_wrapper called 3 returned 100% blocks executed 100% 3: 820:PyObject* WebPDecoderVersion_wrapper() { 3: 821: return Py_BuildValue("i", WebPGetDecoderVersion()); call 0 returned 100% call 1 returned 100% -: 822:} -: 823: -: 824:// Version as string -: 825:const char* function WebPDecoderVersion_str called 3 returned 100% blocks executed 100% 3: 826:WebPDecoderVersion_str(void) -: 827:{ -: 828: static char version[20]; 3: 829: int version_number = WebPGetDecoderVersion(); call 0 returned 100% 6: 830: sprintf(version, "%d.%d.%d", version_number >> 16, (version_number >> 8) % 0x100, version_number % 0x100); 3: 831: return version; -: 832:} -: 833: -: 834:/* -: 835: * The version of webp that ships with (0.1.3) Ubuntu 12.04 doesn't handle alpha well. -: 836: * Files that are valid with 0.3 are reported as being invalid. -: 837: */ function WebPDecoderBuggyAlpha called 7 returned 100% blocks executed 100% 7: 838:int WebPDecoderBuggyAlpha(void) { 7: 839: return WebPGetDecoderVersion()==0x0103; call 0 returned 100% -: 840:} -: 841: function WebPDecoderBuggyAlpha_wrapper called 4 returned 100% blocks executed 100% 4: 842:PyObject* WebPDecoderBuggyAlpha_wrapper() { 4: 843: return Py_BuildValue("i", WebPDecoderBuggyAlpha()); call 0 returned 100% call 1 returned 100% -: 844:} -: 845: -: 846:/* -------------------------------------------------------------------- */ -: 847:/* Module Setup */ -: 848:/* -------------------------------------------------------------------- */ -: 849: -: 850:static PyMethodDef webpMethods[] = -: 851:{ -: 852:#ifdef HAVE_WEBPANIM -: 853: {"WebPAnimDecoder", _anim_decoder_new, METH_VARARGS, "WebPAnimDecoder"}, -: 854: {"WebPAnimEncoder", _anim_encoder_new, METH_VARARGS, "WebPAnimEncoder"}, -: 855:#endif -: 856: {"WebPEncode", WebPEncode_wrapper, METH_VARARGS, "WebPEncode"}, -: 857: {"WebPDecode", WebPDecode_wrapper, METH_VARARGS, "WebPDecode"}, -: 858: {"WebPDecoderVersion", WebPDecoderVersion_wrapper, METH_NOARGS, "WebPVersion"}, -: 859: {"WebPDecoderBuggyAlpha", WebPDecoderBuggyAlpha_wrapper, METH_NOARGS, "WebPDecoderBuggyAlpha"}, -: 860: {NULL, NULL} -: 861:}; -: 862: function addMuxFlagToModule called 3 returned 100% blocks executed 100% 3: 863:void addMuxFlagToModule(PyObject* m) { -: 864:#ifdef HAVE_WEBPMUX 3: 865: PyModule_AddObject(m, "HAVE_WEBPMUX", Py_True); call 0 returned 100% -: 866:#else -: 867: PyModule_AddObject(m, "HAVE_WEBPMUX", Py_False); -: 868:#endif 3: 869:} -: 870: function addAnimFlagToModule called 3 returned 100% blocks executed 100% 3: 871:void addAnimFlagToModule(PyObject* m) { -: 872:#ifdef HAVE_WEBPANIM 3: 873: PyModule_AddObject(m, "HAVE_WEBPANIM", Py_True); call 0 returned 100% -: 874:#else -: 875: PyModule_AddObject(m, "HAVE_WEBPANIM", Py_False); -: 876:#endif 3: 877:} -: 878: function addTransparencyFlagToModule called 3 returned 100% blocks executed 100% 3: 879:void addTransparencyFlagToModule(PyObject* m) { 3: 880: PyModule_AddObject(m, "HAVE_TRANSPARENCY", call 0 returned 100% call 1 returned 100% 3: 881: PyBool_FromLong(!WebPDecoderBuggyAlpha())); call 0 returned 100% 3: 882:} -: 883: function setup_module called 3 returned 100% blocks executed 92% 3: 884:static int setup_module(PyObject* m) { 3: 885: PyObject* d = PyModule_GetDict(m); call 0 returned 100% 3: 886: addMuxFlagToModule(m); call 0 returned 100% 3: 887: addAnimFlagToModule(m); call 0 returned 100% 3: 888: addTransparencyFlagToModule(m); call 0 returned 100% -: 889: 3: 890: PyDict_SetItemString(d, "webpdecoder_version", PyUnicode_FromString(WebPDecoderVersion_str())); call 0 returned 100% call 1 returned 100% call 2 returned 100% -: 891: -: 892:#ifdef HAVE_WEBPANIM -: 893: /* Ready object types */ 6: 894: if (PyType_Ready(&WebPAnimDecoder_Type) < 0 || call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 0% (fallthrough) branch 4 taken 100% 3: 895: PyType_Ready(&WebPAnimEncoder_Type) < 0) { call 0 returned 100% -: 896: return -1; -: 897: } -: 898:#endif -: 899: return 0; -: 900:} -: 901: -: 902:PyMODINIT_FUNC function PyInit__webp called 3 returned 100% blocks executed 100% 3: 903:PyInit__webp(void) { -: 904: PyObject* m; -: 905: -: 906: static PyModuleDef module_def = { -: 907: PyModuleDef_HEAD_INIT, -: 908: "_webp", /* m_name */ -: 909: NULL, /* m_doc */ -: 910: -1, /* m_size */ -: 911: webpMethods, /* m_methods */ -: 912: }; -: 913: 3: 914: m = PyModule_Create(&module_def); call 0 returned 100% 3: 915: if (setup_module(m) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 916: return NULL; -: 917: } -: 918: 3: 919: return m; -: 920:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#XbmEncode.c.gcov -: 0:Source:src/libImaging/XbmEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/XbmEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/XbmEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * encoder for Xbm data -: 6: * -: 7: * history: -: 8: * 96-11-01 fl created -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1996. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19: -: 20:int function ImagingXbmEncode called 13 returned 100% blocks executed 96% 13: 21:ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 22:{ 13: 23: const char *hex = "0123456789abcdef"; -: 24: 13: 25: UINT8* ptr = buf; -: 26: int i, n; -: 27: 13: 28: if (!state->state) { branch 0 taken 31% (fallthrough) branch 1 taken 69% -: 29: -: 30: /* 8 pixels are stored in no more than 6 bytes */ 4: 31: state->bytes = 6*(state->xsize+7)/8; -: 32: 4: 33: state->state = 1; -: 34: -: 35: } -: 36: 13: 37: if (bytes < state->bytes) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 38: state->errcode = IMAGING_CODEC_MEMORY; #####: 39: return 0; -: 40: } -: 41: -: 42: ptr = buf; -: 43: 1393: 44: while (bytes >= state->bytes) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 45: 2768: 46: state->shuffle(state->buffer, call 0 returned 100% 1384: 47: (UINT8*) im->image[state->y + state->yoff] + 1384: 48: state->xoff * im->pixelsize, state->xsize); -: 49: 1384: 50: if (state->y < state->ysize-1) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 51: -: 52: /* any line but the last */ 130971: 53: for (n = 0; n < state->xsize; n += 8) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 54: 130971: 55: i = state->buffer[n/8]; -: 56: 130971: 57: *ptr++ = '0'; 130971: 58: *ptr++ = 'x'; 130971: 59: *ptr++ = hex[(i>>4)&15]; 130971: 60: *ptr++ = hex[i&15]; 130971: 61: *ptr++ = ','; 130971: 62: bytes -= 5; -: 63: 130971: 64: if (++state->count >= 79/5) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 8730: 65: *ptr++ = '\n'; 8730: 66: bytes--; 8730: 67: state->count = 0; -: 68: } -: 69: -: 70: } -: 71: 1380: 72: state->y++; -: 73: -: 74: } else { -: 75: -: 76: /* last line */ 173: 77: for (n = 0; n < state->xsize; n += 8) { branch 0 taken 98% branch 1 taken 2% (fallthrough) -: 78: 173: 79: i = state->buffer[n/8]; -: 80: 173: 81: *ptr++ = '0'; 173: 82: *ptr++ = 'x'; 173: 83: *ptr++ = hex[(i>>4)&15]; 173: 84: *ptr++ = hex[i&15]; -: 85: 173: 86: if (n < state->xsize-8) { branch 0 taken 98% (fallthrough) branch 1 taken 2% 169: 87: *ptr++ = ','; 169: 88: if (++state->count >= 79/5) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 11: 89: *ptr++ = '\n'; 11: 90: bytes--; 11: 91: state->count = 0; -: 92: } -: 93: } else { 4: 94: *ptr++ = '\n'; -: 95: } -: 96: 173: 97: bytes -= 5; -: 98: -: 99: } -: 100: 4: 101: state->errcode = IMAGING_CODEC_END; 4: 102: break; -: 103: } -: 104: } -: 105: 13: 106: return ptr - buf; -: 107:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Copy.c.gcov -: 0:Source:src/libImaging/Copy.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Copy.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Copy.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * copy image -: 6: * -: 7: * history: -: 8: * 95-11-26 fl Moved from Imaging.c -: 9: * 97-05-12 fl Added ImagingCopy2 -: 10: * 97-08-28 fl Allow imOut == NULL in ImagingCopy2 -: 11: * -: 12: * Copyright (c) Fredrik Lundh 1995-97. -: 13: * Copyright (c) Secret Labs AB 1997. -: 14: * -: 15: * See the README file for details on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21: -: 22:static Imaging function _copy called 2788 returned 100% blocks executed 80% 2788: 23:_copy(Imaging imOut, Imaging imIn) -: 24:{ -: 25: ImagingSectionCookie cookie; -: 26: int y; -: 27: 2788: 28: if (!imIn) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 29: return (Imaging) ImagingError_ValueError(NULL); call 0 never executed -: 30: } -: 31: 2788: 32: imOut = ImagingNew2Dirty(imIn->mode, imOut, imIn); call 0 returned 100% 2788: 33: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 34: return NULL; -: 35: } -: 36: 2788: 37: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 38: 2788: 39: ImagingSectionEnter(&cookie); call 0 returned 100% 2788: 40: if (imIn->block != NULL && imOut->block != NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed #####: 41: memcpy(imOut->block, imIn->block, imIn->ysize * imIn->linesize); -: 42: } else { 420544: 43: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 841088: 44: memcpy(imOut->image[y], imIn->image[y], imIn->linesize); -: 45: } -: 46: } 2788: 47: ImagingSectionLeave(&cookie); call 0 returned 100% -: 48: 2788: 49: return imOut; -: 50:} -: 51: -: 52:Imaging function ImagingCopy called 2576 returned 100% blocks executed 100% 2576: 53:ImagingCopy(Imaging imIn) -: 54:{ 2576: 55: return _copy(NULL, imIn); call 0 returned 100% -: 56:} -: 57: -: 58:Imaging function ImagingCopy2 called 212 returned 100% blocks executed 100% 212: 59:ImagingCopy2(Imaging imOut, Imaging imIn) -: 60:{ 212: 61: return _copy(imOut, imIn); call 0 returned 100% -: 62:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#PackDecode.c.gcov -: 0:Source:src/libImaging/PackDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/PackDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/PackDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for PackBits image data. -: 6: * -: 7: * history: -: 8: * 96-04-19 fl Created -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1996. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19:int function ImagingPackbitsDecode called 21 returned 100% blocks executed 84% 21: 20:ImagingPackbitsDecode(Imaging im, ImagingCodecState state, -: 21: UINT8* buf, Py_ssize_t bytes) -: 22:{ -: 23: UINT8 n; -: 24: UINT8* ptr; -: 25: int i; -: 26: 21: 27: ptr = buf; -: 28: -: 29: for (;;) { -: 30: 24288: 31: if (bytes < 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 32: return ptr - buf; -: 33: } -: 34: 24288: 35: if (ptr[0] & 0x80) { branch 0 taken 59% (fallthrough) branch 1 taken 41% -: 36: 14438: 37: if (ptr[0] == 0x80) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 38: /* Nop */ #####: 39: ptr++; bytes--; #####: 40: continue; -: 41: } -: 42: -: 43: /* Run */ 14438: 44: if (bytes < 2) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 45: return ptr - buf; -: 46: } -: 47: 80260: 48: for (n = 257 - ptr[0]; n > 0; n--) { branch 0 taken 82% branch 1 taken 18% (fallthrough) 65822: 49: if (state->x >= state->bytes) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 50: /* state->errcode = IMAGING_CODEC_OVERRUN; */ -: 51: break; -: 52: } 65822: 53: state->buffer[state->x++] = ptr[1]; -: 54: } -: 55: 14438: 56: ptr += 2; bytes -= 2; -: 57: -: 58: } else { -: 59: -: 60: /* Literal */ 9850: 61: n = ptr[0]+2; -: 62: 9850: 63: if (bytes < n) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 64: return ptr - buf; -: 65: } -: 66: 278242: 67: for (i = 1; i < n; i++) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 278242: 68: if (state->x >= state->bytes) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 69: /* state->errcode = IMAGING_CODEC_OVERRUN; */ -: 70: break; -: 71: } 278242: 72: state->buffer[state->x++] = ptr[i]; -: 73: } -: 74: 9850: 75: ptr += n; bytes -= n; -: 76: -: 77: } -: 78: 24288: 79: if (state->x >= state->bytes) { branch 0 taken 89% branch 1 taken 11% (fallthrough) -: 80: -: 81: /* Got a full line, unpack it */ 8064: 82: state->shuffle((UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 5376: 83: state->xoff * im->pixelsize, state->buffer, -: 84: state->xsize); -: 85: 2688: 86: state->x = 0; -: 87: 2688: 88: if (++state->y >= state->ysize) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 89: /* End of file (errcode = 0) */ -: 90: return -1; -: 91: } -: 92: } -: 93: -: 94: } -: 95:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/#usr#include#webp#demux.h.gcov -: 0:Source:/usr/include/webp/demux.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:// Copyright 2012 Google Inc. All Rights Reserved. -: 2:// -: 3:// Use of this source code is governed by a BSD-style license -: 4:// that can be found in the COPYING file in the root of the source -: 5:// tree. An additional intellectual property rights grant can be found -: 6:// in the file PATENTS. All contributing project authors may -: 7:// be found in the AUTHORS file in the root of the source tree. -: 8:// ----------------------------------------------------------------------------- -: 9:// -: 10:// Demux API. -: 11:// Enables extraction of image and extended format data from WebP files. -: 12: -: 13:// Code Example: Demuxing WebP data to extract all the frames, ICC profile -: 14:// and EXIF/XMP metadata. -: 15:/* -: 16: WebPDemuxer* demux = WebPDemux(&webp_data); -: 17: -: 18: uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH); -: 19: uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT); -: 20: // ... (Get information about the features present in the WebP file). -: 21: uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS); -: 22: -: 23: // ... (Iterate over all frames). -: 24: WebPIterator iter; -: 25: if (WebPDemuxGetFrame(demux, 1, &iter)) { -: 26: do { -: 27: // ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(), -: 28: // ... and get other frame properties like width, height, offsets etc. -: 29: // ... see 'struct WebPIterator' below for more info). -: 30: } while (WebPDemuxNextFrame(&iter)); -: 31: WebPDemuxReleaseIterator(&iter); -: 32: } -: 33: -: 34: // ... (Extract metadata). -: 35: WebPChunkIterator chunk_iter; -: 36: if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter); -: 37: // ... (Consume the ICC profile in 'chunk_iter.chunk'). -: 38: WebPDemuxReleaseChunkIterator(&chunk_iter); -: 39: if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter); -: 40: // ... (Consume the EXIF metadata in 'chunk_iter.chunk'). -: 41: WebPDemuxReleaseChunkIterator(&chunk_iter); -: 42: if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter); -: 43: // ... (Consume the XMP metadata in 'chunk_iter.chunk'). -: 44: WebPDemuxReleaseChunkIterator(&chunk_iter); -: 45: WebPDemuxDelete(demux); -: 46:*/ -: 47: -: 48:#ifndef WEBP_WEBP_DEMUX_H_ -: 49:#define WEBP_WEBP_DEMUX_H_ -: 50: -: 51:#include "./decode.h" // for WEBP_CSP_MODE -: 52:#include "./mux_types.h" -: 53: -: 54:#ifdef __cplusplus -: 55:extern "C" { -: 56:#endif -: 57: -: 58:#define WEBP_DEMUX_ABI_VERSION 0x0107 // MAJOR(8b) + MINOR(8b) -: 59: -: 60:// Note: forward declaring enumerations is not allowed in (strict) C and C++, -: 61:// the types are left here for reference. -: 62:// typedef enum WebPDemuxState WebPDemuxState; -: 63:// typedef enum WebPFormatFeature WebPFormatFeature; -: 64:typedef struct WebPDemuxer WebPDemuxer; -: 65:typedef struct WebPIterator WebPIterator; -: 66:typedef struct WebPChunkIterator WebPChunkIterator; -: 67:typedef struct WebPAnimInfo WebPAnimInfo; -: 68:typedef struct WebPAnimDecoderOptions WebPAnimDecoderOptions; -: 69: -: 70://------------------------------------------------------------------------------ -: 71: -: 72:// Returns the version number of the demux library, packed in hexadecimal using -: 73:// 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507. -: 74:WEBP_EXTERN int WebPGetDemuxVersion(void); -: 75: -: 76://------------------------------------------------------------------------------ -: 77:// Life of a Demux object -: 78: -: 79:typedef enum WebPDemuxState { -: 80: WEBP_DEMUX_PARSE_ERROR = -1, // An error occurred while parsing. -: 81: WEBP_DEMUX_PARSING_HEADER = 0, // Not enough data to parse full header. -: 82: WEBP_DEMUX_PARSED_HEADER = 1, // Header parsing complete, -: 83: // data may be available. -: 84: WEBP_DEMUX_DONE = 2 // Entire file has been parsed. -: 85:} WebPDemuxState; -: 86: -: 87:// Internal, version-checked, entry point -: 88:WEBP_EXTERN WebPDemuxer* WebPDemuxInternal( -: 89: const WebPData*, int, WebPDemuxState*, int); -: 90: -: 91:// Parses the full WebP file given by 'data'. For single images the WebP file -: 92:// header alone or the file header and the chunk header may be absent. -: 93:// Returns a WebPDemuxer object on successful parse, NULL otherwise. -: 94:static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) { -: 95: return WebPDemuxInternal(data, 0, NULL, WEBP_DEMUX_ABI_VERSION); -: 96:} -: 97: -: 98:// Parses the possibly incomplete WebP file given by 'data'. -: 99:// If 'state' is non-NULL it will be set to indicate the status of the demuxer. -: 100:// Returns NULL in case of error or if there isn't enough data to start parsing; -: 101:// and a WebPDemuxer object on successful parse. -: 102:// Note that WebPDemuxer keeps internal pointers to 'data' memory segment. -: 103:// If this data is volatile, the demuxer object should be deleted (by calling -: 104:// WebPDemuxDelete()) and WebPDemuxPartial() called again on the new data. -: 105:// This is usually an inexpensive operation. -: 106:static WEBP_INLINE WebPDemuxer* WebPDemuxPartial( -: 107: const WebPData* data, WebPDemuxState* state) { -: 108: return WebPDemuxInternal(data, 1, state, WEBP_DEMUX_ABI_VERSION); -: 109:} -: 110: -: 111:// Frees memory associated with 'dmux'. -: 112:WEBP_EXTERN void WebPDemuxDelete(WebPDemuxer* dmux); -: 113: -: 114://------------------------------------------------------------------------------ -: 115:// Data/information extraction. -: 116: -: 117:typedef enum WebPFormatFeature { -: 118: WEBP_FF_FORMAT_FLAGS, // bit-wise combination of WebPFeatureFlags -: 119: // corresponding to the 'VP8X' chunk (if present). -: 120: WEBP_FF_CANVAS_WIDTH, -: 121: WEBP_FF_CANVAS_HEIGHT, -: 122: WEBP_FF_LOOP_COUNT, // only relevant for animated file -: 123: WEBP_FF_BACKGROUND_COLOR, // idem. -: 124: WEBP_FF_FRAME_COUNT // Number of frames present in the demux object. -: 125: // In case of a partial demux, this is the number -: 126: // of frames seen so far, with the last frame -: 127: // possibly being partial. -: 128:} WebPFormatFeature; -: 129: -: 130:// Get the 'feature' value from the 'dmux'. -: 131:// NOTE: values are only valid if WebPDemux() was used or WebPDemuxPartial() -: 132:// returned a state > WEBP_DEMUX_PARSING_HEADER. -: 133:// If 'feature' is WEBP_FF_FORMAT_FLAGS, the returned value is a bit-wise -: 134:// combination of WebPFeatureFlags values. -: 135:// If 'feature' is WEBP_FF_LOOP_COUNT, WEBP_FF_BACKGROUND_COLOR, the returned -: 136:// value is only meaningful if the bitstream is animated. -: 137:WEBP_EXTERN uint32_t WebPDemuxGetI( -: 138: const WebPDemuxer* dmux, WebPFormatFeature feature); -: 139: -: 140://------------------------------------------------------------------------------ -: 141:// Frame iteration. -: 142: -: 143:struct WebPIterator { -: 144: int frame_num; -: 145: int num_frames; // equivalent to WEBP_FF_FRAME_COUNT. -: 146: int x_offset, y_offset; // offset relative to the canvas. -: 147: int width, height; // dimensions of this frame. -: 148: int duration; // display duration in milliseconds. -: 149: WebPMuxAnimDispose dispose_method; // dispose method for the frame. -: 150: int complete; // true if 'fragment' contains a full frame. partial images -: 151: // may still be decoded with the WebP incremental decoder. -: 152: WebPData fragment; // The frame given by 'frame_num'. Note for historical -: 153: // reasons this is called a fragment. -: 154: int has_alpha; // True if the frame contains transparency. -: 155: WebPMuxAnimBlend blend_method; // Blend operation for the frame. -: 156: -: 157: uint32_t pad[2]; // padding for later use. -: 158: void* private_; // for internal use only. -: 159:}; -: 160: -: 161:// Retrieves frame 'frame_number' from 'dmux'. -: 162:// 'iter->fragment' points to the frame on return from this function. -: 163:// Setting 'frame_number' equal to 0 will return the last frame of the image. -: 164:// Returns false if 'dmux' is NULL or frame 'frame_number' is not present. -: 165:// Call WebPDemuxReleaseIterator() when use of the iterator is complete. -: 166:// NOTE: 'dmux' must persist for the lifetime of 'iter'. -: 167:WEBP_EXTERN int WebPDemuxGetFrame( -: 168: const WebPDemuxer* dmux, int frame_number, WebPIterator* iter); -: 169: -: 170:// Sets 'iter->fragment' to point to the next ('iter->frame_num' + 1) or -: 171:// previous ('iter->frame_num' - 1) frame. These functions do not loop. -: 172:// Returns true on success, false otherwise. -: 173:WEBP_EXTERN int WebPDemuxNextFrame(WebPIterator* iter); -: 174:WEBP_EXTERN int WebPDemuxPrevFrame(WebPIterator* iter); -: 175: -: 176:// Releases any memory associated with 'iter'. -: 177:// Must be called before any subsequent calls to WebPDemuxGetChunk() on the same -: 178:// iter. Also, must be called before destroying the associated WebPDemuxer with -: 179:// WebPDemuxDelete(). -: 180:WEBP_EXTERN void WebPDemuxReleaseIterator(WebPIterator* iter); -: 181: -: 182://------------------------------------------------------------------------------ -: 183:// Chunk iteration. -: 184: -: 185:struct WebPChunkIterator { -: 186: // The current and total number of chunks with the fourcc given to -: 187: // WebPDemuxGetChunk(). -: 188: int chunk_num; -: 189: int num_chunks; -: 190: WebPData chunk; // The payload of the chunk. -: 191: -: 192: uint32_t pad[6]; // padding for later use -: 193: void* private_; -: 194:}; -: 195: -: 196:// Retrieves the 'chunk_number' instance of the chunk with id 'fourcc' from -: 197:// 'dmux'. -: 198:// 'fourcc' is a character array containing the fourcc of the chunk to return, -: 199:// e.g., "ICCP", "XMP ", "EXIF", etc. -: 200:// Setting 'chunk_number' equal to 0 will return the last chunk in a set. -: 201:// Returns true if the chunk is found, false otherwise. Image related chunk -: 202:// payloads are accessed through WebPDemuxGetFrame() and related functions. -: 203:// Call WebPDemuxReleaseChunkIterator() when use of the iterator is complete. -: 204:// NOTE: 'dmux' must persist for the lifetime of the iterator. -: 205:WEBP_EXTERN int WebPDemuxGetChunk(const WebPDemuxer* dmux, -: 206: const char fourcc[4], int chunk_number, -: 207: WebPChunkIterator* iter); -: 208: -: 209:// Sets 'iter->chunk' to point to the next ('iter->chunk_num' + 1) or previous -: 210:// ('iter->chunk_num' - 1) chunk. These functions do not loop. -: 211:// Returns true on success, false otherwise. -: 212:WEBP_EXTERN int WebPDemuxNextChunk(WebPChunkIterator* iter); -: 213:WEBP_EXTERN int WebPDemuxPrevChunk(WebPChunkIterator* iter); -: 214: -: 215:// Releases any memory associated with 'iter'. -: 216:// Must be called before destroying the associated WebPDemuxer with -: 217:// WebPDemuxDelete(). -: 218:WEBP_EXTERN void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter); -: 219: -: 220://------------------------------------------------------------------------------ -: 221:// WebPAnimDecoder API -: 222:// -: 223:// This API allows decoding (possibly) animated WebP images. -: 224:// -: 225:// Code Example: -: 226:/* -: 227: WebPAnimDecoderOptions dec_options; -: 228: WebPAnimDecoderOptionsInit(&dec_options); -: 229: // Tune 'dec_options' as needed. -: 230: WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options); -: 231: WebPAnimInfo anim_info; -: 232: WebPAnimDecoderGetInfo(dec, &anim_info); -: 233: for (uint32_t i = 0; i < anim_info.loop_count; ++i) { -: 234: while (WebPAnimDecoderHasMoreFrames(dec)) { -: 235: uint8_t* buf; -: 236: int timestamp; -: 237: WebPAnimDecoderGetNext(dec, &buf, ×tamp); -: 238: // ... (Render 'buf' based on 'timestamp'). -: 239: // ... (Do NOT free 'buf', as it is owned by 'dec'). -: 240: } -: 241: WebPAnimDecoderReset(dec); -: 242: } -: 243: const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec); -: 244: // ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data). -: 245: WebPAnimDecoderDelete(dec); -: 246:*/ -: 247: -: 248:typedef struct WebPAnimDecoder WebPAnimDecoder; // Main opaque object. -: 249: -: 250:// Global options. -: 251:struct WebPAnimDecoderOptions { -: 252: // Output colorspace. Only the following modes are supported: -: 253: // MODE_RGBA, MODE_BGRA, MODE_rgbA and MODE_bgrA. -: 254: WEBP_CSP_MODE color_mode; -: 255: int use_threads; // If true, use multi-threaded decoding. -: 256: uint32_t padding[7]; // Padding for later use. -: 257:}; -: 258: -: 259:// Internal, version-checked, entry point. -: 260:WEBP_EXTERN int WebPAnimDecoderOptionsInitInternal( -: 261: WebPAnimDecoderOptions*, int); -: 262: -: 263:// Should always be called, to initialize a fresh WebPAnimDecoderOptions -: 264:// structure before modification. Returns false in case of version mismatch. -: 265:// WebPAnimDecoderOptionsInit() must have succeeded before using the -: 266:// 'dec_options' object. -: 267:static WEBP_INLINE int WebPAnimDecoderOptionsInit( -: 268: WebPAnimDecoderOptions* dec_options) { -: 269: return WebPAnimDecoderOptionsInitInternal(dec_options, -: 270: WEBP_DEMUX_ABI_VERSION); -: 271:} -: 272: -: 273:// Internal, version-checked, entry point. -: 274:WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal( -: 275: const WebPData*, const WebPAnimDecoderOptions*, int); -: 276: -: 277:// Creates and initializes a WebPAnimDecoder object. -: 278:// Parameters: -: 279:// webp_data - (in) WebP bitstream. This should remain unchanged during the -: 280:// lifetime of the output WebPAnimDecoder object. -: 281:// dec_options - (in) decoding options. Can be passed NULL to choose -: 282:// reasonable defaults (in particular, color mode MODE_RGBA -: 283:// will be picked). -: 284:// Returns: -: 285:// A pointer to the newly created WebPAnimDecoder object, or NULL in case of -: 286:// parsing error, invalid option or memory error. -: 287:static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew( -: 288: const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options) { 160: 289: return WebPAnimDecoderNewInternal(webp_data, dec_options, call 0 returned 100% -: 290: WEBP_DEMUX_ABI_VERSION); -: 291:} -: 292: -: 293:// Global information about the animation.. -: 294:struct WebPAnimInfo { -: 295: uint32_t canvas_width; -: 296: uint32_t canvas_height; -: 297: uint32_t loop_count; -: 298: uint32_t bgcolor; -: 299: uint32_t frame_count; -: 300: uint32_t pad[4]; // padding for later use -: 301:}; -: 302: -: 303:// Get global information about the animation. -: 304:// Parameters: -: 305:// dec - (in) decoder instance to get information from. -: 306:// info - (out) global information fetched from the animation. -: 307:// Returns: -: 308:// True on success. -: 309:WEBP_EXTERN int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec, -: 310: WebPAnimInfo* info); -: 311: -: 312:// Fetch the next frame from 'dec' based on options supplied to -: 313:// WebPAnimDecoderNew(). This will be a fully reconstructed canvas of size -: 314:// 'canvas_width * 4 * canvas_height', and not just the frame sub-rectangle. The -: 315:// returned buffer 'buf' is valid only until the next call to -: 316:// WebPAnimDecoderGetNext(), WebPAnimDecoderReset() or WebPAnimDecoderDelete(). -: 317:// Parameters: -: 318:// dec - (in/out) decoder instance from which the next frame is to be fetched. -: 319:// buf - (out) decoded frame. -: 320:// timestamp - (out) timestamp of the frame in milliseconds. -: 321:// Returns: -: 322:// False if any of the arguments are NULL, or if there is a parsing or -: 323:// decoding error, or if there are no more frames. Otherwise, returns true. -: 324:WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec, -: 325: uint8_t** buf, int* timestamp); -: 326: -: 327:// Check if there are more frames left to decode. -: 328:// Parameters: -: 329:// dec - (in) decoder instance to be checked. -: 330:// Returns: -: 331:// True if 'dec' is not NULL and some frames are yet to be decoded. -: 332:// Otherwise, returns false. -: 333:WEBP_EXTERN int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec); -: 334: -: 335:// Resets the WebPAnimDecoder object, so that next call to -: 336:// WebPAnimDecoderGetNext() will restart decoding from 1st frame. This would be -: 337:// helpful when all frames need to be decoded multiple times (e.g. -: 338:// info.loop_count times) without destroying and recreating the 'dec' object. -: 339:// Parameters: -: 340:// dec - (in/out) decoder instance to be reset -: 341:WEBP_EXTERN void WebPAnimDecoderReset(WebPAnimDecoder* dec); -: 342: -: 343:// Grab the internal demuxer object. -: 344:// Getting the demuxer object can be useful if one wants to use operations only -: 345:// available through demuxer; e.g. to get XMP/EXIF/ICC metadata. The returned -: 346:// demuxer object is owned by 'dec' and is valid only until the next call to -: 347:// WebPAnimDecoderDelete(). -: 348:// -: 349:// Parameters: -: 350:// dec - (in) decoder instance from which the demuxer object is to be fetched. -: 351:WEBP_EXTERN const WebPDemuxer* WebPAnimDecoderGetDemuxer( -: 352: const WebPAnimDecoder* dec); -: 353: -: 354:// Deletes the WebPAnimDecoder object. -: 355:// Parameters: -: 356:// dec - (in/out) decoder instance to be deleted -: 357:WEBP_EXTERN void WebPAnimDecoderDelete(WebPAnimDecoder* dec); -: 358: -: 359:#ifdef __cplusplus -: 360:} // extern "C" -: 361:#endif -: 362: -: 363:#endif // WEBP_WEBP_DEMUX_H_ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ColorLUT.c.gcov -: 0:Source:src/libImaging/ColorLUT.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ColorLUT.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ColorLUT.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:#include "Imaging.h" -: 2:#include -: 3: -: 4: -: 5:/* 8 bits for result. Table can overflow [0, 1.0] range, -: 6: so we need extra bits for overflow and negative values. -: 7: NOTE: This value should be the same as in _imaging/_prepare_lut_table() */ -: 8:#define PRECISION_BITS (16 - 8 - 2) -: 9:#define PRECISION_ROUNDING (1<<(PRECISION_BITS-1)) -: 10: -: 11:/* 8 — scales are multiplied on byte. -: 12: 6 — max index in the table -: 13: (max size is 65, but index 64 is not reachable) */ -: 14:#define SCALE_BITS (32 - 8 - 6) -: 15:#define SCALE_MASK ((1<> PRECISION_BITS]; -: 23:} -: 24: -: 25:static inline void -: 26:interpolate3(INT16 out[3], const INT16 a[3], const INT16 b[3], INT16 shift) -: 27:{ 8263136: 28: out[0] = (a[0] * ((1<> SHIFT_BITS; 8263136: 29: out[1] = (a[1] * ((1<> SHIFT_BITS; 8263136: 30: out[2] = (a[2] * ((1<> SHIFT_BITS; -: 31:} -: 32: -: 33:static inline void function interpolate4 called 460852 returned 100% blocks executed 100% 460852: 34:interpolate4(INT16 out[4], const INT16 a[4], const INT16 b[4], INT16 shift) -: 35:{ 460852: 36: out[0] = (a[0] * ((1<> SHIFT_BITS; 460852: 37: out[1] = (a[1] * ((1<> SHIFT_BITS; 460852: 38: out[2] = (a[2] * ((1<> SHIFT_BITS; 460852: 39: out[3] = (a[3] * ((1<> SHIFT_BITS; 460852: 40:} -: 41: -: 42:static inline int -: 43:table_index3D(int index1D, int index2D, int index3D, -: 44: int size1D, int size1D_2D) -: 45:{ 1246284: 46: return index1D + index2D * size1D + index3D * size1D_2D; -: 47:} -: 48: -: 49: -: 50:/* -: 51: Transforms colors of imIn using provided 3D lookup table -: 52: and puts the result in imOut. Returns imOut on success or 0 on error. -: 53: -: 54: imOut, imIn — images, should be the same size and may be the same image. -: 55: Should have 3 or 4 channels. -: 56: table_channels — number of channels in the lookup table, 3 or 4. -: 57: Should be less or equal than number of channels in imOut image; -: 58: size1D, size_2D and size3D — dimensions of provided table; -: 59: table — flat table, -: 60: array with table_channels × size1D × size2D × size3D elements, -: 61: where channels are changed first, then 1D, then​ 2D, then 3D. -: 62: Each element is signed 16-bit int where 0 is lowest output value -: 63: and 255 << PRECISION_BITS (16320) is highest value. -: 64:*/ -: 65:Imaging function ImagingColorLUT3D_linear called 37 returned 100% blocks executed 100% 37: 66:ImagingColorLUT3D_linear(Imaging imOut, Imaging imIn, int table_channels, -: 67: int size1D, int size2D, int size3D, -: 68: INT16* table) -: 69:{ -: 70: /* This float to int conversion doesn't have rounding -: 71: error compensation (+0.5) for two reasons: -: 72: 1. As we don't hit the highest value, -: 73: we can use one extra bit for precision. -: 74: 2. For every pixel, we interpolate 8 elements from the table: -: 75: current and +1 for every dimension and their combinations. -: 76: If we hit the upper cells from the table, -: 77: +1 cells will be outside of the table. -: 78: With this compensation we never hit the upper cells -: 79: but this also doesn't introduce any noticeable difference. */ 37: 80: UINT32 scale1D = (size1D - 1) / 255.0 * (1< 4) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 2: 88: PyErr_SetString(PyExc_ValueError, "table_channels could be 3 or 4"); call 0 returned 100% 2: 89: return NULL; -: 90: } -: 91: 70: 92: if (imIn->type != IMAGING_TYPE_UINT8 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 70: 93: imOut->type != IMAGING_TYPE_UINT8 || branch 0 taken 94% (fallthrough) branch 1 taken 6% 68: 94: imIn->bands < 3 || branch 0 taken 6% (fallthrough) branch 1 taken 94% 33: 95: imOut->bands < table_channels -: 96: ) { 4: 97: return (Imaging) ImagingError_ModeError(); call 0 returned 100% -: 98: } -: 99: -: 100: /* In case we have one extra band in imOut and don't have in imIn.*/ 31: 101: if (imOut->bands > table_channels && imOut->bands > imIn->bands) { branch 0 taken 10% (fallthrough) branch 1 taken 90% branch 2 taken 33% (fallthrough) branch 3 taken 67% 1: 102: return (Imaging) ImagingError_ModeError(); call 0 returned 100% -: 103: } -: 104: 30: 105: ImagingSectionEnter(&cookie); 5004: 106: for (y = 0; y < imOut->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 4974: 107: UINT8* rowIn = (UINT8 *)imIn->image[y]; 4974: 108: char* rowOut = (char *)imOut->image[y]; 1251258: 109: for (x = 0; x < imOut->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1246284: 110: UINT32 index1D = rowIn[x*4 + 0] * scale1D; 1246284: 111: UINT32 index2D = rowIn[x*4 + 1] * scale2D; 1246284: 112: UINT32 index3D = rowIn[x*4 + 2] * scale3D; 1246284: 113: INT16 shift1D = (SCALE_MASK & index1D) >> (SCALE_BITS - SHIFT_BITS); 1246284: 114: INT16 shift2D = (SCALE_MASK & index2D) >> (SCALE_BITS - SHIFT_BITS); 1246284: 115: INT16 shift3D = (SCALE_MASK & index3D) >> (SCALE_BITS - SHIFT_BITS); 4985136: 116: int idx = table_channels * table_index3D( 2492568: 117: index1D >> SCALE_BITS, index2D >> SCALE_BITS, 1246284: 118: index3D >> SCALE_BITS, size1D, size1D_2D); -: 119: INT16 result[4], left[4], right[4]; -: 120: INT16 leftleft[4], leftright[4], rightleft[4], rightright[4]; -: 121: 1246284: 122: if (table_channels == 3) { branch 0 taken 95% (fallthrough) branch 1 taken 5% -: 123: UINT32 v; 2360896: 124: interpolate3(leftleft, &table[idx + 0], &table[idx + 3], shift1D); 2360896: 125: interpolate3(leftright, &table[idx + size1D*3], 1180448: 126: &table[idx + size1D*3 + 3], shift1D); 1180448: 127: interpolate3(left, leftleft, leftright, shift2D); -: 128: 2360896: 129: interpolate3(rightleft, &table[idx + size1D_2D*3], 1180448: 130: &table[idx + size1D_2D*3 + 3], shift1D); 2360896: 131: interpolate3(rightright, &table[idx + size1D_2D*3 + size1D*3], 1180448: 132: &table[idx + size1D_2D*3 + size1D*3 + 3], shift1D); 1180448: 133: interpolate3(right, rightleft, rightright, shift2D); -: 134: 1180448: 135: interpolate3(result, left, right, shift3D); -: 136: 4721792: 137: v = MAKE_UINT32( -: 138: clip8(result[0]), clip8(result[1]), -: 139: clip8(result[2]), rowIn[x*4 + 3]); 2360896: 140: memcpy(rowOut + x * sizeof(v), &v, sizeof(v)); -: 141: } -: 142: 1246284: 143: if (table_channels == 4) { branch 0 taken 5% (fallthrough) branch 1 taken 95% -: 144: UINT32 v; 65836: 145: interpolate4(leftleft, &table[idx + 0], &table[idx + 4], shift1D); call 0 returned 100% 131672: 146: interpolate4(leftright, &table[idx + size1D*4], call 0 returned 100% 65836: 147: &table[idx + size1D*4 + 4], shift1D); 65836: 148: interpolate4(left, leftleft, leftright, shift2D); call 0 returned 100% -: 149: 131672: 150: interpolate4(rightleft, &table[idx + size1D_2D*4], call 0 returned 100% 65836: 151: &table[idx + size1D_2D*4 + 4], shift1D); 131672: 152: interpolate4(rightright, &table[idx + size1D_2D*4 + size1D*4], call 0 returned 100% 65836: 153: &table[idx + size1D_2D*4 + size1D*4 + 4], shift1D); 65836: 154: interpolate4(right, rightleft, rightright, shift2D); call 0 returned 100% -: 155: 65836: 156: interpolate4(result, left, right, shift3D); call 0 returned 100% -: 157: 329180: 158: v = MAKE_UINT32( -: 159: clip8(result[0]), clip8(result[1]), -: 160: clip8(result[2]), clip8(result[3])); 131672: 161: memcpy(rowOut + x * sizeof(v), &v, sizeof(v)); -: 162: } -: 163: } -: 164: } 30: 165: ImagingSectionLeave(&cookie); call 0 returned 100% -: 166: 30: 167: return imOut; -: 168:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Filter.c.gcov -: 0:Source:src/libImaging/Filter.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Filter.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Filter.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * apply convolution kernel to image -: 6: * -: 7: * history: -: 8: * 1995-11-26 fl Created, supports 3x3 kernels -: 9: * 1995-11-27 fl Added 5x5 kernels, copy border -: 10: * 1999-07-26 fl Eliminated a few compiler warnings -: 11: * 2002-06-09 fl Moved kernel definitions to Python -: 12: * 2002-06-11 fl Support floating point kernels -: 13: * 2003-09-15 fl Added ImagingExpand helper -: 14: * -: 15: * Copyright (c) Secret Labs AB 1997-2002. All rights reserved. -: 16: * Copyright (c) Fredrik Lundh 1995. -: 17: * -: 18: * See the README file for information on usage and redistribution. -: 19: */ -: 20: -: 21:/* -: 22: * FIXME: Support RGB and RGBA/CMYK modes as well -: 23: * FIXME: Expand image border (current version leaves border as is) -: 24: * FIXME: Implement image processing gradient filters -: 25: */ -: 26: -: 27:#include "Imaging.h" -: 28: -: 29: -: 30:static inline UINT8 clip8(float in) -: 31:{ 1858871: 32: if (in <= 0.0) { branch 0 taken 82% (fallthrough) branch 1 taken 18% branch 2 taken 46% (fallthrough) branch 3 taken 54% branch 4 taken 48% (fallthrough) branch 5 taken 52% branch 6 taken 86% (fallthrough) branch 7 taken 14% branch 8 taken 87% (fallthrough) branch 9 taken 13% branch 10 taken 88% (fallthrough) branch 11 taken 12% branch 12 taken 82% (fallthrough) branch 13 taken 18% branch 14 taken 83% (fallthrough) branch 15 taken 17% branch 16 taken 84% (fallthrough) branch 17 taken 16% branch 18 taken 82% (fallthrough) branch 19 taken 18% branch 20 taken 84% (fallthrough) branch 21 taken 16% branch 22 taken 48% (fallthrough) branch 23 taken 52% branch 24 taken 50% (fallthrough) branch 25 taken 50% branch 26 taken 85% (fallthrough) branch 27 taken 15% branch 28 taken 85% (fallthrough) branch 29 taken 15% branch 30 taken 86% (fallthrough) branch 31 taken 14% branch 32 taken 88% (fallthrough) branch 33 taken 12% branch 34 taken 89% (fallthrough) branch 35 taken 11% branch 36 taken 90% (fallthrough) branch 37 taken 10% branch 38 taken 96% (fallthrough) branch 39 taken 4% -: 33: return 0; -: 34: } 1596832: 35: if (in >= 255.0) { branch 0 taken 90% (fallthrough) branch 1 taken 10% branch 2 taken 48% (fallthrough) branch 3 taken 52% branch 4 taken 53% (fallthrough) branch 5 taken 47% branch 6 taken 93% (fallthrough) branch 7 taken 7% branch 8 taken 94% (fallthrough) branch 9 taken 6% branch 10 taken 93% (fallthrough) branch 11 taken 7% branch 12 taken 90% (fallthrough) branch 13 taken 10% branch 14 taken 91% (fallthrough) branch 15 taken 9% branch 16 taken 90% (fallthrough) branch 17 taken 10% branch 18 taken 90% (fallthrough) branch 19 taken 10% branch 20 taken 88% (fallthrough) branch 21 taken 12% branch 22 taken 75% (fallthrough) branch 23 taken 25% branch 24 taken 77% (fallthrough) branch 25 taken 23% branch 26 taken 88% (fallthrough) branch 27 taken 12% branch 28 taken 89% (fallthrough) branch 29 taken 11% branch 30 taken 89% (fallthrough) branch 31 taken 11% branch 32 taken 89% (fallthrough) branch 33 taken 11% branch 34 taken 89% (fallthrough) branch 35 taken 11% branch 36 taken 89% (fallthrough) branch 37 taken 11% branch 38 taken 77% (fallthrough) branch 39 taken 23% -: 36: return 255; -: 37: } 1399714: 38: return (UINT8) in; -: 39:} -: 40: -: 41:Imaging function ImagingExpand called 47 returned 100% blocks executed 98% 47: 42:ImagingExpand(Imaging imIn, int xmargin, int ymargin, int mode) -: 43:{ -: 44: Imaging imOut; -: 45: int x, y; -: 46: ImagingSectionCookie cookie; -: 47: 47: 48: if (xmargin < 0 && ymargin < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed #####: 49: return (Imaging) ImagingError_ValueError("bad kernel size"); call 0 never executed -: 50: } -: 51: 94: 52: imOut = ImagingNewDirty( call 0 returned 100% 94: 53: imIn->mode, imIn->xsize+2*xmargin, imIn->ysize+2*ymargin); 47: 54: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 55: return NULL; -: 56: } -: 57: -: 58:#define EXPAND_LINE(type, image, yin, yout) {\ -: 59: for (x = 0; x < xmargin; x++) {\ -: 60: imOut->image[yout][x] = imIn->image[yin][0];\ -: 61: }\ -: 62: for (x = 0; x < imIn->xsize; x++) {\ -: 63: imOut->image[yout][x+xmargin] = imIn->image[yin][x];\ -: 64: }\ -: 65: for (x = 0; x < xmargin; x++) {\ -: 66: imOut->image[yout][xmargin+imIn->xsize+x] =\ -: 67: imIn->image[yin][imIn->xsize-1];\ -: 68: }\ -: 69:} -: 70: -: 71:#define EXPAND(type, image) {\ -: 72: for (y = 0; y < ymargin; y++) {\ -: 73: EXPAND_LINE(type, image, 0, y);\ -: 74: }\ -: 75: for (y = 0; y < imIn->ysize; y++) {\ -: 76: EXPAND_LINE(type, image, y, y+ymargin);\ -: 77: }\ -: 78: for (y = 0; y < ymargin; y++) {\ -: 79: EXPAND_LINE(type, image, imIn->ysize-1, ymargin+imIn->ysize+y);\ -: 80: }\ -: 81:} -: 82: 47: 83: ImagingSectionEnter(&cookie); call 0 returned 100% 47: 84: if (imIn->image8) { branch 0 taken 17% (fallthrough) branch 1 taken 83% 39: 85: EXPAND(UINT8, image8); branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) branch 4 taken 50% branch 5 taken 50% (fallthrough) branch 6 taken 50% (fallthrough) branch 7 taken 50% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 99% branch 11 taken 1% (fallthrough) branch 12 taken 50% branch 13 taken 50% (fallthrough) branch 14 taken 99% (fallthrough) branch 15 taken 1% branch 16 taken 50% branch 17 taken 50% (fallthrough) branch 18 taken 99% branch 19 taken 1% (fallthrough) branch 20 taken 50% branch 21 taken 50% (fallthrough) branch 22 taken 50% (fallthrough) branch 23 taken 50% -: 86: } else { 46: 87: EXPAND(INT32, image32); branch 0 taken 77% branch 1 taken 23% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) branch 4 taken 77% branch 5 taken 23% (fallthrough) branch 6 taken 64% (fallthrough) branch 7 taken 36% branch 8 taken 83% branch 9 taken 17% (fallthrough) branch 10 taken 99% branch 11 taken 1% (fallthrough) branch 12 taken 83% branch 13 taken 17% (fallthrough) branch 14 taken 97% (fallthrough) branch 15 taken 3% branch 16 taken 77% branch 17 taken 23% (fallthrough) branch 18 taken 99% branch 19 taken 1% (fallthrough) branch 20 taken 77% branch 21 taken 23% (fallthrough) branch 22 taken 64% (fallthrough) branch 23 taken 36% -: 88: } 47: 89: ImagingSectionLeave(&cookie); call 0 returned 100% -: 90: 47: 91: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 92: 47: 93: return imOut; -: 94:} -: 95: -: 96: -: 97:void function ImagingFilter3x3 called 33 returned 100% blocks executed 100% 33: 98:ImagingFilter3x3(Imaging imOut, Imaging im, const float* kernel, -: 99: float offset) -: 100:{ -: 101:#define KERNEL1x3(in0, x, kernel, d) ( \ -: 102: _i2f((UINT8) in0[x-d]) * (kernel)[0] + \ -: 103: _i2f((UINT8) in0[x]) * (kernel)[1] + \ -: 104: _i2f((UINT8) in0[x+d]) * (kernel)[2]) -: 105: 33: 106: int x = 0, y = 0; -: 107: 66: 108: memcpy(imOut->image[0], im->image[0], im->linesize); 33: 109: if (im->bands == 1) { branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 110: // Add one time for rounding 9: 111: offset += 0.5; 1143: 112: for (y = 1; y < im->ysize-1; y++) { branch 0 taken 99% branch 1 taken 1% 1134: 113: UINT8* in_1 = (UINT8*) im->image[y-1]; 1134: 114: UINT8* in0 = (UINT8*) im->image[y]; 1134: 115: UINT8* in1 = (UINT8*) im->image[y+1]; 1134: 116: UINT8* out = (UINT8*) imOut->image[y]; -: 117: 1134: 118: out[0] = in0[0]; 144018: 119: for (x = 1; x < im->xsize-1; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 142884: 120: float ss = offset; 571536: 121: ss += KERNEL1x3(in1, x, &kernel[0], 1); 571536: 122: ss += KERNEL1x3(in0, x, &kernel[3], 1); 571536: 123: ss += KERNEL1x3(in_1, x, &kernel[6], 1); 285768: 124: out[x] = clip8(ss); -: 125: } 1134: 126: out[x] = in0[x]; -: 127: } -: 128: } else { -: 129: // Add one time for rounding 24: 130: offset += 0.5; 2923: 131: for (y = 1; y < im->ysize-1; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2899: 132: UINT8* in_1 = (UINT8*) im->image[y-1]; 2899: 133: UINT8* in0 = (UINT8*) im->image[y]; 2899: 134: UINT8* in1 = (UINT8*) im->image[y+1]; 2899: 135: UINT8* out = (UINT8*) imOut->image[y]; -: 136: 2899: 137: memcpy(out, in0, sizeof(UINT32)); 2899: 138: if (im->bands == 2) { branch 0 taken 4% (fallthrough) branch 1 taken 96% 15876: 139: for (x = 1; x < im->xsize-1; x++) { branch 0 taken 99% branch 1 taken 1% 15876: 140: float ss0 = offset; 15876: 141: float ss3 = offset; -: 142: UINT32 v; 63504: 143: ss0 += KERNEL1x3(in1, x*4+0, &kernel[0], 4); 63504: 144: ss3 += KERNEL1x3(in1, x*4+3, &kernel[0], 4); 63504: 145: ss0 += KERNEL1x3(in0, x*4+0, &kernel[3], 4); 63504: 146: ss3 += KERNEL1x3(in0, x*4+3, &kernel[3], 4); 63504: 147: ss0 += KERNEL1x3(in_1, x*4+0, &kernel[6], 4); 63504: 148: ss3 += KERNEL1x3(in_1, x*4+3, &kernel[6], 4); 31752: 149: v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); 31752: 150: memcpy(out + x * sizeof(v), &v, sizeof(v)); -: 151: } 2773: 152: } else if (im->bands == 3) { branch 0 taken 45% (fallthrough) branch 1 taken 55% 158761: 153: for (x = 1; x < im->xsize-1; x++) { branch 0 taken 99% branch 1 taken 1% 158761: 154: float ss0 = offset; 158761: 155: float ss1 = offset; 158761: 156: float ss2 = offset; -: 157: UINT32 v; 635044: 158: ss0 += KERNEL1x3(in1, x*4+0, &kernel[0], 4); 635044: 159: ss1 += KERNEL1x3(in1, x*4+1, &kernel[0], 4); 635044: 160: ss2 += KERNEL1x3(in1, x*4+2, &kernel[0], 4); 635044: 161: ss0 += KERNEL1x3(in0, x*4+0, &kernel[3], 4); 635044: 162: ss1 += KERNEL1x3(in0, x*4+1, &kernel[3], 4); 635044: 163: ss2 += KERNEL1x3(in0, x*4+2, &kernel[3], 4); 635044: 164: ss0 += KERNEL1x3(in_1, x*4+0, &kernel[6], 4); 635044: 165: ss1 += KERNEL1x3(in_1, x*4+1, &kernel[6], 4); 635044: 166: ss2 += KERNEL1x3(in_1, x*4+2, &kernel[6], 4); 476283: 167: v = MAKE_UINT32( -: 168: clip8(ss0), clip8(ss1), clip8(ss2), 0); 317522: 169: memcpy(out + x * sizeof(v), &v, sizeof(v)); -: 170: } 1512: 171: } else if (im->bands == 4) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 190512: 172: for (x = 1; x < im->xsize-1; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 190512: 173: float ss0 = offset; 190512: 174: float ss1 = offset; 190512: 175: float ss2 = offset; 190512: 176: float ss3 = offset; -: 177: UINT32 v; 762048: 178: ss0 += KERNEL1x3(in1, x*4+0, &kernel[0], 4); 762048: 179: ss1 += KERNEL1x3(in1, x*4+1, &kernel[0], 4); 762048: 180: ss2 += KERNEL1x3(in1, x*4+2, &kernel[0], 4); 762048: 181: ss3 += KERNEL1x3(in1, x*4+3, &kernel[0], 4); 762048: 182: ss0 += KERNEL1x3(in0, x*4+0, &kernel[3], 4); 762048: 183: ss1 += KERNEL1x3(in0, x*4+1, &kernel[3], 4); 762048: 184: ss2 += KERNEL1x3(in0, x*4+2, &kernel[3], 4); 762048: 185: ss3 += KERNEL1x3(in0, x*4+3, &kernel[3], 4); 762048: 186: ss0 += KERNEL1x3(in_1, x*4+0, &kernel[6], 4); 762048: 187: ss1 += KERNEL1x3(in_1, x*4+1, &kernel[6], 4); 762048: 188: ss2 += KERNEL1x3(in_1, x*4+2, &kernel[6], 4); 762048: 189: ss3 += KERNEL1x3(in_1, x*4+3, &kernel[6], 4); 762048: 190: v = MAKE_UINT32( -: 191: clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); 381024: 192: memcpy(out + x * sizeof(v), &v, sizeof(v)); -: 193: } -: 194: } 5798: 195: memcpy(out + x * sizeof(UINT32), in0 + x * sizeof(UINT32), sizeof(UINT32)); -: 196: } -: 197: } 66: 198: memcpy(imOut->image[y], im->image[y], im->linesize); 33: 199:} -: 200: -: 201: -: 202:void function ImagingFilter5x5 called 11 returned 100% blocks executed 100% 11: 203:ImagingFilter5x5(Imaging imOut, Imaging im, const float* kernel, -: 204: float offset) -: 205:{ -: 206:#define KERNEL1x5(in0, x, kernel, d) ( \ -: 207: _i2f((UINT8) in0[x-d-d]) * (kernel)[0] + \ -: 208: _i2f((UINT8) in0[x-d]) * (kernel)[1] + \ -: 209: _i2f((UINT8) in0[x]) * (kernel)[2] + \ -: 210: _i2f((UINT8) in0[x+d]) * (kernel)[3] + \ -: 211: _i2f((UINT8) in0[x+d+d]) * (kernel)[4]) -: 212: 11: 213: int x = 0, y = 0; -: 214: 22: 215: memcpy(imOut->image[0], im->image[0], im->linesize); 22: 216: memcpy(imOut->image[1], im->image[1], im->linesize); 11: 217: if (im->bands == 1) { branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 218: // Add one time for rounding 3: 219: offset += 0.5; 375: 220: for (y = 2; y < im->ysize-2; y++) { branch 0 taken 99% branch 1 taken 1% 372: 221: UINT8* in_2 = (UINT8*) im->image[y-2]; 372: 222: UINT8* in_1 = (UINT8*) im->image[y-1]; 372: 223: UINT8* in0 = (UINT8*) im->image[y]; 372: 224: UINT8* in1 = (UINT8*) im->image[y+1]; 372: 225: UINT8* in2 = (UINT8*) im->image[y+2]; 372: 226: UINT8* out = (UINT8*) imOut->image[y]; -: 227: 372: 228: out[0] = in0[0]; 372: 229: out[1] = in0[1]; 46500: 230: for (x = 2; x < im->xsize-2; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 46128: 231: float ss = offset; 276768: 232: ss += KERNEL1x5(in2, x, &kernel[0], 1); 276768: 233: ss += KERNEL1x5(in1, x, &kernel[5], 1); 276768: 234: ss += KERNEL1x5(in0, x, &kernel[10], 1); 276768: 235: ss += KERNEL1x5(in_1, x, &kernel[15], 1); 276768: 236: ss += KERNEL1x5(in_2, x, &kernel[20], 1); 92256: 237: out[x] = clip8(ss); -: 238: } 372: 239: out[x+0] = in0[x+0]; 372: 240: out[x+1] = in0[x+1]; -: 241: } -: 242: } else { -: 243: // Add one time for rounding 8: 244: offset += 0.5; 1000: 245: for (y = 2; y < im->ysize-2; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 992: 246: UINT8* in_2 = (UINT8*) im->image[y-2]; 992: 247: UINT8* in_1 = (UINT8*) im->image[y-1]; 992: 248: UINT8* in0 = (UINT8*) im->image[y]; 992: 249: UINT8* in1 = (UINT8*) im->image[y+1]; 992: 250: UINT8* in2 = (UINT8*) im->image[y+2]; 992: 251: UINT8* out = (UINT8*) imOut->image[y]; -: 252: 992: 253: memcpy(out, in0, sizeof(UINT32) * 2); 992: 254: if (im->bands == 2) { branch 0 taken 13% (fallthrough) branch 1 taken 88% 15376: 255: for (x = 2; x < im->xsize-2; x++) { branch 0 taken 99% branch 1 taken 1% 15376: 256: float ss0 = offset; 15376: 257: float ss3 = offset; -: 258: UINT32 v; 92256: 259: ss0 += KERNEL1x5(in2, x*4+0, &kernel[0], 4); 92256: 260: ss3 += KERNEL1x5(in2, x*4+3, &kernel[0], 4); 92256: 261: ss0 += KERNEL1x5(in1, x*4+0, &kernel[5], 4); 92256: 262: ss3 += KERNEL1x5(in1, x*4+3, &kernel[5], 4); 92256: 263: ss0 += KERNEL1x5(in0, x*4+0, &kernel[10], 4); 92256: 264: ss3 += KERNEL1x5(in0, x*4+3, &kernel[10], 4); 92256: 265: ss0 += KERNEL1x5(in_1, x*4+0, &kernel[15], 4); 92256: 266: ss3 += KERNEL1x5(in_1, x*4+3, &kernel[15], 4); 92256: 267: ss0 += KERNEL1x5(in_2, x*4+0, &kernel[20], 4); 92256: 268: ss3 += KERNEL1x5(in_2, x*4+3, &kernel[20], 4); 30752: 269: v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); 30752: 270: memcpy(out + x * sizeof(v), &v, sizeof(v)); -: 271: } 868: 272: } else if (im->bands == 3) { branch 0 taken 57% (fallthrough) branch 1 taken 43% 61504: 273: for (x = 2; x < im->xsize-2; x++) { branch 0 taken 99% branch 1 taken 1% 61504: 274: float ss0 = offset; 61504: 275: float ss1 = offset; 61504: 276: float ss2 = offset; -: 277: UINT32 v; 369024: 278: ss0 += KERNEL1x5(in2, x*4+0, &kernel[0], 4); 369024: 279: ss1 += KERNEL1x5(in2, x*4+1, &kernel[0], 4); 369024: 280: ss2 += KERNEL1x5(in2, x*4+2, &kernel[0], 4); 369024: 281: ss0 += KERNEL1x5(in1, x*4+0, &kernel[5], 4); 369024: 282: ss1 += KERNEL1x5(in1, x*4+1, &kernel[5], 4); 369024: 283: ss2 += KERNEL1x5(in1, x*4+2, &kernel[5], 4); 369024: 284: ss0 += KERNEL1x5(in0, x*4+0, &kernel[10], 4); 369024: 285: ss1 += KERNEL1x5(in0, x*4+1, &kernel[10], 4); 369024: 286: ss2 += KERNEL1x5(in0, x*4+2, &kernel[10], 4); 369024: 287: ss0 += KERNEL1x5(in_1, x*4+0, &kernel[15], 4); 369024: 288: ss1 += KERNEL1x5(in_1, x*4+1, &kernel[15], 4); 369024: 289: ss2 += KERNEL1x5(in_1, x*4+2, &kernel[15], 4); 369024: 290: ss0 += KERNEL1x5(in_2, x*4+0, &kernel[20], 4); 369024: 291: ss1 += KERNEL1x5(in_2, x*4+1, &kernel[20], 4); 369024: 292: ss2 += KERNEL1x5(in_2, x*4+2, &kernel[20], 4); 184512: 293: v = MAKE_UINT32( -: 294: clip8(ss0), clip8(ss1), clip8(ss2), 0); 123008: 295: memcpy(out + x * sizeof(v), &v, sizeof(v)); -: 296: } 372: 297: } else if (im->bands == 4) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 46128: 298: for (x = 2; x < im->xsize-2; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 46128: 299: float ss0 = offset; 46128: 300: float ss1 = offset; 46128: 301: float ss2 = offset; 46128: 302: float ss3 = offset; -: 303: UINT32 v; 276768: 304: ss0 += KERNEL1x5(in2, x*4+0, &kernel[0], 4); 276768: 305: ss1 += KERNEL1x5(in2, x*4+1, &kernel[0], 4); 276768: 306: ss2 += KERNEL1x5(in2, x*4+2, &kernel[0], 4); 276768: 307: ss3 += KERNEL1x5(in2, x*4+3, &kernel[0], 4); 276768: 308: ss0 += KERNEL1x5(in1, x*4+0, &kernel[5], 4); 276768: 309: ss1 += KERNEL1x5(in1, x*4+1, &kernel[5], 4); 276768: 310: ss2 += KERNEL1x5(in1, x*4+2, &kernel[5], 4); 276768: 311: ss3 += KERNEL1x5(in1, x*4+3, &kernel[5], 4); 276768: 312: ss0 += KERNEL1x5(in0, x*4+0, &kernel[10], 4); 276768: 313: ss1 += KERNEL1x5(in0, x*4+1, &kernel[10], 4); 276768: 314: ss2 += KERNEL1x5(in0, x*4+2, &kernel[10], 4); 276768: 315: ss3 += KERNEL1x5(in0, x*4+3, &kernel[10], 4); 276768: 316: ss0 += KERNEL1x5(in_1, x*4+0, &kernel[15], 4); 276768: 317: ss1 += KERNEL1x5(in_1, x*4+1, &kernel[15], 4); 276768: 318: ss2 += KERNEL1x5(in_1, x*4+2, &kernel[15], 4); 276768: 319: ss3 += KERNEL1x5(in_1, x*4+3, &kernel[15], 4); 276768: 320: ss0 += KERNEL1x5(in_2, x*4+0, &kernel[20], 4); 276768: 321: ss1 += KERNEL1x5(in_2, x*4+1, &kernel[20], 4); 276768: 322: ss2 += KERNEL1x5(in_2, x*4+2, &kernel[20], 4); 276768: 323: ss3 += KERNEL1x5(in_2, x*4+3, &kernel[20], 4); 184512: 324: v = MAKE_UINT32( -: 325: clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); 92256: 326: memcpy(out + x * sizeof(v), &v, sizeof(v)); -: 327: } -: 328: } 1984: 329: memcpy(out + x * sizeof(UINT32), in0 + x * sizeof(UINT32), sizeof(UINT32) * 2); -: 330: } -: 331: } 22: 332: memcpy(imOut->image[y], im->image[y], im->linesize); 22: 333: memcpy(imOut->image[y+1], im->image[y+1], im->linesize); 11: 334:} -: 335: -: 336:Imaging function ImagingFilter called 47 returned 100% blocks executed 89% 47: 337:ImagingFilter(Imaging im, int xsize, int ysize, const FLOAT32* kernel, -: 338: FLOAT32 offset) -: 339:{ -: 340: Imaging imOut; -: 341: ImagingSectionCookie cookie; -: 342: 47: 343: if ( ! im || im->type != IMAGING_TYPE_UINT8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 344: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 345: } -: 346: 47: 347: if (im->xsize < xsize || im->ysize < ysize) { branch 0 taken 94% (fallthrough) branch 1 taken 6% branch 2 taken 0% (fallthrough) branch 3 taken 100% 3: 348: return ImagingCopy(im); call 0 returned 100% -: 349: } -: 350: 44: 351: if ((xsize != 3 && xsize != 5) || xsize != ysize) { branch 0 taken 25% (fallthrough) branch 1 taken 75% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 352: return (Imaging) ImagingError_ValueError("bad kernel size"); call 0 never executed -: 353: } -: 354: 44: 355: imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize); call 0 returned 100% 44: 356: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 357: return NULL; -: 358: } -: 359: 44: 360: ImagingSectionEnter(&cookie); call 0 returned 100% 44: 361: if (xsize == 3) { branch 0 taken 75% (fallthrough) branch 1 taken 25% -: 362: /* 3x3 kernel. */ 33: 363: ImagingFilter3x3(imOut, im, kernel, offset); call 0 returned 100% -: 364: } else { -: 365: /* 5x5 kernel. */ 11: 366: ImagingFilter5x5(imOut, im, kernel, offset); call 0 returned 100% -: 367: } 44: 368: ImagingSectionLeave(&cookie); call 0 returned 100% 44: 369: return imOut; -: 370:} -: 371: <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#UnpackYCC.c.gcov -: 0:Source:src/libImaging/UnpackYCC.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/UnpackYCC.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/UnpackYCC.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * code to convert and unpack PhotoYCC data -: 6: * -: 7: * history: -: 8: * 97-01-25 fl Moved from PcdDecode.c -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1996-97. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19: -: 20:/* Tables generated by pcdtables.py, based on transforms taken from -: 21: the "Colour Space Conversions FAQ" by Roberts/Ford. */ -: 22: -: 23:static INT16 L[] = { 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, -: 24:19, 20, 22, 23, 24, 26, 27, 29, 30, 31, 33, 34, 35, 37, 38, 39, 41, -: 25:42, 43, 45, 46, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62, 64, -: 26:65, 67, 68, 69, 71, 72, 73, 75, 76, 77, 79, 80, 82, 83, 84, 86, 87, -: 27:88, 90, 91, 92, 94, 95, 96, 98, 99, 101, 102, 103, 105, 106, 107, 109, -: 28:110, 111, 113, 114, 115, 117, 118, 120, 121, 122, 124, 125, 126, 128, -: 29:129, 130, 132, 133, 134, 136, 137, 139, 140, 141, 143, 144, 145, 147, -: 30:148, 149, 151, 152, 153, 155, 156, 158, 159, 160, 162, 163, 164, 166, -: 31:167, 168, 170, 171, 173, 174, 175, 177, 178, 179, 181, 182, 183, 185, -: 32:186, 187, 189, 190, 192, 193, 194, 196, 197, 198, 200, 201, 202, 204, -: 33:205, 206, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 223, -: 34:224, 225, 227, 228, 230, 231, 232, 234, 235, 236, 238, 239, 240, 242, -: 35:243, 245, 246, 247, 249, 250, 251, 253, 254, 255, 257, 258, 259, 261, -: 36:262, 264, 265, 266, 268, 269, 270, 272, 273, 274, 276, 277, 278, 280, -: 37:281, 283, 284, 285, 287, 288, 289, 291, 292, 293, 295, 296, 297, 299, -: 38:300, 302, 303, 304, 306, 307, 308, 310, 311, 312, 314, 315, 317, 318, -: 39:319, 321, 322, 323, 325, 326, 327, 329, 330, 331, 333, 334, 336, 337, -: 40:338, 340, 341, 342, 344, 345, 346 }; -: 41: -: 42:static INT16 CB[] = { -345, -343, -341, -338, -336, -334, -332, -329, -: 43:-327, -325, -323, -321, -318, -316, -314, -312, -310, -307, -305, -: 44:-303, -301, -298, -296, -294, -292, -290, -287, -285, -283, -281, -: 45:-278, -276, -274, -272, -270, -267, -265, -263, -261, -258, -256, -: 46:-254, -252, -250, -247, -245, -243, -241, -239, -236, -234, -232, -: 47:-230, -227, -225, -223, -221, -219, -216, -214, -212, -210, -207, -: 48:-205, -203, -201, -199, -196, -194, -192, -190, -188, -185, -183, -: 49:-181, -179, -176, -174, -172, -170, -168, -165, -163, -161, -159, -: 50:-156, -154, -152, -150, -148, -145, -143, -141, -139, -137, -134, -: 51:-132, -130, -128, -125, -123, -121, -119, -117, -114, -112, -110, -: 52:-108, -105, -103, -101, -99, -97, -94, -92, -90, -88, -85, -83, -81, -: 53:-79, -77, -74, -72, -70, -68, -66, -63, -61, -59, -57, -54, -52, -50, -: 54:-48, -46, -43, -41, -39, -37, -34, -32, -30, -28, -26, -23, -21, -19, -: 55:-17, -15, -12, -10, -8, -6, -3, -1, 0, 2, 4, 7, 9, 11, 13, 16, 18, 20, -: 56:22, 24, 27, 29, 31, 33, 35, 38, 40, 42, 44, 47, 49, 51, 53, 55, 58, -: 57:60, 62, 64, 67, 69, 71, 73, 75, 78, 80, 82, 84, 86, 89, 91, 93, 95, -: 58:98, 100, 102, 104, 106, 109, 111, 113, 115, 118, 120, 122, 124, 126, -: 59:129, 131, 133, 135, 138, 140, 142, 144, 146, 149, 151, 153, 155, 157, -: 60:160, 162, 164, 166, 169, 171, 173, 175, 177, 180, 182, 184, 186, 189, -: 61:191, 193, 195, 197, 200, 202, 204, 206, 208, 211, 213, 215, 217, 220 }; -: 62: -: 63:static INT16 GB[] = { 67, 67, 66, 66, 65, 65, 65, 64, 64, 63, 63, 62, -: 64:62, 62, 61, 61, 60, 60, 59, 59, 59, 58, 58, 57, 57, 56, 56, 56, 55, -: 65:55, 54, 54, 53, 53, 52, 52, 52, 51, 51, 50, 50, 49, 49, 49, 48, 48, -: 66:47, 47, 46, 46, 46, 45, 45, 44, 44, 43, 43, 43, 42, 42, 41, 41, 40, -: 67:40, 40, 39, 39, 38, 38, 37, 37, 37, 36, 36, 35, 35, 34, 34, 34, 33, -: 68:33, 32, 32, 31, 31, 31, 30, 30, 29, 29, 28, 28, 28, 27, 27, 26, 26, -: 69:25, 25, 25, 24, 24, 23, 23, 22, 22, 22, 21, 21, 20, 20, 19, 19, 19, -: 70:18, 18, 17, 17, 16, 16, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 11, -: 71:11, 10, 10, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 3, 3, 3, 2, 2, -: 72:1, 1, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -3, -3, -4, -4, -5, -5, -5, -: 73:-6, -6, -7, -7, -8, -8, -8, -9, -9, -10, -10, -11, -11, -11, -12, -12, -: 74:-13, -13, -14, -14, -14, -15, -15, -16, -16, -17, -17, -18, -18, -18, -: 75:-19, -19, -20, -20, -21, -21, -21, -22, -22, -23, -23, -24, -24, -24, -: 76:-25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, -: 77:-31, -31, -32, -32, -33, -33, -33, -34, -34, -35, -35, -36, -36, -36, -: 78:-37, -37, -38, -38, -39, -39, -39, -40, -40, -41, -41, -42 }; -: 79: -: 80:static INT16 CR[] = { -249, -247, -245, -243, -241, -239, -238, -236, -: 81:-234, -232, -230, -229, -227, -225, -223, -221, -219, -218, -216, -: 82:-214, -212, -210, -208, -207, -205, -203, -201, -199, -198, -196, -: 83:-194, -192, -190, -188, -187, -185, -183, -181, -179, -178, -176, -: 84:-174, -172, -170, -168, -167, -165, -163, -161, -159, -157, -156, -: 85:-154, -152, -150, -148, -147, -145, -143, -141, -139, -137, -136, -: 86:-134, -132, -130, -128, -127, -125, -123, -121, -119, -117, -116, -: 87:-114, -112, -110, -108, -106, -105, -103, -101, -99, -97, -96, -94, -: 88:-92, -90, -88, -86, -85, -83, -81, -79, -77, -76, -74, -72, -70, -68, -: 89:-66, -65, -63, -61, -59, -57, -55, -54, -52, -50, -48, -46, -45, -43, -: 90:-41, -39, -37, -35, -34, -32, -30, -28, -26, -25, -23, -21, -19, -17, -: 91:-15, -14, -12, -10, -8, -6, -4, -3, -1, 0, 2, 4, 5, 7, 9, 11, 13, 15, -: 92:16, 18, 20, 22, 24, 26, 27, 29, 31, 33, 35, 36, 38, 40, 42, 44, 46, -: 93:47, 49, 51, 53, 55, 56, 58, 60, 62, 64, 66, 67, 69, 71, 73, 75, 77, -: 94:78, 80, 82, 84, 86, 87, 89, 91, 93, 95, 97, 98, 100, 102, 104, 106, -: 95:107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 129, 131, -: 96:133, 135, 137, 138, 140, 142, 144, 146, 148, 149, 151, 153, 155, 157, -: 97:158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 179, 180, 182, -: 98:184, 186, 188, 189, 191, 193, 195, 197, 199, 200, 202, 204, 206, 208, -: 99:209, 211, 213, 215 }; -: 100: -: 101:static INT16 GR[] = { 127, 126, 125, 124, 123, 122, 121, 121, 120, 119, -: 102:118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 108, 107, 106, -: 103:105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 95, 94, 93, 92, 91, -: 104:90, 89, 88, 87, 86, 85, 84, 83, 83, 82, 81, 80, 79, 78, 77, 76, 75, -: 105:74, 73, 72, 71, 70, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, -: 106:58, 57, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 45, 44, -: 107:43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 32, 31, 30, 29, 28, -: 108:27, 26, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, -: 109:11, 10, 9, 8, 7, 6, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -5, -: 110:-6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -18, -19, -: 111:-20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -31, -32, -: 112:-33, -34, -35, -36, -37, -38, -39, -40, -41, -42, -43, -44, -44, -45, -: 113:-46, -47, -48, -49, -50, -51, -52, -53, -54, -55, -56, -56, -57, -58, -: 114:-59, -60, -61, -62, -63, -64, -65, -66, -67, -68, -69, -69, -70, -71, -: 115:-72, -73, -74, -75, -76, -77, -78, -79, -80, -81, -82, -82, -83, -84, -: 116:-85, -86, -87, -88, -89, -90, -91, -92, -93, -94, -94, -95, -96, -97, -: 117:-98, -99, -100, -101, -102, -103, -104, -105, -106, -107, -107, -108 }; -: 118: -: 119:#define R 0 -: 120:#define G 1 -: 121:#define B 2 -: 122:#define A 3 -: 123: -: 124:#define YCC2RGB(rgb, y, cb, cr) {\ -: 125: int l = L[y];\ -: 126: int r = l + CR[cr];\ -: 127: int g = l + GR[cr] + GB[cb];\ -: 128: int b = l + CB[cb];\ -: 129: rgb[0] = (r <= 0) ? 0 : (r >= 255) ? 255 : r;\ -: 130: rgb[1] = (g <= 0) ? 0 : (g >= 255) ? 255 : g;\ -: 131: rgb[2] = (b <= 0) ? 0 : (b >= 255) ? 255 : b;\ -: 132:} -: 133: -: 134:void function ImagingUnpackYCC called 514 returned 100% blocks executed 100% 514: 135:ImagingUnpackYCC(UINT8* out, const UINT8* in, int pixels) -: 136:{ -: 137: int i; -: 138: /* PhotoYCC triplets */ 393738: 139: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 393224: 140: YCC2RGB(out, in[0], in[1], in[2]); branch 0 taken 52% (fallthrough) branch 1 taken 48% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 44% (fallthrough) branch 5 taken 56% 393224: 141: out[A] = 255; 393224: 142: out += 4; in += 3; -: 143: } 514: 144:} -: 145: -: 146:void function ImagingUnpackYCCA called 1 returned 100% blocks executed 100% 1: 147:ImagingUnpackYCCA(UINT8* out, const UINT8* in, int pixels) -: 148:{ -: 149: int i; -: 150: /* PhotoYCC triplets plus premultiplied alpha */ 5: 151: for (i = 0; i < pixels; i++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) -: 152: /* Divide by alpha */ -: 153: UINT8 rgb[3]; 4: 154: rgb[0] = (in[3] == 0) ? 0 : (((int) in[0] * 255) / in[3]); branch 0 taken 100% (fallthrough) branch 1 taken 0% 4: 155: rgb[1] = (in[3] == 0) ? 0 : (((int) in[1] * 255) / in[3]); branch 0 taken 100% (fallthrough) branch 1 taken 0% 4: 156: rgb[2] = (in[3] == 0) ? 0 : (((int) in[2] * 255) / in[3]); branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 157: /* Convert non-multiplied data to RGB */ 4: 158: YCC2RGB(out, rgb[0], rgb[1], rgb[2]); branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 25% (fallthrough) branch 5 taken 75% 4: 159: out[A] = in[3]; 4: 160: out += 4; in += 4; -: 161: } 1: 162:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#_imagingmath.c.gcov -: 0:Source:src/_imagingmath.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imagingmath.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imagingmath.gcda -: 0:Runs:2 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * -: 4: * a simple math add-on for the Python Imaging Library -: 5: * -: 6: * history: -: 7: * 1999-02-15 fl Created -: 8: * 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 -: 9: * -: 10: * Copyright (c) 1999-2005 by Secret Labs AB -: 11: * Copyright (c) 2005 by Fredrik Lundh -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16:#include "Python.h" -: 17: -: 18:#include "libImaging/Imaging.h" -: 19: -: 20:#include "math.h" -: 21:#include "float.h" -: 22: -: 23:#define MAX_INT32 2147483647.0 -: 24:#define MIN_INT32 -2147483648.0 -: 25: -: 26:#define UNOP(name, op, type)\ -: 27:void name(Imaging out, Imaging im1)\ -: 28:{\ -: 29: int x, y;\ -: 30: for (y = 0; y < out->ysize; y++) {\ -: 31: type* p0 = (type*) out->image[y];\ -: 32: type* p1 = (type*) im1->image[y];\ -: 33: for (x = 0; x < out->xsize; x++) {\ -: 34: *p0 = op(type, *p1);\ -: 35: p0++; p1++;\ -: 36: }\ -: 37: }\ -: 38:} -: 39: -: 40:#define BINOP(name, op, type)\ -: 41:void name(Imaging out, Imaging im1, Imaging im2)\ -: 42:{\ -: 43: int x, y;\ -: 44: for (y = 0; y < out->ysize; y++) {\ -: 45: type* p0 = (type*) out->image[y];\ -: 46: type* p1 = (type*) im1->image[y];\ -: 47: type* p2 = (type*) im2->image[y];\ -: 48: for (x = 0; x < out->xsize; x++) {\ -: 49: *p0 = op(type, *p1, *p2);\ -: 50: p0++; p1++; p2++;\ -: 51: }\ -: 52: }\ -: 53:} -: 54: -: 55:#define NEG(type, v1) -(v1) -: 56:#define INVERT(type, v1) ~(v1) -: 57: -: 58:#define ADD(type, v1, v2) (v1)+(v2) -: 59:#define SUB(type, v1, v2) (v1)-(v2) -: 60:#define MUL(type, v1, v2) (v1)*(v2) -: 61: -: 62:#define MIN(type, v1, v2) ((v1)<(v2))?(v1):(v2) -: 63:#define MAX(type, v1, v2) ((v1)>(v2))?(v1):(v2) -: 64: -: 65:#define AND(type, v1, v2) (v1)&(v2) -: 66:#define OR(type, v1, v2) (v1)|(v2) -: 67:#define XOR(type, v1, v2) (v1)^(v2) -: 68:#define LSHIFT(type, v1, v2) (v1)<<(v2) -: 69:#define RSHIFT(type, v1, v2) (v1)>>(v2) -: 70: -: 71:#define ABS_I(type, v1) abs((v1)) -: 72:#define ABS_F(type, v1) fabs((v1)) -: 73: -: 74:/* -------------------------------------------------------------------- -: 75: * some day, we should add FPE protection mechanisms. see pyfpe.h for -: 76: * details. -: 77: * -: 78: * PyFPE_START_PROTECT("Error in foobar", return 0) -: 79: * PyFPE_END_PROTECT(result) -: 80: */ -: 81: -: 82:#define DIV_I(type, v1, v2) ((v2)!=0)?(v1)/(v2):0 -: 83:#define DIV_F(type, v1, v2) ((v2)!=0.0F)?(v1)/(v2):0.0F -: 84: -: 85:#define MOD_I(type, v1, v2) ((v2)!=0)?(v1)%(v2):0 -: 86:#define MOD_F(type, v1, v2) ((v2)!=0.0F)?fmod((v1),(v2)):0.0F -: 87: function powi called 2 returned 100% blocks executed 100% 2: 88:static int powi(int x, int y) -: 89:{ 2: 90: double v = pow(x, y) + 0.5; 2: 91: if (errno == EDOM) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 92: return 0; -: 93: } 2: 94: if (v < MIN_INT32) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 95: v = MIN_INT32; 2: 96: } else if (v > MAX_INT32) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 1: 97: v = MAX_INT32; -: 98: } 2: 99: return (int) v; -: 100:} -: 101: -: 102:#define POW_I(type, v1, v2) powi(v1, v2) -: 103:#define POW_F(type, v1, v2) powf(v1, v2) /* FIXME: EDOM handling */ -: 104: -: 105:#define DIFF_I(type, v1, v2) abs((v1)-(v2)) -: 106:#define DIFF_F(type, v1, v2) fabs((v1)-(v2)) -: 107: -: 108:#define EQ(type, v1, v2) (v1)==(v2) -: 109:#define NE(type, v1, v2) (v1)!=(v2) -: 110:#define LT(type, v1, v2) (v1)<(v2) -: 111:#define LE(type, v1, v2) (v1)<=(v2) -: 112:#define GT(type, v1, v2) (v1)>(v2) -: 113:#define GE(type, v1, v2) (v1)>=(v2) -: 114: function abs_I called 1683 returned 100% blocks executed 100% 1683: 115:UNOP(abs_I, ABS_I, INT32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) function neg_I called 1 returned 100% blocks executed 100% 1: 116:UNOP(neg_I, NEG, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) -: 117: function add_I called 9 returned 100% blocks executed 100% 9: 118:BINOP(add_I, ADD, INT32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 94% branch 3 taken 6% (fallthrough) function sub_I called 1682 returned 100% blocks executed 100% 1682: 119:BINOP(sub_I, SUB, INT32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) function mul_I called 1 returned 100% blocks executed 100% 1: 120:BINOP(mul_I, MUL, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function div_I called 1 returned 100% blocks executed 100% 1: 121:BINOP(div_I, DIV_I, INT32) branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 50% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 50% (fallthrough) function mod_I called 6 returned 100% blocks executed 100% 6: 122:BINOP(mod_I, MOD_I, INT32) branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 50% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 50% (fallthrough) function pow_I called 2 returned 100% blocks executed 100% 2: 123:BINOP(pow_I, POW_I, INT32) call 0 returned 100% branch 1 taken 50% branch 2 taken 50% (fallthrough) branch 3 taken 50% branch 4 taken 50% (fallthrough) function diff_I called 0 returned 0% blocks executed 0% #####: 124:BINOP(diff_I, DIFF_I, INT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 125: function invert_I called 3 returned 100% blocks executed 100% 3: 126:UNOP(invert_I, INVERT, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function and_I called 4 returned 100% blocks executed 100% 4: 127:BINOP(and_I, AND, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function or_I called 4 returned 100% blocks executed 100% 4: 128:BINOP(or_I, OR, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function xor_I called 4 returned 100% blocks executed 100% 4: 129:BINOP(xor_I, XOR, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function lshift_I called 4 returned 100% blocks executed 100% 4: 130:BINOP(lshift_I, LSHIFT, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function rshift_I called 4 returned 100% blocks executed 100% 4: 131:BINOP(rshift_I, RSHIFT, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) -: 132: function min_I called 1 returned 100% blocks executed 100% 1: 133:BINOP(min_I, MIN, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function max_I called 1 returned 100% blocks executed 100% 1: 134:BINOP(max_I, MAX, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) -: 135: function eq_I called 12 returned 100% blocks executed 100% 12: 136:BINOP(eq_I, EQ, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function ne_I called 10 returned 100% blocks executed 100% 10: 137:BINOP(ne_I, NE, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function lt_I called 4 returned 100% blocks executed 100% 4: 138:BINOP(lt_I, LT, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function le_I called 4 returned 100% blocks executed 100% 4: 139:BINOP(le_I, LE, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function gt_I called 4 returned 100% blocks executed 100% 4: 140:BINOP(gt_I, GT, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function ge_I called 4 returned 100% blocks executed 100% 4: 141:BINOP(ge_I, GE, INT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) -: 142: function abs_F called 19 returned 100% blocks executed 100% 19: 143:UNOP(abs_F, ABS_F, FLOAT32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) function neg_F called 0 returned 0% blocks executed 0% #####: 144:UNOP(neg_F, NEG, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 145: function add_F called 3 returned 100% blocks executed 100% 3: 146:BINOP(add_F, ADD, FLOAT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function sub_F called 20 returned 100% blocks executed 100% 20: 147:BINOP(sub_F, SUB, FLOAT32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) function mul_F called 1 returned 100% blocks executed 100% 1: 148:BINOP(mul_F, MUL, FLOAT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function div_F called 1 returned 100% blocks executed 100% 1: 149:BINOP(div_F, DIV_F, FLOAT32) branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 50% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 50% (fallthrough) function mod_F called 0 returned 0% blocks executed 0% #####: 150:BINOP(mod_F, MOD_F, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed function pow_F called 2 returned 100% blocks executed 100% 2: 151:BINOP(pow_F, POW_F, FLOAT32) branch 0 taken 50% branch 1 taken 50% (fallthrough) branch 2 taken 50% branch 3 taken 50% (fallthrough) function diff_F called 0 returned 0% blocks executed 0% #####: 152:BINOP(diff_F, DIFF_F, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 153: function min_F called 0 returned 0% blocks executed 0% #####: 154:BINOP(min_F, MIN, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed function max_F called 0 returned 0% blocks executed 0% #####: 155:BINOP(max_F, MAX, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed -: 156: function eq_F called 0 returned 0% blocks executed 0% #####: 157:BINOP(eq_F, EQ, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed function ne_F called 0 returned 0% blocks executed 0% #####: 158:BINOP(ne_F, NE, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed function lt_F called 0 returned 0% blocks executed 0% #####: 159:BINOP(lt_F, LT, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed function le_F called 0 returned 0% blocks executed 0% #####: 160:BINOP(le_F, LE, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed function gt_F called 0 returned 0% blocks executed 0% #####: 161:BINOP(gt_F, GT, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed function ge_F called 0 returned 0% blocks executed 0% #####: 162:BINOP(ge_F, GE, FLOAT32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed -: 163: -: 164:static PyObject * function _unop called 1706 returned 100% blocks executed 100% 1706: 165:_unop(PyObject* self, PyObject* args) -: 166:{ -: 167: Imaging out; -: 168: Imaging im1; -: 169: void (*unop)(Imaging, Imaging); -: 170: -: 171: Py_ssize_t op, i0, i1; 1706: 172: if (!PyArg_ParseTuple(args, "nnn", &op, &i0, &i1)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 173: return NULL; -: 174: } -: 175: 1706: 176: out = (Imaging) i0; 1706: 177: im1 = (Imaging) i1; -: 178: 1706: 179: unop = (void*) op; -: 180: 1706: 181: unop(out, im1); call 0 returned 100% -: 182: 1706: 183: Py_INCREF(Py_None); 1706: 184: return Py_None; -: 185:} -: 186: -: 187:static PyObject * function _binop called 1788 returned 100% blocks executed 100% 1788: 188:_binop(PyObject* self, PyObject* args) -: 189:{ -: 190: Imaging out; -: 191: Imaging im1; -: 192: Imaging im2; -: 193: void (*binop)(Imaging, Imaging, Imaging); -: 194: -: 195: Py_ssize_t op, i0, i1, i2; 1788: 196: if (!PyArg_ParseTuple(args, "nnnn", &op, &i0, &i1, &i2)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 197: return NULL; -: 198: } -: 199: 1788: 200: out = (Imaging) i0; 1788: 201: im1 = (Imaging) i1; 1788: 202: im2 = (Imaging) i2; -: 203: 1788: 204: binop = (void*) op; -: 205: 1788: 206: binop(out, im1, im2); call 0 returned 100% -: 207: 1788: 208: Py_INCREF(Py_None); 1788: 209: return Py_None; -: 210:} -: 211: -: 212:static PyMethodDef _functions[] = { -: 213: {"unop", _unop, 1}, -: 214: {"binop", _binop, 1}, -: 215: {NULL, NULL} -: 216:}; -: 217: -: 218:static void function install called 80 returned 100% blocks executed 78% 80: 219:install(PyObject *d, char* name, void* value) -: 220:{ 80: 221: PyObject *v = PyLong_FromSsize_t((Py_ssize_t) value); call 0 returned 100% 80: 222: if (!v || PyDict_SetItemString(d, name, v)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% branch 3 taken 0% (fallthrough) branch 4 taken 100% #####: 223: PyErr_Clear(); call 0 never executed -: 224: } 80: 225: Py_XDECREF(v); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% call 4 never executed 80: 226:} -: 227: -: 228:static int function setup_module called 2 returned 100% blocks executed 100% 2: 229:setup_module(PyObject* m) { 2: 230: PyObject* d = PyModule_GetDict(m); call 0 returned 100% -: 231: 2: 232: install(d, "abs_I", abs_I); call 0 returned 100% 2: 233: install(d, "neg_I", neg_I); call 0 returned 100% 2: 234: install(d, "add_I", add_I); call 0 returned 100% 2: 235: install(d, "sub_I", sub_I); call 0 returned 100% 2: 236: install(d, "diff_I", diff_I); call 0 returned 100% 2: 237: install(d, "mul_I", mul_I); call 0 returned 100% 2: 238: install(d, "div_I", div_I); call 0 returned 100% 2: 239: install(d, "mod_I", mod_I); call 0 returned 100% 2: 240: install(d, "min_I", min_I); call 0 returned 100% 2: 241: install(d, "max_I", max_I); call 0 returned 100% 2: 242: install(d, "pow_I", pow_I); call 0 returned 100% -: 243: 2: 244: install(d, "invert_I", invert_I); call 0 returned 100% 2: 245: install(d, "and_I", and_I); call 0 returned 100% 2: 246: install(d, "or_I", or_I); call 0 returned 100% 2: 247: install(d, "xor_I", xor_I); call 0 returned 100% 2: 248: install(d, "lshift_I", lshift_I); call 0 returned 100% 2: 249: install(d, "rshift_I", rshift_I); call 0 returned 100% -: 250: 2: 251: install(d, "eq_I", eq_I); call 0 returned 100% 2: 252: install(d, "ne_I", ne_I); call 0 returned 100% 2: 253: install(d, "lt_I", lt_I); call 0 returned 100% 2: 254: install(d, "le_I", le_I); call 0 returned 100% 2: 255: install(d, "gt_I", gt_I); call 0 returned 100% 2: 256: install(d, "ge_I", ge_I); call 0 returned 100% -: 257: 2: 258: install(d, "abs_F", abs_F); call 0 returned 100% 2: 259: install(d, "neg_F", neg_F); call 0 returned 100% 2: 260: install(d, "add_F", add_F); call 0 returned 100% 2: 261: install(d, "sub_F", sub_F); call 0 returned 100% 2: 262: install(d, "diff_F", diff_F); call 0 returned 100% 2: 263: install(d, "mul_F", mul_F); call 0 returned 100% 2: 264: install(d, "div_F", div_F); call 0 returned 100% 2: 265: install(d, "mod_F", mod_F); call 0 returned 100% 2: 266: install(d, "min_F", min_F); call 0 returned 100% 2: 267: install(d, "max_F", max_F); call 0 returned 100% 2: 268: install(d, "pow_F", pow_F); call 0 returned 100% -: 269: 2: 270: install(d, "eq_F", eq_F); call 0 returned 100% 2: 271: install(d, "ne_F", ne_F); call 0 returned 100% 2: 272: install(d, "lt_F", lt_F); call 0 returned 100% 2: 273: install(d, "le_F", le_F); call 0 returned 100% 2: 274: install(d, "gt_F", gt_F); call 0 returned 100% 2: 275: install(d, "ge_F", ge_F); call 0 returned 100% -: 276: 2: 277: return 0; -: 278:} -: 279: -: 280:PyMODINIT_FUNC function PyInit__imagingmath called 2 returned 100% blocks executed 100% 2: 281:PyInit__imagingmath(void) { -: 282: PyObject* m; -: 283: -: 284: static PyModuleDef module_def = { -: 285: PyModuleDef_HEAD_INIT, -: 286: "_imagingmath", /* m_name */ -: 287: NULL, /* m_doc */ -: 288: -1, /* m_size */ -: 289: _functions, /* m_methods */ -: 290: }; -: 291: 2: 292: m = PyModule_Create(&module_def); call 0 returned 100% -: 293: 2: 294: if (setup_module(m) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 295: return NULL; -: 296: } -: 297: 2: 298: return m; -: 299:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Access.c.gcov -: 0:Source:src/libImaging/Access.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Access.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Access.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * imaging access objects -: 6: * -: 7: * Copyright (c) Fredrik Lundh 2009. -: 8: * -: 9: * See the README file for information on usage and redistribution. -: 10: */ -: 11: -: 12: -: 13:#include "Imaging.h" -: 14: -: 15:/* use Tests/make_hash.py to calculate these values */ -: 16:#define ACCESS_TABLE_SIZE 27 -: 17:#define ACCESS_TABLE_HASH 3078 -: 18: -: 19:static struct ImagingAccessInstance access_table[ACCESS_TABLE_SIZE]; -: 20: -: 21:static inline UINT32 -: 22:hash(const char* mode) -: 23:{ 53080: 24: UINT32 i = ACCESS_TABLE_HASH; 145245: 25: while (*mode) { branch 0 taken 63% branch 1 taken 37% (fallthrough) branch 2 taken 76% branch 3 taken 24% (fallthrough) 92165: 26: i = ((i<<5) + i) ^ (UINT8) *mode++; -: 27: } 53080: 28: return i % ACCESS_TABLE_SIZE; -: 29:} -: 30: -: 31:static ImagingAccess function add_item called 63 returned 100% blocks executed 63% 63: 32:add_item(const char* mode) -: 33:{ 63: 34: UINT32 i = hash(mode); -: 35: /* printf("hash %s => %d\n", mode, i); */ 63: 36: if (access_table[i].mode && strcmp(access_table[i].mode, mode) != 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed #####: 37: fprintf(stderr, "AccessInit: hash collision: %d for both %s and %s\n", -: 38: i, mode, access_table[i].mode); #####: 39: exit(1); call 0 never executed -: 40: } 63: 41: access_table[i].mode = mode; 63: 42: return &access_table[i]; -: 43:} -: 44: -: 45:/* fetch pointer to pixel line */ -: 46: -: 47:static void* function line_8 called 0 returned 0% blocks executed 0% #####: 48:line_8(Imaging im, int x, int y) -: 49:{ #####: 50: return &im->image8[y][x]; -: 51:} -: 52: -: 53:static void* function line_16 called 0 returned 0% blocks executed 0% #####: 54:line_16(Imaging im, int x, int y) -: 55:{ #####: 56: return &im->image8[y][x+x]; -: 57:} -: 58: -: 59:static void* function line_32 called 0 returned 0% blocks executed 0% #####: 60:line_32(Imaging im, int x, int y) -: 61:{ #####: 62: return &im->image32[y][x]; -: 63:} -: 64: -: 65:/* fetch individual pixel */ -: 66: -: 67:static void function get_pixel called 30335 returned 100% blocks executed 71% 30335: 68:get_pixel(Imaging im, int x, int y, void* color) -: 69:{ 30335: 70: char* out = color; -: 71: -: 72: /* generic pixel access*/ -: 73: 30335: 74: if (im->image8) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 75: out[0] = im->image8[y][x]; -: 76: } else { 30335: 77: UINT8* p = (UINT8*) &im->image32[y][x]; 30335: 78: if (im->type == IMAGING_TYPE_UINT8 && im->bands == 2) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 30335: 79: out[0] = p[0]; 30335: 80: out[1] = p[3]; 30335: 81: return; -: 82: } #####: 83: memcpy(out, p, im->pixelsize); -: 84: } -: 85:} -: 86: -: 87:static void function get_pixel_8 called 4120100 returned 100% blocks executed 100% 4120100: 88:get_pixel_8(Imaging im, int x, int y, void* color) -: 89:{ 4120100: 90: char* out = color; 4120100: 91: out[0] = im->image8[y][x]; 4120100: 92:} -: 93: -: 94:static void function get_pixel_16L called 18034 returned 100% blocks executed 100% 18034: 95:get_pixel_16L(Imaging im, int x, int y, void* color) -: 96:{ 18034: 97: UINT8* in = (UINT8*) &im->image[y][x+x]; -: 98:#ifdef WORDS_BIGENDIAN -: 99: UINT16 out = in[0] + (in[1]<<8); -: 100: memcpy(color, &out, sizeof(out)); -: 101:#else 18034: 102: memcpy(color, in, sizeof(UINT16)); -: 103:#endif 18034: 104:} -: 105: -: 106:static void function get_pixel_16B called 9426 returned 100% blocks executed 100% 9426: 107:get_pixel_16B(Imaging im, int x, int y, void* color) -: 108:{ 9426: 109: UINT8* in = (UINT8*) &im->image[y][x+x]; -: 110:#ifdef WORDS_BIGENDIAN -: 111: memcpy(color, in, sizeof(UINT16)); -: 112:#else 9426: 113: UINT16 out = in[1] + (in[0]<<8); 9426: 114: memcpy(color, &out, sizeof(out)); -: 115:#endif 9426: 116:} -: 117: -: 118:static void function get_pixel_32 called 463561 returned 100% blocks executed 100% 463561: 119:get_pixel_32(Imaging im, int x, int y, void* color) -: 120:{ 927122: 121: memcpy(color, &im->image32[y][x], sizeof(INT32)); 463561: 122:} -: 123: -: 124:static void function get_pixel_32L called 0 returned 0% blocks executed 0% #####: 125:get_pixel_32L(Imaging im, int x, int y, void* color) -: 126:{ #####: 127: UINT8* in = (UINT8*) &im->image[y][x*4]; -: 128:#ifdef WORDS_BIGENDIAN -: 129: INT32 out = in[0] + (in[1]<<8) + (in[2]<<16) + (in[3]<<24); -: 130: memcpy(color, &out, sizeof(out)); -: 131:#else #####: 132: memcpy(color, in, sizeof(INT32)); -: 133:#endif #####: 134:} -: 135: -: 136:static void function get_pixel_32B called 0 returned 0% blocks executed 0% #####: 137:get_pixel_32B(Imaging im, int x, int y, void* color) -: 138:{ #####: 139: UINT8* in = (UINT8*) &im->image[y][x*4]; -: 140:#ifdef WORDS_BIGENDIAN -: 141: memcpy(color, in, sizeof(INT32)); -: 142:#else #####: 143: INT32 out = in[3] + (in[2]<<8) + (in[1]<<16) + (in[0]<<24); #####: 144: memcpy(color, &out, sizeof(out)); -: 145:#endif #####: 146:} -: 147: -: 148:/* store individual pixel */ -: 149: -: 150:static void function put_pixel called 5139 returned 100% blocks executed 75% 5139: 151:put_pixel(Imaging im, int x, int y, const void* color) -: 152:{ 5139: 153: if (im->image8) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 154: im->image8[y][x] = *((UINT8*) color); -: 155: } else { 5139: 156: memcpy(&im->image32[y][x], color, sizeof(INT32)); -: 157: } 5139: 158:} -: 159: -: 160:static void function put_pixel_8 called 211306 returned 100% blocks executed 100% 211306: 161:put_pixel_8(Imaging im, int x, int y, const void* color) -: 162:{ 211306: 163: im->image8[y][x] = *((UINT8*) color); 211306: 164:} -: 165: -: 166:static void function put_pixel_16L called 10546 returned 100% blocks executed 100% 10546: 167:put_pixel_16L(Imaging im, int x, int y, const void* color) -: 168:{ 21092: 169: memcpy(&im->image8[y][x+x], color, 2); 10546: 170:} -: 171: -: 172:static void function put_pixel_16B called 232 returned 100% blocks executed 100% 232: 173:put_pixel_16B(Imaging im, int x, int y, const void* color) -: 174:{ 232: 175: const char* in = color; 232: 176: UINT8* out = (UINT8*) &im->image8[y][x+x]; 232: 177: out[0] = in[1]; 232: 178: out[1] = in[0]; 232: 179:} -: 180: -: 181:static void function put_pixel_32L called 0 returned 0% blocks executed 0% #####: 182:put_pixel_32L(Imaging im, int x, int y, const void* color) -: 183:{ #####: 184: memcpy(&im->image8[y][x*4], color, 4); #####: 185:} -: 186: -: 187:static void function put_pixel_32B called 0 returned 0% blocks executed 0% #####: 188:put_pixel_32B(Imaging im, int x, int y, const void* color) -: 189:{ #####: 190: const char* in = color; #####: 191: UINT8* out = (UINT8*) &im->image8[y][x*4]; #####: 192: out[0] = in[3]; #####: 193: out[1] = in[2]; #####: 194: out[2] = in[1]; #####: 195: out[3] = in[0]; #####: 196:} -: 197: -: 198:static void function put_pixel_32 called 141120 returned 100% blocks executed 100% 141120: 199:put_pixel_32(Imaging im, int x, int y, const void* color) -: 200:{ 282240: 201: memcpy(&im->image32[y][x], color, sizeof(INT32)); 141120: 202:} -: 203: -: 204:void function ImagingAccessInit called 3 returned 100% blocks executed 100% 3: 205:ImagingAccessInit() -: 206:{ -: 207:#define ADD(mode_, line_, get_pixel_, put_pixel_) \ -: 208: { ImagingAccess access = add_item(mode_); \ -: 209: access->line = line_; \ -: 210: access->get_pixel = get_pixel_; \ -: 211: access->put_pixel = put_pixel_; \ -: 212: } -: 213: -: 214: /* populate access table */ 3: 215: ADD("1", line_8, get_pixel_8, put_pixel_8); call 0 returned 100% 3: 216: ADD("L", line_8, get_pixel_8, put_pixel_8); call 0 returned 100% 3: 217: ADD("LA", line_32, get_pixel, put_pixel); call 0 returned 100% 3: 218: ADD("La", line_32, get_pixel, put_pixel); call 0 returned 100% 3: 219: ADD("I", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 220: ADD("I;16", line_16, get_pixel_16L, put_pixel_16L); call 0 returned 100% 3: 221: ADD("I;16L", line_16, get_pixel_16L, put_pixel_16L); call 0 returned 100% 3: 222: ADD("I;16B", line_16, get_pixel_16B, put_pixel_16B); call 0 returned 100% 3: 223: ADD("I;32L", line_32, get_pixel_32L, put_pixel_32L); call 0 returned 100% 3: 224: ADD("I;32B", line_32, get_pixel_32B, put_pixel_32B); call 0 returned 100% 3: 225: ADD("F", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 226: ADD("P", line_8, get_pixel_8, put_pixel_8); call 0 returned 100% 3: 227: ADD("PA", line_32, get_pixel, put_pixel); call 0 returned 100% 3: 228: ADD("RGB", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 229: ADD("RGBA", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 230: ADD("RGBa", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 231: ADD("RGBX", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 232: ADD("CMYK", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 233: ADD("YCbCr", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 234: ADD("LAB", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 235: ADD("HSV", line_32, get_pixel_32, put_pixel_32); call 0 returned 100% 3: 236:} -: 237: -: 238:ImagingAccess function ImagingAccessNew called 53017 returned 100% blocks executed 100% 53017: 239:ImagingAccessNew(Imaging im) -: 240:{ 106034: 241: ImagingAccess access = &access_table[hash(im->mode)]; 53017: 242: if (im->mode[0] != access->mode[0] || strcmp(im->mode, access->mode) != 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 243: return NULL; -: 244: } 53010: 245: return access; -: 246:} -: 247: -: 248:void function _ImagingAccessDelete called 0 returned 0% blocks executed 0% #####: 249:_ImagingAccessDelete(Imaging im, ImagingAccess access) -: 250:{ -: 251: #####: 252:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/#usr#include#powerpc64le-linux-gnu#bits#stdio2.h.gcov -: 0:Source:/usr/include/powerpc64le-linux-gnu/bits/stdio2.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Access.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Access.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* Checking macros for stdio functions. -: 2: Copyright (C) 2004-2016 Free Software Foundation, Inc. -: 3: This file is part of the GNU C Library. -: 4: -: 5: The GNU C Library is free software; you can redistribute it and/or -: 6: modify it under the terms of the GNU Lesser General Public -: 7: License as published by the Free Software Foundation; either -: 8: version 2.1 of the License, or (at your option) any later version. -: 9: -: 10: The GNU C Library is distributed in the hope that it will be useful, -: 11: but WITHOUT ANY WARRANTY; without even the implied warranty of -: 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -: 13: Lesser General Public License for more details. -: 14: -: 15: You should have received a copy of the GNU Lesser General Public -: 16: License along with the GNU C Library; if not, see -: 17: . */ -: 18: -: 19:#ifndef _STDIO_H -: 20:# error "Never include directly; use instead." -: 21:#endif -: 22: -: 23:extern int __sprintf_chk (char *__restrict __s, int __flag, size_t __slen, -: 24: const char *__restrict __format, ...) __THROW; -: 25:extern int __vsprintf_chk (char *__restrict __s, int __flag, size_t __slen, -: 26: const char *__restrict __format, -: 27: _G_va_list __ap) __THROW; -: 28: -: 29:#ifdef __va_arg_pack -: 30:__fortify_function int -: 31:__NTH (sprintf (char *__restrict __s, const char *__restrict __fmt, ...)) -: 32:{ -: 33: return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1, -: 34: __bos (__s), __fmt, __va_arg_pack ()); -: 35:} -: 36:#elif !defined __cplusplus -: 37:# define sprintf(str, ...) \ -: 38: __builtin___sprintf_chk (str, __USE_FORTIFY_LEVEL - 1, __bos (str), \ -: 39: __VA_ARGS__) -: 40:#endif -: 41: -: 42:__fortify_function int -: 43:__NTH (vsprintf (char *__restrict __s, const char *__restrict __fmt, -: 44: _G_va_list __ap)) -: 45:{ -: 46: return __builtin___vsprintf_chk (__s, __USE_FORTIFY_LEVEL - 1, -: 47: __bos (__s), __fmt, __ap); -: 48:} -: 49: -: 50:#if defined __USE_ISOC99 || defined __USE_UNIX98 -: 51: -: 52:extern int __snprintf_chk (char *__restrict __s, size_t __n, int __flag, -: 53: size_t __slen, const char *__restrict __format, -: 54: ...) __THROW; -: 55:extern int __vsnprintf_chk (char *__restrict __s, size_t __n, int __flag, -: 56: size_t __slen, const char *__restrict __format, -: 57: _G_va_list __ap) __THROW; -: 58: -: 59:# ifdef __va_arg_pack -: 60:__fortify_function int -: 61:__NTH (snprintf (char *__restrict __s, size_t __n, -: 62: const char *__restrict __fmt, ...)) -: 63:{ -: 64: return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, -: 65: __bos (__s), __fmt, __va_arg_pack ()); -: 66:} -: 67:# elif !defined __cplusplus -: 68:# define snprintf(str, len, ...) \ -: 69: __builtin___snprintf_chk (str, len, __USE_FORTIFY_LEVEL - 1, __bos (str), \ -: 70: __VA_ARGS__) -: 71:# endif -: 72: -: 73:__fortify_function int -: 74:__NTH (vsnprintf (char *__restrict __s, size_t __n, -: 75: const char *__restrict __fmt, _G_va_list __ap)) -: 76:{ -: 77: return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, -: 78: __bos (__s), __fmt, __ap); -: 79:} -: 80: -: 81:#endif -: 82: -: 83:#if __USE_FORTIFY_LEVEL > 1 -: 84: -: 85:extern int __fprintf_chk (FILE *__restrict __stream, int __flag, -: 86: const char *__restrict __format, ...); -: 87:extern int __printf_chk (int __flag, const char *__restrict __format, ...); -: 88:extern int __vfprintf_chk (FILE *__restrict __stream, int __flag, -: 89: const char *__restrict __format, _G_va_list __ap); -: 90:extern int __vprintf_chk (int __flag, const char *__restrict __format, -: 91: _G_va_list __ap); -: 92: -: 93:# ifdef __va_arg_pack -: 94:__fortify_function int -: 95:fprintf (FILE *__restrict __stream, const char *__restrict __fmt, ...) -: 96:{ #####: 97: return __fprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, call 0 never executed -: 98: __va_arg_pack ()); -: 99:} -: 100: -: 101:__fortify_function int -: 102:printf (const char *__restrict __fmt, ...) -: 103:{ -: 104: return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ()); -: 105:} -: 106:# elif !defined __cplusplus -: 107:# define printf(...) \ -: 108: __printf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__) -: 109:# define fprintf(stream, ...) \ -: 110: __fprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__) -: 111:# endif -: 112: -: 113:__fortify_function int -: 114:vprintf (const char *__restrict __fmt, _G_va_list __ap) -: 115:{ -: 116:#ifdef __USE_EXTERN_INLINES -: 117: return __vfprintf_chk (stdout, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); -: 118:#else -: 119: return __vprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap); -: 120:#endif -: 121:} -: 122: -: 123:__fortify_function int -: 124:vfprintf (FILE *__restrict __stream, -: 125: const char *__restrict __fmt, _G_va_list __ap) -: 126:{ -: 127: return __vfprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); -: 128:} -: 129: -: 130:# ifdef __USE_XOPEN2K8 -: 131:extern int __dprintf_chk (int __fd, int __flag, const char *__restrict __fmt, -: 132: ...) __attribute__ ((__format__ (__printf__, 3, 4))); -: 133:extern int __vdprintf_chk (int __fd, int __flag, -: 134: const char *__restrict __fmt, _G_va_list __arg) -: 135: __attribute__ ((__format__ (__printf__, 3, 0))); -: 136: -: 137:# ifdef __va_arg_pack -: 138:__fortify_function int -: 139:dprintf (int __fd, const char *__restrict __fmt, ...) -: 140:{ -: 141: return __dprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt, -: 142: __va_arg_pack ()); -: 143:} -: 144:# elif !defined __cplusplus -: 145:# define dprintf(fd, ...) \ -: 146: __dprintf_chk (fd, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__) -: 147:# endif -: 148: -: 149:__fortify_function int -: 150:vdprintf (int __fd, const char *__restrict __fmt, _G_va_list __ap) -: 151:{ -: 152: return __vdprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); -: 153:} -: 154:# endif -: 155: -: 156:# ifdef __USE_GNU -: 157: -: 158:extern int __asprintf_chk (char **__restrict __ptr, int __flag, -: 159: const char *__restrict __fmt, ...) -: 160: __THROW __attribute__ ((__format__ (__printf__, 3, 4))) __wur; -: 161:extern int __vasprintf_chk (char **__restrict __ptr, int __flag, -: 162: const char *__restrict __fmt, _G_va_list __arg) -: 163: __THROW __attribute__ ((__format__ (__printf__, 3, 0))) __wur; -: 164:extern int __obstack_printf_chk (struct obstack *__restrict __obstack, -: 165: int __flag, const char *__restrict __format, -: 166: ...) -: 167: __THROW __attribute__ ((__format__ (__printf__, 3, 4))); -: 168:extern int __obstack_vprintf_chk (struct obstack *__restrict __obstack, -: 169: int __flag, -: 170: const char *__restrict __format, -: 171: _G_va_list __args) -: 172: __THROW __attribute__ ((__format__ (__printf__, 3, 0))); -: 173: -: 174:# ifdef __va_arg_pack -: 175:__fortify_function int -: 176:__NTH (asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...)) -: 177:{ -: 178: return __asprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt, -: 179: __va_arg_pack ()); -: 180:} -: 181: -: 182:__fortify_function int -: 183:__NTH (__asprintf (char **__restrict __ptr, const char *__restrict __fmt, -: 184: ...)) -: 185:{ -: 186: return __asprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt, -: 187: __va_arg_pack ()); -: 188:} -: 189: -: 190:__fortify_function int -: 191:__NTH (obstack_printf (struct obstack *__restrict __obstack, -: 192: const char *__restrict __fmt, ...)) -: 193:{ -: 194: return __obstack_printf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt, -: 195: __va_arg_pack ()); -: 196:} -: 197:# elif !defined __cplusplus -: 198:# define asprintf(ptr, ...) \ -: 199: __asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__) -: 200:# define __asprintf(ptr, ...) \ -: 201: __asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__) -: 202:# define obstack_printf(obstack, ...) \ -: 203: __obstack_printf_chk (obstack, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__) -: 204:# endif -: 205: -: 206:__fortify_function int -: 207:__NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt, -: 208: _G_va_list __ap)) -: 209:{ -: 210: return __vasprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); -: 211:} -: 212: -: 213:__fortify_function int -: 214:__NTH (obstack_vprintf (struct obstack *__restrict __obstack, -: 215: const char *__restrict __fmt, _G_va_list __ap)) -: 216:{ -: 217: return __obstack_vprintf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt, -: 218: __ap); -: 219:} -: 220: -: 221:# endif -: 222: -: 223:#endif -: 224: -: 225:#if !defined __USE_ISOC11 \ -: 226: || (defined __cplusplus && __cplusplus <= 201103L && !defined __USE_GNU) -: 227:extern char *__gets_chk (char *__str, size_t) __wur; -: 228:extern char *__REDIRECT (__gets_warn, (char *__str), gets) -: 229: __wur __warnattr ("please use fgets or getline instead, gets can't " -: 230: "specify buffer size"); -: 231: -: 232:__fortify_function __wur char * -: 233:gets (char *__str) -: 234:{ -: 235: if (__bos (__str) != (size_t) -1) -: 236: return __gets_chk (__str, __bos (__str)); -: 237: return __gets_warn (__str); -: 238:} -: 239:#endif -: 240: -: 241:extern char *__fgets_chk (char *__restrict __s, size_t __size, int __n, -: 242: FILE *__restrict __stream) __wur; -: 243:extern char *__REDIRECT (__fgets_alias, -: 244: (char *__restrict __s, int __n, -: 245: FILE *__restrict __stream), fgets) __wur; -: 246:extern char *__REDIRECT (__fgets_chk_warn, -: 247: (char *__restrict __s, size_t __size, int __n, -: 248: FILE *__restrict __stream), __fgets_chk) -: 249: __wur __warnattr ("fgets called with bigger size than length " -: 250: "of destination buffer"); -: 251: -: 252:__fortify_function __wur char * -: 253:fgets (char *__restrict __s, int __n, FILE *__restrict __stream) -: 254:{ -: 255: if (__bos (__s) != (size_t) -1) -: 256: { -: 257: if (!__builtin_constant_p (__n) || __n <= 0) -: 258: return __fgets_chk (__s, __bos (__s), __n, __stream); -: 259: -: 260: if ((size_t) __n > __bos (__s)) -: 261: return __fgets_chk_warn (__s, __bos (__s), __n, __stream); -: 262: } -: 263: return __fgets_alias (__s, __n, __stream); -: 264:} -: 265: -: 266:extern size_t __fread_chk (void *__restrict __ptr, size_t __ptrlen, -: 267: size_t __size, size_t __n, -: 268: FILE *__restrict __stream) __wur; -: 269:extern size_t __REDIRECT (__fread_alias, -: 270: (void *__restrict __ptr, size_t __size, -: 271: size_t __n, FILE *__restrict __stream), -: 272: fread) __wur; -: 273:extern size_t __REDIRECT (__fread_chk_warn, -: 274: (void *__restrict __ptr, size_t __ptrlen, -: 275: size_t __size, size_t __n, -: 276: FILE *__restrict __stream), -: 277: __fread_chk) -: 278: __wur __warnattr ("fread called with bigger size * nmemb than length " -: 279: "of destination buffer"); -: 280: -: 281:__fortify_function __wur size_t -: 282:fread (void *__restrict __ptr, size_t __size, size_t __n, -: 283: FILE *__restrict __stream) -: 284:{ -: 285: if (__bos0 (__ptr) != (size_t) -1) -: 286: { -: 287: if (!__builtin_constant_p (__size) -: 288: || !__builtin_constant_p (__n) -: 289: || (__size | __n) >= (((size_t) 1) << (8 * sizeof (size_t) / 2))) -: 290: return __fread_chk (__ptr, __bos0 (__ptr), __size, __n, __stream); -: 291: -: 292: if (__size * __n > __bos0 (__ptr)) -: 293: return __fread_chk_warn (__ptr, __bos0 (__ptr), __size, __n, __stream); -: 294: } -: 295: return __fread_alias (__ptr, __size, __n, __stream); -: 296:} -: 297: -: 298:#ifdef __USE_GNU -: 299:extern char *__fgets_unlocked_chk (char *__restrict __s, size_t __size, -: 300: int __n, FILE *__restrict __stream) __wur; -: 301:extern char *__REDIRECT (__fgets_unlocked_alias, -: 302: (char *__restrict __s, int __n, -: 303: FILE *__restrict __stream), fgets_unlocked) __wur; -: 304:extern char *__REDIRECT (__fgets_unlocked_chk_warn, -: 305: (char *__restrict __s, size_t __size, int __n, -: 306: FILE *__restrict __stream), __fgets_unlocked_chk) -: 307: __wur __warnattr ("fgets_unlocked called with bigger size than length " -: 308: "of destination buffer"); -: 309: -: 310:__fortify_function __wur char * -: 311:fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream) -: 312:{ -: 313: if (__bos (__s) != (size_t) -1) -: 314: { -: 315: if (!__builtin_constant_p (__n) || __n <= 0) -: 316: return __fgets_unlocked_chk (__s, __bos (__s), __n, __stream); -: 317: -: 318: if ((size_t) __n > __bos (__s)) -: 319: return __fgets_unlocked_chk_warn (__s, __bos (__s), __n, __stream); -: 320: } -: 321: return __fgets_unlocked_alias (__s, __n, __stream); -: 322:} -: 323:#endif -: 324: -: 325:#ifdef __USE_MISC -: 326:# undef fread_unlocked -: 327:extern size_t __fread_unlocked_chk (void *__restrict __ptr, size_t __ptrlen, -: 328: size_t __size, size_t __n, -: 329: FILE *__restrict __stream) __wur; -: 330:extern size_t __REDIRECT (__fread_unlocked_alias, -: 331: (void *__restrict __ptr, size_t __size, -: 332: size_t __n, FILE *__restrict __stream), -: 333: fread_unlocked) __wur; -: 334:extern size_t __REDIRECT (__fread_unlocked_chk_warn, -: 335: (void *__restrict __ptr, size_t __ptrlen, -: 336: size_t __size, size_t __n, -: 337: FILE *__restrict __stream), -: 338: __fread_unlocked_chk) -: 339: __wur __warnattr ("fread_unlocked called with bigger size * nmemb than " -: 340: "length of destination buffer"); -: 341: -: 342:__fortify_function __wur size_t -: 343:fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, -: 344: FILE *__restrict __stream) -: 345:{ -: 346: if (__bos0 (__ptr) != (size_t) -1) -: 347: { -: 348: if (!__builtin_constant_p (__size) -: 349: || !__builtin_constant_p (__n) -: 350: || (__size | __n) >= (((size_t) 1) << (8 * sizeof (size_t) / 2))) -: 351: return __fread_unlocked_chk (__ptr, __bos0 (__ptr), __size, __n, -: 352: __stream); -: 353: -: 354: if (__size * __n > __bos0 (__ptr)) -: 355: return __fread_unlocked_chk_warn (__ptr, __bos0 (__ptr), __size, __n, -: 356: __stream); -: 357: } -: 358: -: 359:# ifdef __USE_EXTERN_INLINES -: 360: if (__builtin_constant_p (__size) -: 361: && __builtin_constant_p (__n) -: 362: && (__size | __n) < (((size_t) 1) << (8 * sizeof (size_t) / 2)) -: 363: && __size * __n <= 8) -: 364: { -: 365: size_t __cnt = __size * __n; -: 366: char *__cptr = (char *) __ptr; -: 367: if (__cnt == 0) -: 368: return 0; -: 369: -: 370: for (; __cnt > 0; --__cnt) -: 371: { -: 372: int __c = _IO_getc_unlocked (__stream); -: 373: if (__c == EOF) -: 374: break; -: 375: *__cptr++ = __c; -: 376: } -: 377: return (__cptr - (char *) __ptr) / __size; -: 378: } -: 379:# endif -: 380: return __fread_unlocked_alias (__ptr, __size, __n, __stream); -: 381:} -: 382:#endif <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/#usr#include#webp#encode.h.gcov -: 0:Source:/usr/include/webp/encode.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:// Copyright 2011 Google Inc. All Rights Reserved. -: 2:// -: 3:// Use of this source code is governed by a BSD-style license -: 4:// that can be found in the COPYING file in the root of the source -: 5:// tree. An additional intellectual property rights grant can be found -: 6:// in the file PATENTS. All contributing project authors may -: 7:// be found in the AUTHORS file in the root of the source tree. -: 8:// ----------------------------------------------------------------------------- -: 9:// -: 10:// WebP encoder: main interface -: 11:// -: 12:// Author: Skal (pascal.massimino@gmail.com) -: 13: -: 14:#ifndef WEBP_WEBP_ENCODE_H_ -: 15:#define WEBP_WEBP_ENCODE_H_ -: 16: -: 17:#include "./types.h" -: 18: -: 19:#ifdef __cplusplus -: 20:extern "C" { -: 21:#endif -: 22: -: 23:#define WEBP_ENCODER_ABI_VERSION 0x020f // MAJOR(8b) + MINOR(8b) -: 24: -: 25:// Note: forward declaring enumerations is not allowed in (strict) C and C++, -: 26:// the types are left here for reference. -: 27:// typedef enum WebPImageHint WebPImageHint; -: 28:// typedef enum WebPEncCSP WebPEncCSP; -: 29:// typedef enum WebPPreset WebPPreset; -: 30:// typedef enum WebPEncodingError WebPEncodingError; -: 31:typedef struct WebPConfig WebPConfig; -: 32:typedef struct WebPPicture WebPPicture; // main structure for I/O -: 33:typedef struct WebPAuxStats WebPAuxStats; -: 34:typedef struct WebPMemoryWriter WebPMemoryWriter; -: 35: -: 36:// Return the encoder's version number, packed in hexadecimal using 8bits for -: 37:// each of major/minor/revision. E.g: v2.5.7 is 0x020507. -: 38:WEBP_EXTERN int WebPGetEncoderVersion(void); -: 39: -: 40://------------------------------------------------------------------------------ -: 41:// One-stop-shop call! No questions asked: -: 42: -: 43:// Returns the size of the compressed data (pointed to by *output), or 0 if -: 44:// an error occurred. The compressed data must be released by the caller -: 45:// using the call 'WebPFree(*output)'. -: 46:// These functions compress using the lossy format, and the quality_factor -: 47:// can go from 0 (smaller output, lower quality) to 100 (best quality, -: 48:// larger output). -: 49:WEBP_EXTERN size_t WebPEncodeRGB(const uint8_t* rgb, -: 50: int width, int height, int stride, -: 51: float quality_factor, uint8_t** output); -: 52:WEBP_EXTERN size_t WebPEncodeBGR(const uint8_t* bgr, -: 53: int width, int height, int stride, -: 54: float quality_factor, uint8_t** output); -: 55:WEBP_EXTERN size_t WebPEncodeRGBA(const uint8_t* rgba, -: 56: int width, int height, int stride, -: 57: float quality_factor, uint8_t** output); -: 58:WEBP_EXTERN size_t WebPEncodeBGRA(const uint8_t* bgra, -: 59: int width, int height, int stride, -: 60: float quality_factor, uint8_t** output); -: 61: -: 62:// These functions are the equivalent of the above, but compressing in a -: 63:// lossless manner. Files are usually larger than lossy format, but will -: 64:// not suffer any compression loss. -: 65:// Note these functions, like the lossy versions, use the library's default -: 66:// settings. For lossless this means 'exact' is disabled. RGB values in -: 67:// transparent areas will be modified to improve compression. To avoid this, -: 68:// use WebPEncode() and set WebPConfig::exact to 1. -: 69:WEBP_EXTERN size_t WebPEncodeLosslessRGB(const uint8_t* rgb, -: 70: int width, int height, int stride, -: 71: uint8_t** output); -: 72:WEBP_EXTERN size_t WebPEncodeLosslessBGR(const uint8_t* bgr, -: 73: int width, int height, int stride, -: 74: uint8_t** output); -: 75:WEBP_EXTERN size_t WebPEncodeLosslessRGBA(const uint8_t* rgba, -: 76: int width, int height, int stride, -: 77: uint8_t** output); -: 78:WEBP_EXTERN size_t WebPEncodeLosslessBGRA(const uint8_t* bgra, -: 79: int width, int height, int stride, -: 80: uint8_t** output); -: 81: -: 82://------------------------------------------------------------------------------ -: 83:// Coding parameters -: 84: -: 85:// Image characteristics hint for the underlying encoder. -: 86:typedef enum WebPImageHint { -: 87: WEBP_HINT_DEFAULT = 0, // default preset. -: 88: WEBP_HINT_PICTURE, // digital picture, like portrait, inner shot -: 89: WEBP_HINT_PHOTO, // outdoor photograph, with natural lighting -: 90: WEBP_HINT_GRAPH, // Discrete tone image (graph, map-tile etc). -: 91: WEBP_HINT_LAST -: 92:} WebPImageHint; -: 93: -: 94:// Compression parameters. -: 95:struct WebPConfig { -: 96: int lossless; // Lossless encoding (0=lossy(default), 1=lossless). -: 97: float quality; // between 0 and 100. For lossy, 0 gives the smallest -: 98: // size and 100 the largest. For lossless, this -: 99: // parameter is the amount of effort put into the -: 100: // compression: 0 is the fastest but gives larger -: 101: // files compared to the slowest, but best, 100. -: 102: int method; // quality/speed trade-off (0=fast, 6=slower-better) -: 103: -: 104: WebPImageHint image_hint; // Hint for image type (lossless only for now). -: 105: -: 106: int target_size; // if non-zero, set the desired target size in bytes. -: 107: // Takes precedence over the 'compression' parameter. -: 108: float target_PSNR; // if non-zero, specifies the minimal distortion to -: 109: // try to achieve. Takes precedence over target_size. -: 110: int segments; // maximum number of segments to use, in [1..4] -: 111: int sns_strength; // Spatial Noise Shaping. 0=off, 100=maximum. -: 112: int filter_strength; // range: [0 = off .. 100 = strongest] -: 113: int filter_sharpness; // range: [0 = off .. 7 = least sharp] -: 114: int filter_type; // filtering type: 0 = simple, 1 = strong (only used -: 115: // if filter_strength > 0 or autofilter > 0) -: 116: int autofilter; // Auto adjust filter's strength [0 = off, 1 = on] -: 117: int alpha_compression; // Algorithm for encoding the alpha plane (0 = none, -: 118: // 1 = compressed with WebP lossless). Default is 1. -: 119: int alpha_filtering; // Predictive filtering method for alpha plane. -: 120: // 0: none, 1: fast, 2: best. Default if 1. -: 121: int alpha_quality; // Between 0 (smallest size) and 100 (lossless). -: 122: // Default is 100. -: 123: int pass; // number of entropy-analysis passes (in [1..10]). -: 124: -: 125: int show_compressed; // if true, export the compressed picture back. -: 126: // In-loop filtering is not applied. -: 127: int preprocessing; // preprocessing filter: -: 128: // 0=none, 1=segment-smooth, 2=pseudo-random dithering -: 129: int partitions; // log2(number of token partitions) in [0..3]. Default -: 130: // is set to 0 for easier progressive decoding. -: 131: int partition_limit; // quality degradation allowed to fit the 512k limit -: 132: // on prediction modes coding (0: no degradation, -: 133: // 100: maximum possible degradation). -: 134: int emulate_jpeg_size; // If true, compression parameters will be remapped -: 135: // to better match the expected output size from -: 136: // JPEG compression. Generally, the output size will -: 137: // be similar but the degradation will be lower. -: 138: int thread_level; // If non-zero, try and use multi-threaded encoding. -: 139: int low_memory; // If set, reduce memory usage (but increase CPU use). -: 140: -: 141: int near_lossless; // Near lossless encoding [0 = max loss .. 100 = off -: 142: // (default)]. -: 143: int exact; // if non-zero, preserve the exact RGB values under -: 144: // transparent area. Otherwise, discard this invisible -: 145: // RGB information for better compression. The default -: 146: // value is 0. -: 147: -: 148: int use_delta_palette; // reserved for future lossless feature -: 149: int use_sharp_yuv; // if needed, use sharp (and slow) RGB->YUV conversion -: 150: -: 151: uint32_t pad[2]; // padding for later use -: 152:}; -: 153: -: 154:// Enumerate some predefined settings for WebPConfig, depending on the type -: 155:// of source picture. These presets are used when calling WebPConfigPreset(). -: 156:typedef enum WebPPreset { -: 157: WEBP_PRESET_DEFAULT = 0, // default preset. -: 158: WEBP_PRESET_PICTURE, // digital picture, like portrait, inner shot -: 159: WEBP_PRESET_PHOTO, // outdoor photograph, with natural lighting -: 160: WEBP_PRESET_DRAWING, // hand or line drawing, with high-contrast details -: 161: WEBP_PRESET_ICON, // small-sized colorful images -: 162: WEBP_PRESET_TEXT // text-like -: 163:} WebPPreset; -: 164: -: 165:// Internal, version-checked, entry point -: 166:WEBP_EXTERN int WebPConfigInitInternal(WebPConfig*, WebPPreset, float, int); -: 167: -: 168:// Should always be called, to initialize a fresh WebPConfig structure before -: 169:// modification. Returns false in case of version mismatch. WebPConfigInit() -: 170:// must have succeeded before using the 'config' object. -: 171:// Note that the default values are lossless=0 and quality=75. -: 172:static WEBP_INLINE int WebPConfigInit(WebPConfig* config) { 107: 173: return WebPConfigInitInternal(config, WEBP_PRESET_DEFAULT, 75.f, call 0 returned 100% call 1 returned 100% -: 174: WEBP_ENCODER_ABI_VERSION); -: 175:} -: 176: -: 177:// This function will initialize the configuration according to a predefined -: 178:// set of parameters (referred to by 'preset') and a given quality factor. -: 179:// This function can be called as a replacement to WebPConfigInit(). Will -: 180:// return false in case of error. -: 181:static WEBP_INLINE int WebPConfigPreset(WebPConfig* config, -: 182: WebPPreset preset, float quality) { -: 183: return WebPConfigInitInternal(config, preset, quality, -: 184: WEBP_ENCODER_ABI_VERSION); -: 185:} -: 186: -: 187:// Activate the lossless compression mode with the desired efficiency level -: 188:// between 0 (fastest, lowest compression) and 9 (slower, best compression). -: 189:// A good default level is '6', providing a fair tradeoff between compression -: 190:// speed and final compressed size. -: 191:// This function will overwrite several fields from config: 'method', 'quality' -: 192:// and 'lossless'. Returns false in case of parameter error. -: 193:WEBP_EXTERN int WebPConfigLosslessPreset(WebPConfig* config, int level); -: 194: -: 195:// Returns true if 'config' is non-NULL and all configuration parameters are -: 196:// within their valid ranges. -: 197:WEBP_EXTERN int WebPValidateConfig(const WebPConfig* config); -: 198: -: 199://------------------------------------------------------------------------------ -: 200:// Input / Output -: 201:// Structure for storing auxiliary statistics. -: 202: -: 203:struct WebPAuxStats { -: 204: int coded_size; // final size -: 205: -: 206: float PSNR[5]; // peak-signal-to-noise ratio for Y/U/V/All/Alpha -: 207: int block_count[3]; // number of intra4/intra16/skipped macroblocks -: 208: int header_bytes[2]; // approximate number of bytes spent for header -: 209: // and mode-partition #0 -: 210: int residual_bytes[3][4]; // approximate number of bytes spent for -: 211: // DC/AC/uv coefficients for each (0..3) segments. -: 212: int segment_size[4]; // number of macroblocks in each segments -: 213: int segment_quant[4]; // quantizer values for each segments -: 214: int segment_level[4]; // filtering strength for each segments [0..63] -: 215: -: 216: int alpha_data_size; // size of the transparency data -: 217: int layer_data_size; // size of the enhancement layer data -: 218: -: 219: // lossless encoder statistics -: 220: uint32_t lossless_features; // bit0:predictor bit1:cross-color transform -: 221: // bit2:subtract-green bit3:color indexing -: 222: int histogram_bits; // number of precision bits of histogram -: 223: int transform_bits; // precision bits for transform -: 224: int cache_bits; // number of bits for color cache lookup -: 225: int palette_size; // number of color in palette, if used -: 226: int lossless_size; // final lossless size -: 227: int lossless_hdr_size; // lossless header (transform, huffman etc) size -: 228: int lossless_data_size; // lossless image data size -: 229: -: 230: uint32_t pad[2]; // padding for later use -: 231:}; -: 232: -: 233:// Signature for output function. Should return true if writing was successful. -: 234:// data/data_size is the segment of data to write, and 'picture' is for -: 235:// reference (and so one can make use of picture->custom_ptr). -: 236:typedef int (*WebPWriterFunction)(const uint8_t* data, size_t data_size, -: 237: const WebPPicture* picture); -: 238: -: 239:// WebPMemoryWrite: a special WebPWriterFunction that writes to memory using -: 240:// the following WebPMemoryWriter object (to be set as a custom_ptr). -: 241:struct WebPMemoryWriter { -: 242: uint8_t* mem; // final buffer (of size 'max_size', larger than 'size'). -: 243: size_t size; // final size -: 244: size_t max_size; // total capacity -: 245: uint32_t pad[1]; // padding for later use -: 246:}; -: 247: -: 248:// The following must be called first before any use. -: 249:WEBP_EXTERN void WebPMemoryWriterInit(WebPMemoryWriter* writer); -: 250: -: 251:// The following must be called to deallocate writer->mem memory. The 'writer' -: 252:// object itself is not deallocated. -: 253:WEBP_EXTERN void WebPMemoryWriterClear(WebPMemoryWriter* writer); -: 254:// The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon -: 255:// completion, writer.mem and writer.size will hold the coded data. -: 256:// writer.mem must be freed by calling WebPMemoryWriterClear. -: 257:WEBP_EXTERN int WebPMemoryWrite(const uint8_t* data, size_t data_size, -: 258: const WebPPicture* picture); -: 259: -: 260:// Progress hook, called from time to time to report progress. It can return -: 261:// false to request an abort of the encoding process, or true otherwise if -: 262:// everything is OK. -: 263:typedef int (*WebPProgressHook)(int percent, const WebPPicture* picture); -: 264: -: 265:// Color spaces. -: 266:typedef enum WebPEncCSP { -: 267: // chroma sampling -: 268: WEBP_YUV420 = 0, // 4:2:0 -: 269: WEBP_YUV420A = 4, // alpha channel variant -: 270: WEBP_CSP_UV_MASK = 3, // bit-mask to get the UV sampling factors -: 271: WEBP_CSP_ALPHA_BIT = 4 // bit that is set if alpha is present -: 272:} WebPEncCSP; -: 273: -: 274:// Encoding error conditions. -: 275:typedef enum WebPEncodingError { -: 276: VP8_ENC_OK = 0, -: 277: VP8_ENC_ERROR_OUT_OF_MEMORY, // memory error allocating objects -: 278: VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY, // memory error while flushing bits -: 279: VP8_ENC_ERROR_NULL_PARAMETER, // a pointer parameter is NULL -: 280: VP8_ENC_ERROR_INVALID_CONFIGURATION, // configuration is invalid -: 281: VP8_ENC_ERROR_BAD_DIMENSION, // picture has invalid width/height -: 282: VP8_ENC_ERROR_PARTITION0_OVERFLOW, // partition is bigger than 512k -: 283: VP8_ENC_ERROR_PARTITION_OVERFLOW, // partition is bigger than 16M -: 284: VP8_ENC_ERROR_BAD_WRITE, // error while flushing bytes -: 285: VP8_ENC_ERROR_FILE_TOO_BIG, // file is bigger than 4G -: 286: VP8_ENC_ERROR_USER_ABORT, // abort request by user -: 287: VP8_ENC_ERROR_LAST // list terminator. always last. -: 288:} WebPEncodingError; -: 289: -: 290:// maximum width/height allowed (inclusive), in pixels -: 291:#define WEBP_MAX_DIMENSION 16383 -: 292: -: 293:// Main exchange structure (input samples, output bytes, statistics) -: 294:struct WebPPicture { -: 295: // INPUT -: 296: ////////////// -: 297: // Main flag for encoder selecting between ARGB or YUV input. -: 298: // It is recommended to use ARGB input (*argb, argb_stride) for lossless -: 299: // compression, and YUV input (*y, *u, *v, etc.) for lossy compression -: 300: // since these are the respective native colorspace for these formats. -: 301: int use_argb; -: 302: -: 303: // YUV input (mostly used for input to lossy compression) -: 304: WebPEncCSP colorspace; // colorspace: should be YUV420 for now (=Y'CbCr). -: 305: int width, height; // dimensions (less or equal to WEBP_MAX_DIMENSION) -: 306: uint8_t* y, *u, *v; // pointers to luma/chroma planes. -: 307: int y_stride, uv_stride; // luma/chroma strides. -: 308: uint8_t* a; // pointer to the alpha plane -: 309: int a_stride; // stride of the alpha plane -: 310: uint32_t pad1[2]; // padding for later use -: 311: -: 312: // ARGB input (mostly used for input to lossless compression) -: 313: uint32_t* argb; // Pointer to argb (32 bit) plane. -: 314: int argb_stride; // This is stride in pixels units, not bytes. -: 315: uint32_t pad2[3]; // padding for later use -: 316: -: 317: // OUTPUT -: 318: /////////////// -: 319: // Byte-emission hook, to store compressed bytes as they are ready. -: 320: WebPWriterFunction writer; // can be NULL -: 321: void* custom_ptr; // can be used by the writer. -: 322: -: 323: // map for extra information (only for lossy compression mode) -: 324: int extra_info_type; // 1: intra type, 2: segment, 3: quant -: 325: // 4: intra-16 prediction mode, -: 326: // 5: chroma prediction mode, -: 327: // 6: bit cost, 7: distortion -: 328: uint8_t* extra_info; // if not NULL, points to an array of size -: 329: // ((width + 15) / 16) * ((height + 15) / 16) that -: 330: // will be filled with a macroblock map, depending -: 331: // on extra_info_type. -: 332: -: 333: // STATS AND REPORTS -: 334: /////////////////////////// -: 335: // Pointer to side statistics (updated only if not NULL) -: 336: WebPAuxStats* stats; -: 337: -: 338: // Error code for the latest error encountered during encoding -: 339: WebPEncodingError error_code; -: 340: -: 341: // If not NULL, report progress during encoding. -: 342: WebPProgressHook progress_hook; -: 343: -: 344: void* user_data; // this field is free to be set to any value and -: 345: // used during callbacks (like progress-report e.g.). -: 346: -: 347: uint32_t pad3[3]; // padding for later use -: 348: -: 349: // Unused for now -: 350: uint8_t* pad4, *pad5; -: 351: uint32_t pad6[8]; // padding for later use -: 352: -: 353: // PRIVATE FIELDS -: 354: //////////////////// -: 355: void* memory_; // row chunk of memory for yuva planes -: 356: void* memory_argb_; // and for argb too. -: 357: void* pad7[2]; // padding for later use -: 358:}; -: 359: -: 360:// Internal, version-checked, entry point -: 361:WEBP_EXTERN int WebPPictureInitInternal(WebPPicture*, int); -: 362: -: 363:// Should always be called, to initialize the structure. Returns false in case -: 364:// of version mismatch. WebPPictureInit() must have succeeded before using the -: 365:// 'picture' object. -: 366:// Note that, by default, use_argb is false and colorspace is WEBP_YUV420. -: 367:static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) { 23: 368: return WebPPictureInitInternal(picture, WEBP_ENCODER_ABI_VERSION); call 0 returned 100% call 1 returned 100% -: 369:} -: 370: -: 371://------------------------------------------------------------------------------ -: 372:// WebPPicture utils -: 373: -: 374:// Convenience allocation / deallocation based on picture->width/height: -: 375:// Allocate y/u/v buffers as per colorspace/width/height specification. -: 376:// Note! This function will free the previous buffer if needed. -: 377:// Returns false in case of memory error. -: 378:WEBP_EXTERN int WebPPictureAlloc(WebPPicture* picture); -: 379: -: 380:// Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*(). -: 381:// Note that this function does _not_ free the memory used by the 'picture' -: 382:// object itself. -: 383:// Besides memory (which is reclaimed) all other fields of 'picture' are -: 384:// preserved. -: 385:WEBP_EXTERN void WebPPictureFree(WebPPicture* picture); -: 386: -: 387:// Copy the pixels of *src into *dst, using WebPPictureAlloc. Upon return, *dst -: 388:// will fully own the copied pixels (this is not a view). The 'dst' picture need -: 389:// not be initialized as its content is overwritten. -: 390:// Returns false in case of memory allocation error. -: 391:WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst); -: 392: -: 393:// Compute the single distortion for packed planes of samples. -: 394:// 'src' will be compared to 'ref', and the raw distortion stored into -: 395:// '*distortion'. The refined metric (log(MSE), log(1 - ssim),...' will be -: 396:// stored in '*result'. -: 397:// 'x_step' is the horizontal stride (in bytes) between samples. -: 398:// 'src/ref_stride' is the byte distance between rows. -: 399:// Returns false in case of error (bad parameter, memory allocation error, ...). -: 400:WEBP_EXTERN int WebPPlaneDistortion(const uint8_t* src, size_t src_stride, -: 401: const uint8_t* ref, size_t ref_stride, -: 402: int width, int height, -: 403: size_t x_step, -: 404: int type, // 0 = PSNR, 1 = SSIM, 2 = LSIM -: 405: float* distortion, float* result); -: 406: -: 407:// Compute PSNR, SSIM or LSIM distortion metric between two pictures. Results -: 408:// are in dB, stored in result[] in the B/G/R/A/All order. The distortion is -: 409:// always performed using ARGB samples. Hence if the input is YUV(A), the -: 410:// picture will be internally converted to ARGB (just for the measurement). -: 411:// Warning: this function is rather CPU-intensive. -: 412:WEBP_EXTERN int WebPPictureDistortion( -: 413: const WebPPicture* src, const WebPPicture* ref, -: 414: int metric_type, // 0 = PSNR, 1 = SSIM, 2 = LSIM -: 415: float result[5]); -: 416: -: 417:// self-crops a picture to the rectangle defined by top/left/width/height. -: 418:// Returns false in case of memory allocation error, or if the rectangle is -: 419:// outside of the source picture. -: 420:// The rectangle for the view is defined by the top-left corner pixel -: 421:// coordinates (left, top) as well as its width and height. This rectangle -: 422:// must be fully be comprised inside the 'src' source picture. If the source -: 423:// picture uses the YUV420 colorspace, the top and left coordinates will be -: 424:// snapped to even values. -: 425:WEBP_EXTERN int WebPPictureCrop(WebPPicture* picture, -: 426: int left, int top, int width, int height); -: 427: -: 428:// Extracts a view from 'src' picture into 'dst'. The rectangle for the view -: 429:// is defined by the top-left corner pixel coordinates (left, top) as well -: 430:// as its width and height. This rectangle must be fully be comprised inside -: 431:// the 'src' source picture. If the source picture uses the YUV420 colorspace, -: 432:// the top and left coordinates will be snapped to even values. -: 433:// Picture 'src' must out-live 'dst' picture. Self-extraction of view is allowed -: 434:// ('src' equal to 'dst') as a mean of fast-cropping (but note that doing so, -: 435:// the original dimension will be lost). Picture 'dst' need not be initialized -: 436:// with WebPPictureInit() if it is different from 'src', since its content will -: 437:// be overwritten. -: 438:// Returns false in case of memory allocation error or invalid parameters. -: 439:WEBP_EXTERN int WebPPictureView(const WebPPicture* src, -: 440: int left, int top, int width, int height, -: 441: WebPPicture* dst); -: 442: -: 443:// Returns true if the 'picture' is actually a view and therefore does -: 444:// not own the memory for pixels. -: 445:WEBP_EXTERN int WebPPictureIsView(const WebPPicture* picture); -: 446: -: 447:// Rescale a picture to new dimension width x height. -: 448:// If either 'width' or 'height' (but not both) is 0 the corresponding -: 449:// dimension will be calculated preserving the aspect ratio. -: 450:// No gamma correction is applied. -: 451:// Returns false in case of error (invalid parameter or insufficient memory). -: 452:WEBP_EXTERN int WebPPictureRescale(WebPPicture* pic, int width, int height); -: 453: -: 454:// Colorspace conversion function to import RGB samples. -: 455:// Previous buffer will be free'd, if any. -: 456:// *rgb buffer should have a size of at least height * rgb_stride. -: 457:// Returns false in case of memory error. -: 458:WEBP_EXTERN int WebPPictureImportRGB( -: 459: WebPPicture* picture, const uint8_t* rgb, int rgb_stride); -: 460:// Same, but for RGBA buffer. -: 461:WEBP_EXTERN int WebPPictureImportRGBA( -: 462: WebPPicture* picture, const uint8_t* rgba, int rgba_stride); -: 463:// Same, but for RGBA buffer. Imports the RGB direct from the 32-bit format -: 464:// input buffer ignoring the alpha channel. Avoids needing to copy the data -: 465:// to a temporary 24-bit RGB buffer to import the RGB only. -: 466:WEBP_EXTERN int WebPPictureImportRGBX( -: 467: WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride); -: 468: -: 469:// Variants of the above, but taking BGR(A|X) input. -: 470:WEBP_EXTERN int WebPPictureImportBGR( -: 471: WebPPicture* picture, const uint8_t* bgr, int bgr_stride); -: 472:WEBP_EXTERN int WebPPictureImportBGRA( -: 473: WebPPicture* picture, const uint8_t* bgra, int bgra_stride); -: 474:WEBP_EXTERN int WebPPictureImportBGRX( -: 475: WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride); -: 476: -: 477:// Converts picture->argb data to the YUV420A format. The 'colorspace' -: 478:// parameter is deprecated and should be equal to WEBP_YUV420. -: 479:// Upon return, picture->use_argb is set to false. The presence of real -: 480:// non-opaque transparent values is detected, and 'colorspace' will be -: 481:// adjusted accordingly. Note that this method is lossy. -: 482:// Returns false in case of error. -: 483:WEBP_EXTERN int WebPPictureARGBToYUVA(WebPPicture* picture, -: 484: WebPEncCSP /*colorspace = WEBP_YUV420*/); -: 485: -: 486:// Same as WebPPictureARGBToYUVA(), but the conversion is done using -: 487:// pseudo-random dithering with a strength 'dithering' between -: 488:// 0.0 (no dithering) and 1.0 (maximum dithering). This is useful -: 489:// for photographic picture. -: 490:WEBP_EXTERN int WebPPictureARGBToYUVADithered( -: 491: WebPPicture* picture, WebPEncCSP colorspace, float dithering); -: 492: -: 493:// Performs 'sharp' RGBA->YUVA420 downsampling and colorspace conversion. -: 494:// Downsampling is handled with extra care in case of color clipping. This -: 495:// method is roughly 2x slower than WebPPictureARGBToYUVA() but produces better -: 496:// and sharper YUV representation. -: 497:// Returns false in case of error. -: 498:WEBP_EXTERN int WebPPictureSharpARGBToYUVA(WebPPicture* picture); -: 499:// kept for backward compatibility: -: 500:WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture); -: 501: -: 502:// Converts picture->yuv to picture->argb and sets picture->use_argb to true. -: 503:// The input format must be YUV_420 or YUV_420A. The conversion from YUV420 to -: 504:// ARGB incurs a small loss too. -: 505:// Note that the use of this colorspace is discouraged if one has access to the -: 506:// raw ARGB samples, since using YUV420 is comparatively lossy. -: 507:// Returns false in case of error. -: 508:WEBP_EXTERN int WebPPictureYUVAToARGB(WebPPicture* picture); -: 509: -: 510:// Helper function: given a width x height plane of RGBA or YUV(A) samples -: 511:// clean-up or smoothen the YUV or RGB samples under fully transparent area, -: 512:// to help compressibility (no guarantee, though). -: 513:WEBP_EXTERN void WebPCleanupTransparentArea(WebPPicture* picture); -: 514: -: 515:// Scan the picture 'picture' for the presence of non fully opaque alpha values. -: 516:// Returns true in such case. Otherwise returns false (indicating that the -: 517:// alpha plane can be ignored altogether e.g.). -: 518:WEBP_EXTERN int WebPPictureHasTransparency(const WebPPicture* picture); -: 519: -: 520:// Remove the transparency information (if present) by blending the color with -: 521:// the background color 'background_rgb' (specified as 24bit RGB triplet). -: 522:// After this call, all alpha values are reset to 0xff. -: 523:WEBP_EXTERN void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb); -: 524: -: 525://------------------------------------------------------------------------------ -: 526:// Main call -: 527: -: 528:// Main encoding call, after config and picture have been initialized. -: 529:// 'picture' must be less than 16384x16384 in dimension (cf WEBP_MAX_DIMENSION), -: 530:// and the 'config' object must be a valid one. -: 531:// Returns false in case of error, true otherwise. -: 532:// In case of error, picture->error_code is updated accordingly. -: 533:// 'picture' can hold the source samples in both YUV(A) or ARGB input, depending -: 534:// on the value of 'picture->use_argb'. It is highly recommended to use -: 535:// the former for lossy encoding, and the latter for lossless encoding -: 536:// (when config.lossless is true). Automatic conversion from one format to -: 537:// another is provided but they both incur some loss. -: 538:WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture); -: 539: -: 540://------------------------------------------------------------------------------ -: 541: -: 542:#ifdef __cplusplus -: 543:} // extern "C" -: 544:#endif -: 545: -: 546:#endif // WEBP_WEBP_ENCODE_H_ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#TgaRleEncode.c.gcov -: 0:Source:src/libImaging/TgaRleEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/TgaRleEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/TgaRleEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1: -: 2:#include "Imaging.h" -: 3: -: 4:#include -: 5:#include -: 6: -: 7: -: 8:static int comparePixels(const UINT8* buf, int x, int bytesPerPixel) -: 9:{ 329175: 10: buf += x * bytesPerPixel; 329175: 11: return memcmp(buf, buf + bytesPerPixel, bytesPerPixel) == 0; -: 12:} -: 13: -: 14: -: 15:int function ImagingTgaRleEncode called 26 returned 100% blocks executed 100% 26: 16:ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 17:{ -: 18: UINT8* dst; -: 19: int bytesPerPixel; -: 20: 26: 21: if (state->state == 0) { branch 0 taken 77% (fallthrough) branch 1 taken 23% 20: 22: if (state->ystep < 0) { branch 0 taken 60% (fallthrough) branch 1 taken 40% 12: 23: state->ystep = -1; 12: 24: state->y = state->ysize - 1; -: 25: } else { 8: 26: state->ystep = 1; -: 27: } -: 28: 20: 29: state->state = 1; -: 30: } -: 31: 26: 32: dst = buf; 26: 33: bytesPerPixel = (state->bits + 7) / 8; -: 34: -: 35: while (1) { -: 36: int flushCount; -: 37: -: 38: /* -: 39: * state->count is the numbers of bytes in the packet, -: 40: * excluding the 1-byte descriptor. -: 41: */ 35468: 42: if (state->count == 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 43: UINT8* row; -: 44: UINT8 descriptor; -: 45: int startX; -: 46: -: 47: assert(state->x <= state->xsize); -: 48: -: 49: /* Make sure we have space for the descriptor. */ 35456: 50: if (bytes < 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 51: break; -: 52: } -: 53: 35456: 54: if (state->x == state->xsize) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 1680: 55: state->x = 0; -: 56: 1680: 57: state->y += state->ystep; 1680: 58: if (state->y < 0 || state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 20: 59: state->errcode = IMAGING_CODEC_END; 20: 60: break; -: 61: } -: 62: } -: 63: 35436: 64: if (state->x == 0) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 3360: 65: state->shuffle( call 0 returned 100% -: 66: state->buffer, 1680: 67: (UINT8*)im->image[state->y + state->yoff] 1680: 68: + state->xoff * im->pixelsize, -: 69: state->xsize); -: 70: } -: 71: 35436: 72: row = state->buffer; -: 73: -: 74: /* Start with a raw packet for 1 px. */ 35436: 75: descriptor = 0; 35436: 76: startX = state->x; 35436: 77: state->count = bytesPerPixel; -: 78: 35436: 79: if (state->x + 1 < state->xsize) { branch 0 taken 98% (fallthrough) branch 1 taken 2% -: 80: int maxLookup; -: 81: int isRaw; -: 82: 69796: 83: isRaw = !comparePixels(row, state->x, bytesPerPixel); 34898: 84: ++state->x; -: 85: -: 86: /* -: 87: * A packet can contain up to 128 pixels; -: 88: * 2 are already behind (state->x points to -: 89: * the second one). -: 90: */ 34898: 91: maxLookup = state->x + 126; -: 92: /* A packet must not span multiple rows. */ 34898: 93: if (maxLookup > state->xsize - 1) { branch 0 taken 57% (fallthrough) branch 1 taken 43% 19998: 94: maxLookup = state->xsize - 1; -: 95: } -: 96: 34898: 97: if (isRaw) { branch 0 taken 52% (fallthrough) branch 1 taken 48% 222311: 98: while (state->x < maxLookup) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 442218: 99: if (!comparePixels(row, state->x, bytesPerPixel)) { branch 0 taken 93% (fallthrough) branch 1 taken 7% 205726: 100: ++state->x; -: 101: } else { -: 102: /* Two identical pixels will go to RLE packet. */ 15383: 103: --state->x; 15383: 104: break; -: 105: } -: 106: } -: 107: 16585: 108: state->count += (state->x - startX) * bytesPerPixel; -: 109: } else { -: 110: descriptor |= 0x80; -: 111: 73340: 112: while (state->x < maxLookup) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 146336: 113: if (comparePixels(row, state->x, bytesPerPixel)) { branch 0 taken 75% (fallthrough) branch 1 taken 25% 55027: 114: ++state->x; -: 115: } else { -: 116: break; -: 117: } -: 118: } -: 119: } -: 120: } -: 121: -: 122: /* -: 123: * state->x currently points to the last pixel to be -: 124: * included in the packet. The pixel count in the -: 125: * descriptor is 1 less than actual number of pixels in -: 126: * the packet, that is, state->x == startX if we encode -: 127: * only 1 pixel. -: 128: */ 35436: 129: descriptor += state->x - startX; 35436: 130: *dst++ = descriptor; 35436: 131: --bytes; -: 132: -: 133: /* Advance to past-the-last encoded pixel. */ 35436: 134: ++state->x; -: 135: } -: 136: -: 137: assert(bytes >= 0); -: 138: assert(state->count > 0); -: 139: assert(state->x > 0); -: 140: assert(state->count <= state->x * bytesPerPixel); -: 141: 35448: 142: if (bytes == 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 143: break; -: 144: } -: 145: 35442: 146: flushCount = state->count; 35442: 147: if (flushCount > bytes) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 6: 148: flushCount = bytes; -: 149: } -: 150: 106326: 151: memcpy( -: 152: dst, 70884: 153: state->buffer + (state->x * bytesPerPixel - state->count), -: 154: flushCount); 35442: 155: dst += flushCount; 35442: 156: bytes -= flushCount; -: 157: 35442: 158: state->count -= flushCount; 35442: 159: } -: 160: 26: 161: return dst - buf; -: 162:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/coverage.xml /home/travis/build/python-pillow/Pillow <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ZipEncode.c.gcov -: 0:Source:src/libImaging/ZipEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ZipEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ZipEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * coder for ZIP (deflated) image data -: 6: * -: 7: * History: -: 8: * 96-12-29 fl created -: 9: * 96-12-30 fl adaptive filter selection, encoder tuning -: 10: * -: 11: * Copyright (c) Fredrik Lundh 1996. -: 12: * Copyright (c) Secret Labs AB 1997. -: 13: * -: 14: * See the README file for information on usage and redistribution. -: 15: */ -: 16: -: 17: -: 18:#include "Imaging.h" -: 19: -: 20:#ifdef HAVE_LIBZ -: 21: -: 22:#include "ZipCodecs.h" -: 23: -: 24:int function ImagingZipEncode called 186 returned 100% blocks executed 72% 186: 25:ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 26:{ 186: 27: ZIPSTATE* context = (ZIPSTATE*) state->context; -: 28: int err; -: 29: int compress_level, compress_type; -: 30: UINT8* ptr; -: 31: int i, bpp, s, sum; -: 32: ImagingSectionCookie cookie; -: 33: 186: 34: if (!state->state) { branch 0 taken 70% (fallthrough) branch 1 taken 30% -: 35: -: 36: /* Initialization */ -: 37: -: 38: /* Valid modes are ZIP_PNG, ZIP_PNG_PALETTE, and ZIP_TIFF */ -: 39: -: 40: /* overflow check for malloc */ 131: 41: if (state->bytes > INT_MAX - 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 42: state->errcode = IMAGING_CODEC_MEMORY; #####: 43: return -1; -: 44: } -: 45: -: 46: /* Expand standard buffer to make room for the filter selector, -: 47: and allocate filter buffers */ 131: 48: free(state->buffer); -: 49: /* malloc check ok, overflow checked above */ 131: 50: state->buffer = (UINT8*) malloc(state->bytes+1); 131: 51: context->previous = (UINT8*) malloc(state->bytes+1); 131: 52: context->prior = (UINT8*) malloc(state->bytes+1); 131: 53: context->up = (UINT8*) malloc(state->bytes+1); 131: 54: context->average = (UINT8*) malloc(state->bytes+1); 131: 55: context->paeth = (UINT8*) malloc(state->bytes+1); 131: 56: if (!state->buffer || !context->previous || !context->prior || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% 131: 57: !context->up || !context->average || !context->paeth) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 58: free(context->paeth); #####: 59: free(context->average); #####: 60: free(context->up); #####: 61: free(context->prior); #####: 62: free(context->previous); #####: 63: state->errcode = IMAGING_CODEC_MEMORY; #####: 64: return -1; -: 65: } -: 66: -: 67: /* Initialise filter buffers */ 131: 68: state->buffer[0] = 0; 131: 69: context->prior[0] = 1; 131: 70: context->up[0] = 2; 131: 71: context->average[0] = 3; 131: 72: context->paeth[0] = 4; -: 73: -: 74: /* Initialise previous buffer to black */ 262: 75: memset(context->previous, 0, state->bytes+1); -: 76: -: 77: /* Setup compression context */ 131: 78: context->z_stream.zalloc = (alloc_func)0; 131: 79: context->z_stream.zfree = (free_func)0; 131: 80: context->z_stream.opaque = (voidpf)0; 131: 81: context->z_stream.next_in = 0; 131: 82: context->z_stream.avail_in = 0; -: 83: 262: 84: compress_level = (context->optimize) ? Z_BEST_COMPRESSION 131: 85: : context->compress_level; branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 86: 131: 87: if (context->compress_type == -1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 262: 88: compress_type = (context->mode == ZIP_PNG) ? Z_FILTERED 131: 89: : Z_DEFAULT_STRATEGY; -: 90: } else { -: 91: compress_type = context->compress_type; -: 92: } -: 93: 131: 94: err = deflateInit2(&context->z_stream, call 0 returned 100% -: 95: /* compression level */ -: 96: compress_level, -: 97: /* compression method */ -: 98: Z_DEFLATED, -: 99: /* compression memory resources */ -: 100: 15, 9, -: 101: /* compression strategy (image data are filtered)*/ -: 102: compress_type); 131: 103: if (err < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 104: state->errcode = IMAGING_CODEC_CONFIG; #####: 105: return -1; -: 106: } -: 107: 131: 108: if (context->dictionary && context->dictionary_size > 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed #####: 109: err = deflateSetDictionary(&context->z_stream, (unsigned char *)context->dictionary, call 0 never executed -: 110: context->dictionary_size); #####: 111: if (err < 0) { branch 0 never executed branch 1 never executed #####: 112: state->errcode = IMAGING_CODEC_CONFIG; #####: 113: return -1; -: 114: } -: 115: } -: 116: -: 117: /* Ready to decode */ 131: 118: state->state = 1; -: 119: -: 120: } -: 121: -: 122: /* Setup the destination buffer */ 186: 123: context->z_stream.next_out = buf; 186: 124: context->z_stream.avail_out = bytes; 186: 125: if (context->z_stream.next_in && context->z_stream.avail_in > 0) { branch 0 taken 30% (fallthrough) branch 1 taken 70% branch 2 taken 15% (fallthrough) branch 3 taken 85% -: 126: /* We have some data from previous round, deflate it first */ 8: 127: err = deflate(&context->z_stream, Z_NO_FLUSH); call 0 returned 100% -: 128: 8: 129: if (err < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 130: /* Something went wrong inside the compression library */ #####: 131: if (err == Z_DATA_ERROR) { branch 0 never executed branch 1 never executed #####: 132: state->errcode = IMAGING_CODEC_BROKEN; #####: 133: } else if (err == Z_MEM_ERROR) { branch 0 never executed branch 1 never executed #####: 134: state->errcode = IMAGING_CODEC_MEMORY; -: 135: } else { #####: 136: state->errcode = IMAGING_CODEC_CONFIG; -: 137: } #####: 138: free(context->paeth); #####: 139: free(context->average); #####: 140: free(context->up); #####: 141: free(context->prior); #####: 142: free(context->previous); #####: 143: deflateEnd(&context->z_stream); call 0 never executed #####: 144: return -1; -: 145: } -: 146: } -: 147: 186: 148: ImagingSectionEnter(&cookie); call 0 returned 100% -: 149: for (;;) { -: 150: 186: 151: switch (state->state) { branch 0 taken 97% branch 1 taken 3% branch 2 taken 0% -: 152: -: 153: case 1: -: 154: -: 155: /* Compress image data */ 15877: 156: while (context->z_stream.avail_out > 0) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 157: 15827: 158: if (state->y >= state->ysize) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 159: /* End of image; now flush compressor buffers */ 131: 160: state->state = 2; 131: 161: break; -: 162: -: 163: } -: 164: -: 165: /* Stuff image data into the compressor */ 31392: 166: state->shuffle(state->buffer+1, call 0 returned 100% 15696: 167: (UINT8*) im->image[state->y + state->yoff] + 15696: 168: state->xoff * im->pixelsize, -: 169: state->xsize); -: 170: 15696: 171: state->y++; -: 172: 15696: 173: context->output = state->buffer; -: 174: 15696: 175: if (context->mode == ZIP_PNG) { branch 0 taken 92% (fallthrough) branch 1 taken 8% -: 176: -: 177: /* Filter the image data. For each line, select -: 178: the filter that gives the least total distance -: 179: from zero for the filtered data (taken from -: 180: LIBPNG) */ -: 181: 14518: 182: bpp = (state->bits + 7) / 8; -: 183: -: 184: /* 0. No filter */ 39651398: 185: for (i = 1, sum = 0; i <= state->bytes; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 39636880: 186: UINT8 v = state->buffer[i]; 39636880: 187: sum += (v < 128) ? v : 256 - v; branch 0 taken 78% (fallthrough) branch 1 taken 22% -: 188: } -: 189: -: 190: /* 2. Up. We'll test this first to save time when -: 191: an image line is identical to the one above. */ 14518: 192: if (sum > 0) { branch 0 taken 95% (fallthrough) branch 1 taken 5% 39382872: 193: for (i = 1, s = 0; i <= state->bytes; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 39382872: 194: UINT8 v = state->buffer[i] - context->previous[i]; 39382872: 195: context->up[i] = v; 39382872: 196: s += (v < 128) ? v : 256 - v; branch 0 taken 85% (fallthrough) branch 1 taken 15% -: 197: } 13838: 198: if (s < sum) { branch 0 taken 96% (fallthrough) branch 1 taken 4% 13251: 199: context->output = context->up; 13251: 200: sum = s; /* 0 if line was duplicated */ -: 201: } -: 202: } -: 203: -: 204: /* 1. Prior */ 14518: 205: if (sum > 0) { branch 0 taken 71% (fallthrough) branch 1 taken 29% 27524: 206: for (i = 1, s = 0; i <= bpp; i++) { branch 0 taken 73% branch 1 taken 27% (fallthrough) 27524: 207: UINT8 v = state->buffer[i]; 27524: 208: context->prior[i] = v; 27524: 209: s += (v < 128) ? v : 256 - v; branch 0 taken 63% (fallthrough) branch 1 taken 37% -: 210: } 26618180: 211: for (; i <= state->bytes; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 26618180: 212: UINT8 v = state->buffer[i] - state->buffer[i-bpp]; 26618180: 213: context->prior[i] = v; 26618180: 214: s += (v < 128) ? v : 256 - v; branch 0 taken 79% (fallthrough) branch 1 taken 21% -: 215: } 10252: 216: if (s < sum) { branch 0 taken 27% (fallthrough) branch 1 taken 73% 2816: 217: context->output = context->prior; 2816: 218: sum = s; /* 0 if line is solid */ -: 219: } -: 220: } -: 221: -: 222: /* 3. Average (not very common in real-life images, -: 223: so its only used with the optimize option) */ 14518: 224: if (context->optimize && sum > 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed #####: 225: for (i = 1, s = 0; i <= bpp; i++) { branch 0 never executed branch 1 never executed #####: 226: UINT8 v = state->buffer[i] - context->previous[i]/2; #####: 227: context->average[i] = v; #####: 228: s += (v < 128) ? v : 256 - v; branch 0 never executed branch 1 never executed -: 229: } #####: 230: for (; i <= state->bytes; i++) { branch 0 never executed branch 1 never executed #####: 231: UINT8 v = state->buffer[i] - #####: 232: (state->buffer[i-bpp] + context->previous[i])/2; #####: 233: context->average[i] = v; #####: 234: s += (v < 128) ? v : 256 - v; branch 0 never executed branch 1 never executed -: 235: } #####: 236: if (s < sum) { branch 0 never executed branch 1 never executed #####: 237: context->output = context->average; #####: 238: sum = s; -: 239: } -: 240: } -: 241: -: 242: /* 4. Paeth */ 14518: 243: if (sum > 0) { branch 0 taken 71% (fallthrough) branch 1 taken 29% 27524: 244: for (i = 1, s = 0; i <= bpp; i++) { branch 0 taken 73% branch 1 taken 27% (fallthrough) 27524: 245: UINT8 v = state->buffer[i] - context->previous[i]; 27524: 246: context->paeth[i] = v; 27524: 247: s += (v < 128) ? v : 256 - v; branch 0 taken 77% (fallthrough) branch 1 taken 23% -: 248: } 26618180: 249: for (; i <= state->bytes; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 250: UINT8 v; -: 251: int a, b, c; -: 252: int pa, pb, pc; -: 253: -: 254: /* fetch pixels */ 26618180: 255: a = state->buffer[i-bpp]; 26618180: 256: b = context->previous[i]; 26618180: 257: c = context->previous[i-bpp]; -: 258: -: 259: /* distances to surrounding pixels */ 26618180: 260: pa = abs(b - c); 26618180: 261: pb = abs(a - c); 26618180: 262: pc = abs(a + b - 2*c); -: 263: -: 264: /* pick predictor with the shortest distance */ 33758371: 265: v = state->buffer[i] - branch 0 taken 78% (fallthrough) branch 1 taken 22% branch 2 taken 81% (fallthrough) branch 3 taken 19% 20705284: 266: ((pa <= pb && pa <= pc) ? a : branch 0 taken 6% (fallthrough) branch 1 taken 94% -: 267: (pb <= pc) ? b : c); 26618180: 268: context->paeth[i] = v; 26618180: 269: s += (v < 128) ? v : 256 - v; branch 0 taken 84% (fallthrough) branch 1 taken 16% -: 270: } 10252: 271: if (s < sum) { branch 0 taken 58% (fallthrough) branch 1 taken 42% 5971: 272: context->output = context->paeth; 5971: 273: sum = s; -: 274: } -: 275: } -: 276: } -: 277: -: 278: /* Compress this line */ 15696: 279: context->z_stream.next_in = context->output; 15696: 280: context->z_stream.avail_in = state->bytes+1; -: 281: 15696: 282: err = deflate(&context->z_stream, Z_NO_FLUSH); call 0 returned 100% -: 283: 15696: 284: if (err < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 285: /* Something went wrong inside the compression library */ #####: 286: if (err == Z_DATA_ERROR) { branch 0 never executed branch 1 never executed #####: 287: state->errcode = IMAGING_CODEC_BROKEN; #####: 288: } else if (err == Z_MEM_ERROR) { branch 0 never executed branch 1 never executed #####: 289: state->errcode = IMAGING_CODEC_MEMORY; -: 290: } else { #####: 291: state->errcode = IMAGING_CODEC_CONFIG; -: 292: } #####: 293: free(context->paeth); #####: 294: free(context->average); #####: 295: free(context->up); #####: 296: free(context->prior); #####: 297: free(context->previous); #####: 298: deflateEnd(&context->z_stream); call 0 never executed #####: 299: ImagingSectionLeave(&cookie); call 0 never executed #####: 300: return -1; -: 301: } -: 302: -: 303: /* Swap buffer pointers */ 15696: 304: ptr = state->buffer; 15696: 305: state->buffer = context->previous; 15696: 306: context->previous = ptr; -: 307: -: 308: } -: 309: 181: 310: if (context->z_stream.avail_out == 0) { branch 0 taken 72% branch 1 taken 28% -: 311: break; /* Buffer full */ -: 312: } -: 313: -: 314: case 2: -: 315: -: 316: /* End of image data; flush compressor buffers */ -: 317: 136: 318: while (context->z_stream.avail_out > 0) { branch 0 taken 100% branch 1 taken 0% (fallthrough) -: 319: 136: 320: err = deflate(&context->z_stream, Z_FINISH); call 0 returned 100% -: 321: 136: 322: if (err == Z_STREAM_END) { branch 0 taken 96% (fallthrough) branch 1 taken 4% -: 323: 131: 324: free(context->paeth); 131: 325: free(context->average); 131: 326: free(context->up); 131: 327: free(context->prior); 131: 328: free(context->previous); -: 329: 131: 330: deflateEnd(&context->z_stream); call 0 returned 100% -: 331: 131: 332: state->errcode = IMAGING_CODEC_END; -: 333: 131: 334: break; -: 335: } -: 336: 5: 337: if (context->z_stream.avail_out == 0) { branch 0 taken 0% branch 1 taken 100% -: 338: break; /* Buffer full */ -: 339: } -: 340: -: 341: } -: 342: -: 343: } 186: 344: ImagingSectionLeave(&cookie); call 0 returned 100% 186: 345: return bytes - context->z_stream.avail_out; -: 346: -: 347: } -: 348: -: 349: /* Should never ever arrive here... */ -: 350: state->errcode = IMAGING_CODEC_CONFIG; -: 351: ImagingSectionLeave(&cookie); -: 352: return -1; -: 353:} -: 354: -: 355:/* -------------------------------------------------------------------- */ -: 356:/* Cleanup */ -: 357:/* -------------------------------------------------------------------- */ -: 358: -: 359:int function ImagingZipEncodeCleanup called 262 returned 100% blocks executed 67% 262: 360:ImagingZipEncodeCleanup(ImagingCodecState state) { 262: 361: ZIPSTATE* context = (ZIPSTATE*) state->context; -: 362: 262: 363: if (context->dictionary) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 364: free (context->dictionary); #####: 365: context->dictionary = NULL; -: 366: } -: 367: 262: 368: return -1; -: 369:} -: 370: -: 371: -: 372: -: 373:const char* function ImagingZipVersion called 3 returned 100% blocks executed 100% 3: 374:ImagingZipVersion(void) -: 375:{ 3: 376: return zlibVersion(); call 0 returned 100% -: 377:} -: 378: -: 379:#endif <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/#usr#include#webp#mux_types.h.gcov -: 0:Source:/usr/include/webp/mux_types.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:// Copyright 2012 Google Inc. All Rights Reserved. -: 2:// -: 3:// Use of this source code is governed by a BSD-style license -: 4:// that can be found in the COPYING file in the root of the source -: 5:// tree. An additional intellectual property rights grant can be found -: 6:// in the file PATENTS. All contributing project authors may -: 7:// be found in the AUTHORS file in the root of the source tree. -: 8:// ----------------------------------------------------------------------------- -: 9:// -: 10:// Data-types common to the mux and demux libraries. -: 11:// -: 12:// Author: Urvang (urvang@google.com) -: 13: -: 14:#ifndef WEBP_WEBP_MUX_TYPES_H_ -: 15:#define WEBP_WEBP_MUX_TYPES_H_ -: 16: -: 17:#include // memset() -: 18:#include "./types.h" -: 19: -: 20:#ifdef __cplusplus -: 21:extern "C" { -: 22:#endif -: 23: -: 24:// Note: forward declaring enumerations is not allowed in (strict) C and C++, -: 25:// the types are left here for reference. -: 26:// typedef enum WebPFeatureFlags WebPFeatureFlags; -: 27:// typedef enum WebPMuxAnimDispose WebPMuxAnimDispose; -: 28:// typedef enum WebPMuxAnimBlend WebPMuxAnimBlend; -: 29:typedef struct WebPData WebPData; -: 30: -: 31:// VP8X Feature Flags. -: 32:typedef enum WebPFeatureFlags { -: 33: ANIMATION_FLAG = 0x00000002, -: 34: XMP_FLAG = 0x00000004, -: 35: EXIF_FLAG = 0x00000008, -: 36: ALPHA_FLAG = 0x00000010, -: 37: ICCP_FLAG = 0x00000020, -: 38: -: 39: ALL_VALID_FLAGS = 0x0000003e -: 40:} WebPFeatureFlags; -: 41: -: 42:// Dispose method (animation only). Indicates how the area used by the current -: 43:// frame is to be treated before rendering the next frame on the canvas. -: 44:typedef enum WebPMuxAnimDispose { -: 45: WEBP_MUX_DISPOSE_NONE, // Do not dispose. -: 46: WEBP_MUX_DISPOSE_BACKGROUND // Dispose to background color. -: 47:} WebPMuxAnimDispose; -: 48: -: 49:// Blend operation (animation only). Indicates how transparent pixels of the -: 50:// current frame are blended with those of the previous canvas. -: 51:typedef enum WebPMuxAnimBlend { -: 52: WEBP_MUX_BLEND, // Blend. -: 53: WEBP_MUX_NO_BLEND // Do not blend. -: 54:} WebPMuxAnimBlend; -: 55: -: 56:// Data type used to describe 'raw' data, e.g., chunk data -: 57:// (ICC profile, metadata) and WebP compressed image data. -: 58:// 'bytes' memory must be allocated using WebPMalloc() and such. -: 59:struct WebPData { -: 60: const uint8_t* bytes; -: 61: size_t size; -: 62:}; -: 63: -: 64:// Initializes the contents of the 'webp_data' object with default values. -: 65:static WEBP_INLINE void WebPDataInit(WebPData* webp_data) { 344: 66: if (webp_data != NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 67: memset(webp_data, 0, sizeof(*webp_data)); -: 68: } -: 69:} -: 70: -: 71:// Clears the contents of the 'webp_data' object by calling WebPFree(). -: 72:// Does not deallocate the object itself. function WebPDataClear called 184 returned 100% blocks executed 100% 184: 73:static WEBP_INLINE void WebPDataClear(WebPData* webp_data) { 184: 74: if (webp_data != NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 184: 75: WebPFree((void*)webp_data->bytes); call 0 returned 100% -: 76: WebPDataInit(webp_data); -: 77: } 184: 78:} -: 79: -: 80:// Allocates necessary storage for 'dst' and copies the contents of 'src'. -: 81:// Returns true on success. function WebPDataCopy called 160 returned 100% blocks executed 100% 160: 82:static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) { 160: 83: if (src == NULL || dst == NULL) return 0; branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 160: 84: WebPDataInit(dst); 160: 85: if (src->bytes != NULL && src->size != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 160: 86: dst->bytes = (uint8_t*)WebPMalloc(src->size); call 0 returned 100% 160: 87: if (dst->bytes == NULL) return 0; branch 0 taken 100% (fallthrough) branch 1 taken 0% 320: 88: memcpy((void*)dst->bytes, src->bytes, src->size); 160: 89: dst->size = src->size; -: 90: } -: 91: return 1; -: 92:} -: 93: -: 94:#ifdef __cplusplus -: 95:} // extern "C" -: 96:#endif -: 97: -: 98:#endif // WEBP_WEBP_MUX_TYPES_H_ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/#usr#include#webp#decode.h.gcov -: 0:Source:/usr/include/webp/decode.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:// Copyright 2010 Google Inc. All Rights Reserved. -: 2:// -: 3:// Use of this source code is governed by a BSD-style license -: 4:// that can be found in the COPYING file in the root of the source -: 5:// tree. An additional intellectual property rights grant can be found -: 6:// in the file PATENTS. All contributing project authors may -: 7:// be found in the AUTHORS file in the root of the source tree. -: 8:// ----------------------------------------------------------------------------- -: 9:// -: 10:// Main decoding functions for WebP images. -: 11:// -: 12:// Author: Skal (pascal.massimino@gmail.com) -: 13: -: 14:#ifndef WEBP_WEBP_DECODE_H_ -: 15:#define WEBP_WEBP_DECODE_H_ -: 16: -: 17:#include "./types.h" -: 18: -: 19:#ifdef __cplusplus -: 20:extern "C" { -: 21:#endif -: 22: -: 23:#define WEBP_DECODER_ABI_VERSION 0x0209 // MAJOR(8b) + MINOR(8b) -: 24: -: 25:// Note: forward declaring enumerations is not allowed in (strict) C and C++, -: 26:// the types are left here for reference. -: 27:// typedef enum VP8StatusCode VP8StatusCode; -: 28:// typedef enum WEBP_CSP_MODE WEBP_CSP_MODE; -: 29:typedef struct WebPRGBABuffer WebPRGBABuffer; -: 30:typedef struct WebPYUVABuffer WebPYUVABuffer; -: 31:typedef struct WebPDecBuffer WebPDecBuffer; -: 32:typedef struct WebPIDecoder WebPIDecoder; -: 33:typedef struct WebPBitstreamFeatures WebPBitstreamFeatures; -: 34:typedef struct WebPDecoderOptions WebPDecoderOptions; -: 35:typedef struct WebPDecoderConfig WebPDecoderConfig; -: 36: -: 37:// Return the decoder's version number, packed in hexadecimal using 8bits for -: 38:// each of major/minor/revision. E.g: v2.5.7 is 0x020507. -: 39:WEBP_EXTERN int WebPGetDecoderVersion(void); -: 40: -: 41:// Retrieve basic header information: width, height. -: 42:// This function will also validate the header, returning true on success, -: 43:// false otherwise. '*width' and '*height' are only valid on successful return. -: 44:// Pointers 'width' and 'height' can be passed NULL if deemed irrelevant. -: 45:// Note: The following chunk sequences (before the raw VP8/VP8L data) are -: 46:// considered valid by this function: -: 47:// RIFF + VP8(L) -: 48:// RIFF + VP8X + (optional chunks) + VP8(L) -: 49:// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose. -: 50:// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose. -: 51:WEBP_EXTERN int WebPGetInfo(const uint8_t* data, size_t data_size, -: 52: int* width, int* height); -: 53: -: 54:// Decodes WebP images pointed to by 'data' and returns RGBA samples, along -: 55:// with the dimensions in *width and *height. The ordering of samples in -: 56:// memory is R, G, B, A, R, G, B, A... in scan order (endian-independent). -: 57:// The returned pointer should be deleted calling WebPFree(). -: 58:// Returns NULL in case of error. -: 59:WEBP_EXTERN uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size, -: 60: int* width, int* height); -: 61: -: 62:// Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data. -: 63:WEBP_EXTERN uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size, -: 64: int* width, int* height); -: 65: -: 66:// Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data. -: 67:WEBP_EXTERN uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size, -: 68: int* width, int* height); -: 69: -: 70:// Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data. -: 71:// If the bitstream contains transparency, it is ignored. -: 72:WEBP_EXTERN uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, -: 73: int* width, int* height); -: 74: -: 75:// Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data. -: 76:WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size, -: 77: int* width, int* height); -: 78: -: 79: -: 80:// Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer -: 81:// returned is the Y samples buffer. Upon return, *u and *v will point to -: 82:// the U and V chroma data. These U and V buffers need NOT be passed to -: 83:// WebPFree(), unlike the returned Y luma one. The dimension of the U and V -: 84:// planes are both (*width + 1) / 2 and (*height + 1)/ 2. -: 85:// Upon return, the Y buffer has a stride returned as '*stride', while U and V -: 86:// have a common stride returned as '*uv_stride'. -: 87:// Return NULL in case of error. -: 88:// (*) Also named Y'CbCr. See: http://en.wikipedia.org/wiki/YCbCr -: 89:WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size, -: 90: int* width, int* height, -: 91: uint8_t** u, uint8_t** v, -: 92: int* stride, int* uv_stride); -: 93: -: 94:// These five functions are variants of the above ones, that decode the image -: 95:// directly into a pre-allocated buffer 'output_buffer'. The maximum storage -: 96:// available in this buffer is indicated by 'output_buffer_size'. If this -: 97:// storage is not sufficient (or an error occurred), NULL is returned. -: 98:// Otherwise, output_buffer is returned, for convenience. -: 99:// The parameter 'output_stride' specifies the distance (in bytes) -: 100:// between scanlines. Hence, output_buffer_size is expected to be at least -: 101:// output_stride x picture-height. -: 102:WEBP_EXTERN uint8_t* WebPDecodeRGBAInto( -: 103: const uint8_t* data, size_t data_size, -: 104: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 105:WEBP_EXTERN uint8_t* WebPDecodeARGBInto( -: 106: const uint8_t* data, size_t data_size, -: 107: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 108:WEBP_EXTERN uint8_t* WebPDecodeBGRAInto( -: 109: const uint8_t* data, size_t data_size, -: 110: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 111: -: 112:// RGB and BGR variants. Here too the transparency information, if present, -: 113:// will be dropped and ignored. -: 114:WEBP_EXTERN uint8_t* WebPDecodeRGBInto( -: 115: const uint8_t* data, size_t data_size, -: 116: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 117:WEBP_EXTERN uint8_t* WebPDecodeBGRInto( -: 118: const uint8_t* data, size_t data_size, -: 119: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 120: -: 121:// WebPDecodeYUVInto() is a variant of WebPDecodeYUV() that operates directly -: 122:// into pre-allocated luma/chroma plane buffers. This function requires the -: 123:// strides to be passed: one for the luma plane and one for each of the -: 124:// chroma ones. The size of each plane buffer is passed as 'luma_size', -: 125:// 'u_size' and 'v_size' respectively. -: 126:// Pointer to the luma plane ('*luma') is returned or NULL if an error occurred -: 127:// during decoding (or because some buffers were found to be too small). -: 128:WEBP_EXTERN uint8_t* WebPDecodeYUVInto( -: 129: const uint8_t* data, size_t data_size, -: 130: uint8_t* luma, size_t luma_size, int luma_stride, -: 131: uint8_t* u, size_t u_size, int u_stride, -: 132: uint8_t* v, size_t v_size, int v_stride); -: 133: -: 134://------------------------------------------------------------------------------ -: 135:// Output colorspaces and buffer -: 136: -: 137:// Colorspaces -: 138:// Note: the naming describes the byte-ordering of packed samples in memory. -: 139:// For instance, MODE_BGRA relates to samples ordered as B,G,R,A,B,G,R,A,... -: 140:// Non-capital names (e.g.:MODE_Argb) relates to pre-multiplied RGB channels. -: 141:// RGBA-4444 and RGB-565 colorspaces are represented by following byte-order: -: 142:// RGBA-4444: [r3 r2 r1 r0 g3 g2 g1 g0], [b3 b2 b1 b0 a3 a2 a1 a0], ... -: 143:// RGB-565: [r4 r3 r2 r1 r0 g5 g4 g3], [g2 g1 g0 b4 b3 b2 b1 b0], ... -: 144:// In the case WEBP_SWAP_16BITS_CSP is defined, the bytes are swapped for -: 145:// these two modes: -: 146:// RGBA-4444: [b3 b2 b1 b0 a3 a2 a1 a0], [r3 r2 r1 r0 g3 g2 g1 g0], ... -: 147:// RGB-565: [g2 g1 g0 b4 b3 b2 b1 b0], [r4 r3 r2 r1 r0 g5 g4 g3], ... -: 148: -: 149:typedef enum WEBP_CSP_MODE { -: 150: MODE_RGB = 0, MODE_RGBA = 1, -: 151: MODE_BGR = 2, MODE_BGRA = 3, -: 152: MODE_ARGB = 4, MODE_RGBA_4444 = 5, -: 153: MODE_RGB_565 = 6, -: 154: // RGB-premultiplied transparent modes (alpha value is preserved) -: 155: MODE_rgbA = 7, -: 156: MODE_bgrA = 8, -: 157: MODE_Argb = 9, -: 158: MODE_rgbA_4444 = 10, -: 159: // YUV modes must come after RGB ones. -: 160: MODE_YUV = 11, MODE_YUVA = 12, // yuv 4:2:0 -: 161: MODE_LAST = 13 -: 162:} WEBP_CSP_MODE; -: 163: -: 164:// Some useful macros: -: 165:static WEBP_INLINE int WebPIsPremultipliedMode(WEBP_CSP_MODE mode) { -: 166: return (mode == MODE_rgbA || mode == MODE_bgrA || mode == MODE_Argb || -: 167: mode == MODE_rgbA_4444); -: 168:} -: 169: -: 170:static WEBP_INLINE int WebPIsAlphaMode(WEBP_CSP_MODE mode) { -: 171: return (mode == MODE_RGBA || mode == MODE_BGRA || mode == MODE_ARGB || -: 172: mode == MODE_RGBA_4444 || mode == MODE_YUVA || -: 173: WebPIsPremultipliedMode(mode)); -: 174:} -: 175: -: 176:static WEBP_INLINE int WebPIsRGBMode(WEBP_CSP_MODE mode) { -: 177: return (mode < MODE_YUV); -: 178:} -: 179: -: 180://------------------------------------------------------------------------------ -: 181:// WebPDecBuffer: Generic structure for describing the output sample buffer. -: 182: -: 183:struct WebPRGBABuffer { // view as RGBA -: 184: uint8_t* rgba; // pointer to RGBA samples -: 185: int stride; // stride in bytes from one scanline to the next. -: 186: size_t size; // total size of the *rgba buffer. -: 187:}; -: 188: -: 189:struct WebPYUVABuffer { // view as YUVA -: 190: uint8_t* y, *u, *v, *a; // pointer to luma, chroma U/V, alpha samples -: 191: int y_stride; // luma stride -: 192: int u_stride, v_stride; // chroma strides -: 193: int a_stride; // alpha stride -: 194: size_t y_size; // luma plane size -: 195: size_t u_size, v_size; // chroma planes size -: 196: size_t a_size; // alpha-plane size -: 197:}; -: 198: -: 199:// Output buffer -: 200:struct WebPDecBuffer { -: 201: WEBP_CSP_MODE colorspace; // Colorspace. -: 202: int width, height; // Dimensions. -: 203: int is_external_memory; // If non-zero, 'internal_memory' pointer is not -: 204: // used. If value is '2' or more, the external -: 205: // memory is considered 'slow' and multiple -: 206: // read/write will be avoided. -: 207: union { -: 208: WebPRGBABuffer RGBA; -: 209: WebPYUVABuffer YUVA; -: 210: } u; // Nameless union of buffer parameters. -: 211: uint32_t pad[4]; // padding for later use -: 212: -: 213: uint8_t* private_memory; // Internally allocated memory (only when -: 214: // is_external_memory is 0). Should not be used -: 215: // externally, but accessed via the buffer union. -: 216:}; -: 217: -: 218:// Internal, version-checked, entry point -: 219:WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int); -: 220: -: 221:// Initialize the structure as empty. Must be called before any other use. -: 222:// Returns false in case of version mismatch -: 223:static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) { -: 224: return WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION); -: 225:} -: 226: -: 227:// Free any memory associated with the buffer. Must always be called last. -: 228:// Note: doesn't free the 'buffer' structure itself. -: 229:WEBP_EXTERN void WebPFreeDecBuffer(WebPDecBuffer* buffer); -: 230: -: 231://------------------------------------------------------------------------------ -: 232:// Enumeration of the status codes -: 233: -: 234:typedef enum VP8StatusCode { -: 235: VP8_STATUS_OK = 0, -: 236: VP8_STATUS_OUT_OF_MEMORY, -: 237: VP8_STATUS_INVALID_PARAM, -: 238: VP8_STATUS_BITSTREAM_ERROR, -: 239: VP8_STATUS_UNSUPPORTED_FEATURE, -: 240: VP8_STATUS_SUSPENDED, -: 241: VP8_STATUS_USER_ABORT, -: 242: VP8_STATUS_NOT_ENOUGH_DATA -: 243:} VP8StatusCode; -: 244: -: 245://------------------------------------------------------------------------------ -: 246:// Incremental decoding -: 247:// -: 248:// This API allows streamlined decoding of partial data. -: 249:// Picture can be incrementally decoded as data become available thanks to the -: 250:// WebPIDecoder object. This object can be left in a SUSPENDED state if the -: 251:// picture is only partially decoded, pending additional input. -: 252:// Code example: -: 253:// -: 254:// WebPInitDecBuffer(&output_buffer); -: 255:// output_buffer.colorspace = mode; -: 256:// ... -: 257:// WebPIDecoder* idec = WebPINewDecoder(&output_buffer); -: 258:// while (additional_data_is_available) { -: 259:// // ... (get additional data in some new_data[] buffer) -: 260:// status = WebPIAppend(idec, new_data, new_data_size); -: 261:// if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) { -: 262:// break; // an error occurred. -: 263:// } -: 264:// -: 265:// // The above call decodes the current available buffer. -: 266:// // Part of the image can now be refreshed by calling -: 267:// // WebPIDecGetRGB()/WebPIDecGetYUVA() etc. -: 268:// } -: 269:// WebPIDelete(idec); -: 270: -: 271:// Creates a new incremental decoder with the supplied buffer parameter. -: 272:// This output_buffer can be passed NULL, in which case a default output buffer -: 273:// is used (with MODE_RGB). Otherwise, an internal reference to 'output_buffer' -: 274:// is kept, which means that the lifespan of 'output_buffer' must be larger than -: 275:// that of the returned WebPIDecoder object. -: 276:// The supplied 'output_buffer' content MUST NOT be changed between calls to -: 277:// WebPIAppend() or WebPIUpdate() unless 'output_buffer.is_external_memory' is -: 278:// not set to 0. In such a case, it is allowed to modify the pointers, size and -: 279:// stride of output_buffer.u.RGBA or output_buffer.u.YUVA, provided they remain -: 280:// within valid bounds. -: 281:// All other fields of WebPDecBuffer MUST remain constant between calls. -: 282:// Returns NULL if the allocation failed. -: 283:WEBP_EXTERN WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer); -: 284: -: 285:// This function allocates and initializes an incremental-decoder object, which -: 286:// will output the RGB/A samples specified by 'csp' into a preallocated -: 287:// buffer 'output_buffer'. The size of this buffer is at least -: 288:// 'output_buffer_size' and the stride (distance in bytes between two scanlines) -: 289:// is specified by 'output_stride'. -: 290:// Additionally, output_buffer can be passed NULL in which case the output -: 291:// buffer will be allocated automatically when the decoding starts. The -: 292:// colorspace 'csp' is taken into account for allocating this buffer. All other -: 293:// parameters are ignored. -: 294:// Returns NULL if the allocation failed, or if some parameters are invalid. -: 295:WEBP_EXTERN WebPIDecoder* WebPINewRGB( -: 296: WEBP_CSP_MODE csp, -: 297: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 298: -: 299:// This function allocates and initializes an incremental-decoder object, which -: 300:// will output the raw luma/chroma samples into a preallocated planes if -: 301:// supplied. The luma plane is specified by its pointer 'luma', its size -: 302:// 'luma_size' and its stride 'luma_stride'. Similarly, the chroma-u plane -: 303:// is specified by the 'u', 'u_size' and 'u_stride' parameters, and the chroma-v -: 304:// plane by 'v' and 'v_size'. And same for the alpha-plane. The 'a' pointer -: 305:// can be pass NULL in case one is not interested in the transparency plane. -: 306:// Conversely, 'luma' can be passed NULL if no preallocated planes are supplied. -: 307:// In this case, the output buffer will be automatically allocated (using -: 308:// MODE_YUVA) when decoding starts. All parameters are then ignored. -: 309:// Returns NULL if the allocation failed or if a parameter is invalid. -: 310:WEBP_EXTERN WebPIDecoder* WebPINewYUVA( -: 311: uint8_t* luma, size_t luma_size, int luma_stride, -: 312: uint8_t* u, size_t u_size, int u_stride, -: 313: uint8_t* v, size_t v_size, int v_stride, -: 314: uint8_t* a, size_t a_size, int a_stride); -: 315: -: 316:// Deprecated version of the above, without the alpha plane. -: 317:// Kept for backward compatibility. -: 318:WEBP_EXTERN WebPIDecoder* WebPINewYUV( -: 319: uint8_t* luma, size_t luma_size, int luma_stride, -: 320: uint8_t* u, size_t u_size, int u_stride, -: 321: uint8_t* v, size_t v_size, int v_stride); -: 322: -: 323:// Deletes the WebPIDecoder object and associated memory. Must always be called -: 324:// if WebPINewDecoder, WebPINewRGB or WebPINewYUV succeeded. -: 325:WEBP_EXTERN void WebPIDelete(WebPIDecoder* idec); -: 326: -: 327:// Copies and decodes the next available data. Returns VP8_STATUS_OK when -: 328:// the image is successfully decoded. Returns VP8_STATUS_SUSPENDED when more -: 329:// data is expected. Returns error in other cases. -: 330:WEBP_EXTERN VP8StatusCode WebPIAppend( -: 331: WebPIDecoder* idec, const uint8_t* data, size_t data_size); -: 332: -: 333:// A variant of the above function to be used when data buffer contains -: 334:// partial data from the beginning. In this case data buffer is not copied -: 335:// to the internal memory. -: 336:// Note that the value of the 'data' pointer can change between calls to -: 337:// WebPIUpdate, for instance when the data buffer is resized to fit larger data. -: 338:WEBP_EXTERN VP8StatusCode WebPIUpdate( -: 339: WebPIDecoder* idec, const uint8_t* data, size_t data_size); -: 340: -: 341:// Returns the RGB/A image decoded so far. Returns NULL if output params -: 342:// are not initialized yet. The RGB/A output type corresponds to the colorspace -: 343:// specified during call to WebPINewDecoder() or WebPINewRGB(). -: 344:// *last_y is the index of last decoded row in raster scan order. Some pointers -: 345:// (*last_y, *width etc.) can be NULL if corresponding information is not -: 346:// needed. The values in these pointers are only valid on successful (non-NULL) -: 347:// return. -: 348:WEBP_EXTERN uint8_t* WebPIDecGetRGB( -: 349: const WebPIDecoder* idec, int* last_y, -: 350: int* width, int* height, int* stride); -: 351: -: 352:// Same as above function to get a YUVA image. Returns pointer to the luma -: 353:// plane or NULL in case of error. If there is no alpha information -: 354:// the alpha pointer '*a' will be returned NULL. -: 355:WEBP_EXTERN uint8_t* WebPIDecGetYUVA( -: 356: const WebPIDecoder* idec, int* last_y, -: 357: uint8_t** u, uint8_t** v, uint8_t** a, -: 358: int* width, int* height, int* stride, int* uv_stride, int* a_stride); -: 359: -: 360:// Deprecated alpha-less version of WebPIDecGetYUVA(): it will ignore the -: 361:// alpha information (if present). Kept for backward compatibility. -: 362:static WEBP_INLINE uint8_t* WebPIDecGetYUV( -: 363: const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v, -: 364: int* width, int* height, int* stride, int* uv_stride) { -: 365: return WebPIDecGetYUVA(idec, last_y, u, v, NULL, width, height, -: 366: stride, uv_stride, NULL); -: 367:} -: 368: -: 369:// Generic call to retrieve information about the displayable area. -: 370:// If non NULL, the left/right/width/height pointers are filled with the visible -: 371:// rectangular area so far. -: 372:// Returns NULL in case the incremental decoder object is in an invalid state. -: 373:// Otherwise returns the pointer to the internal representation. This structure -: 374:// is read-only, tied to WebPIDecoder's lifespan and should not be modified. -: 375:WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea( -: 376: const WebPIDecoder* idec, int* left, int* top, int* width, int* height); -: 377: -: 378://------------------------------------------------------------------------------ -: 379:// Advanced decoding parametrization -: 380:// -: 381:// Code sample for using the advanced decoding API -: 382:/* -: 383: // A) Init a configuration object -: 384: WebPDecoderConfig config; -: 385: CHECK(WebPInitDecoderConfig(&config)); -: 386: -: 387: // B) optional: retrieve the bitstream's features. -: 388: CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK); -: 389: -: 390: // C) Adjust 'config', if needed -: 391: config.no_fancy_upsampling = 1; -: 392: config.output.colorspace = MODE_BGRA; -: 393: // etc. -: 394: -: 395: // Note that you can also make config.output point to an externally -: 396: // supplied memory buffer, provided it's big enough to store the decoded -: 397: // picture. Otherwise, config.output will just be used to allocate memory -: 398: // and store the decoded picture. -: 399: -: 400: // D) Decode! -: 401: CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK); -: 402: -: 403: // E) Decoded image is now in config.output (and config.output.u.RGBA) -: 404: -: 405: // F) Reclaim memory allocated in config's object. It's safe to call -: 406: // this function even if the memory is external and wasn't allocated -: 407: // by WebPDecode(). -: 408: WebPFreeDecBuffer(&config.output); -: 409:*/ -: 410: -: 411:// Features gathered from the bitstream -: 412:struct WebPBitstreamFeatures { -: 413: int width; // Width in pixels, as read from the bitstream. -: 414: int height; // Height in pixels, as read from the bitstream. -: 415: int has_alpha; // True if the bitstream contains an alpha channel. -: 416: int has_animation; // True if the bitstream is an animation. -: 417: int format; // 0 = undefined (/mixed), 1 = lossy, 2 = lossless -: 418: -: 419: uint32_t pad[5]; // padding for later use -: 420:}; -: 421: -: 422:// Internal, version-checked, entry point -: 423:WEBP_EXTERN VP8StatusCode WebPGetFeaturesInternal( -: 424: const uint8_t*, size_t, WebPBitstreamFeatures*, int); -: 425: -: 426:// Retrieve features from the bitstream. The *features structure is filled -: 427:// with information gathered from the bitstream. -: 428:// Returns VP8_STATUS_OK when the features are successfully retrieved. Returns -: 429:// VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the -: 430:// features from headers. Returns error in other cases. -: 431:// Note: The following chunk sequences (before the raw VP8/VP8L data) are -: 432:// considered valid by this function: -: 433:// RIFF + VP8(L) -: 434:// RIFF + VP8X + (optional chunks) + VP8(L) -: 435:// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose. -: 436:// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose. -: 437:static WEBP_INLINE VP8StatusCode WebPGetFeatures( -: 438: const uint8_t* data, size_t data_size, -: 439: WebPBitstreamFeatures* features) { 160: 440: return WebPGetFeaturesInternal(data, data_size, features, call 0 never executed call 1 returned 100% -: 441: WEBP_DECODER_ABI_VERSION); -: 442:} -: 443: -: 444:// Decoding options -: 445:struct WebPDecoderOptions { -: 446: int bypass_filtering; // if true, skip the in-loop filtering -: 447: int no_fancy_upsampling; // if true, use faster pointwise upsampler -: 448: int use_cropping; // if true, cropping is applied _first_ -: 449: int crop_left, crop_top; // top-left position for cropping. -: 450: // Will be snapped to even values. -: 451: int crop_width, crop_height; // dimension of the cropping area -: 452: int use_scaling; // if true, scaling is applied _afterward_ -: 453: int scaled_width, scaled_height; // final resolution -: 454: int use_threads; // if true, use multi-threaded decoding -: 455: int dithering_strength; // dithering strength (0=Off, 100=full) -: 456: int flip; // flip output vertically -: 457: int alpha_dithering_strength; // alpha dithering strength in [0..100] -: 458: -: 459: uint32_t pad[5]; // padding for later use -: 460:}; -: 461: -: 462:// Main object storing the configuration for advanced decoding. -: 463:struct WebPDecoderConfig { -: 464: WebPBitstreamFeatures input; // Immutable bitstream features (optional) -: 465: WebPDecBuffer output; // Output buffer (can point to external mem) -: 466: WebPDecoderOptions options; // Decoding options -: 467:}; -: 468: -: 469:// Internal, version-checked, entry point -: 470:WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*, int); -: 471: -: 472:// Initialize the configuration as empty. This function must always be -: 473:// called first, unless WebPGetFeatures() is to be called. -: 474:// Returns false in case of mismatched version. -: 475:static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) { #####: 476: return WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION); call 0 never executed -: 477:} -: 478: -: 479:// Instantiate a new incremental decoder object with the requested -: 480:// configuration. The bitstream can be passed using 'data' and 'data_size' -: 481:// parameter, in which case the features will be parsed and stored into -: 482:// config->input. Otherwise, 'data' can be NULL and no parsing will occur. -: 483:// Note that 'config' can be NULL too, in which case a default configuration -: 484:// is used. If 'config' is not NULL, it must outlive the WebPIDecoder object -: 485:// as some references to its fields will be used. No internal copy of 'config' -: 486:// is made. -: 487:// The return WebPIDecoder object must always be deleted calling WebPIDelete(). -: 488:// Returns NULL in case of error (and config->status will then reflect -: 489:// the error condition, if available). -: 490:WEBP_EXTERN WebPIDecoder* WebPIDecode(const uint8_t* data, size_t data_size, -: 491: WebPDecoderConfig* config); -: 492: -: 493:// Non-incremental version. This version decodes the full data at once, taking -: 494:// 'config' into account. Returns decoding status (which should be VP8_STATUS_OK -: 495:// if the decoding was successful). Note that 'config' cannot be NULL. -: 496:WEBP_EXTERN VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size, -: 497: WebPDecoderConfig* config); -: 498: -: 499:#ifdef __cplusplus -: 500:} // extern "C" -: 501:#endif -: 502: -: 503:#endif // WEBP_WEBP_DECODE_H_ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#GifEncode.c.gcov -: 0:Source:src/libImaging/GifEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/GifEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/GifEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * encoder for uncompressed GIF data -: 6: * -: 7: * history: -: 8: * 97-01-05 fl created (writes uncompressed data) -: 9: * 97-08-27 fl fixed off-by-one error in buffer size test -: 10: * 98-07-09 fl added interlace write support -: 11: * 99-02-07 fl rewritten, now uses a run-length encoding strategy -: 12: * 99-02-08 fl improved run-length encoding for long runs -: 13: * -: 14: * Copyright (c) Secret Labs AB 1997-99. -: 15: * Copyright (c) Fredrik Lundh 1997. -: 16: * -: 17: * See the README file for information on usage and redistribution. -: 18: */ -: 19: -: 20:#include "Imaging.h" -: 21: -: 22:#include "Gif.h" -: 23: -: 24:/* codes from 0 to 255 are literals */ -: 25:#define CLEAR_CODE 256 -: 26:#define EOF_CODE 257 -: 27:#define FIRST_CODE 258 -: 28:#define LAST_CODE 511 -: 29: -: 30:enum { INIT, ENCODE, ENCODE_EOF, FLUSH, EXIT }; -: 31: -: 32:/* to make things a little less complicated, we use a simple output -: 33: queue to hold completed blocks. the following inlined function -: 34: adds a byte to the current block. it allocates a new block if -: 35: necessary. */ -: 36: -: 37:static inline int function emit called 2920221 returned 100% blocks executed 100% 2920221: 38:emit(GIFENCODERSTATE *context, int byte) -: 39:{ -: 40: /* write a byte to the output buffer */ -: 41: 2920221: 42: if (!context->block || context->block->size == 255) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% -: 43: GIFENCODERBLOCK* block; -: 44: -: 45: /* no room in the current block (or no current block); -: 46: allocate a new one */ -: 47: -: 48: /* add current block to end of flush queue */ 11495: 49: if (context->block) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 11388: 50: block = context->flush; 11388: 51: while (block && block->next) { branch 0 taken 33% (fallthrough) branch 1 taken 67% branch 2 taken 8% (fallthrough) branch 3 taken 92% -: 52: block = block->next; -: 53: } 11388: 54: if (block) { branch 0 taken 31% (fallthrough) branch 1 taken 69% 3535: 55: block->next = context->block; -: 56: } else { 7853: 57: context->flush = context->block; -: 58: } -: 59: } -: 60: -: 61: /* get a new block */ 11495: 62: if (context->free) { branch 0 taken 68% (fallthrough) branch 1 taken 32% 7798: 63: block = context->free; 7798: 64: context->free = NULL; -: 65: } else { -: 66: /* malloc check ok, small constant allocation */ 3697: 67: block = malloc(sizeof(GIFENCODERBLOCK)); 3697: 68: if (!block) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 69: return 0; -: 70: } -: 71: } -: 72: 11495: 73: block->size = 0; 11495: 74: block->next = NULL; -: 75: 11495: 76: context->block = block; -: 77: -: 78: } -: 79: -: 80: /* write new byte to block */ 2920221: 81: context->block->data[context->block->size++] = byte; -: 82: 2920221: 83: return 1; -: 84:} -: 85: -: 86:/* write a code word to the current block. this is a macro to make -: 87: sure it's inlined on all platforms */ -: 88: -: 89:#define EMIT(code) {\ -: 90: context->bitbuffer |= ((INT32) (code)) << context->bitcount;\ -: 91: context->bitcount += 9;\ -: 92: while (context->bitcount >= 8) {\ -: 93: if (!emit(context, (UINT8) context->bitbuffer)) {\ -: 94: state->errcode = IMAGING_CODEC_MEMORY;\ -: 95: return 0;\ -: 96: }\ -: 97: context->bitbuffer >>= 8;\ -: 98: context->bitcount -= 8;\ -: 99: }\ -: 100:} -: 101: -: 102:/* write a run. we use a combination of literals and combinations of -: 103: literals. this can give quite decent compression for images with -: 104: long stretches of identical pixels. but remember: if you want -: 105: really good compression, use another file format. */ -: 106: -: 107:#define EMIT_RUN(label) {\ -: 108:label:\ -: 109: while (context->count > 0) {\ -: 110: int run = 2;\ -: 111: EMIT(context->last);\ -: 112: context->count--;\ -: 113: if (state->count++ == LAST_CODE) {\ -: 114: EMIT(CLEAR_CODE);\ -: 115: state->count = FIRST_CODE;\ -: 116: goto label;\ -: 117: }\ -: 118: while (context->count >= run) {\ -: 119: EMIT(state->count - 1);\ -: 120: context->count -= run;\ -: 121: run++;\ -: 122: if (state->count++ == LAST_CODE) {\ -: 123: EMIT(CLEAR_CODE);\ -: 124: state->count = FIRST_CODE;\ -: 125: goto label;\ -: 126: }\ -: 127: }\ -: 128: if (context->count > 1) {\ -: 129: EMIT(state->count - 1 - (run - context->count));\ -: 130: context->count = 0;\ -: 131: if (state->count++ == LAST_CODE) {\ -: 132: EMIT(CLEAR_CODE);\ -: 133: state->count = FIRST_CODE;\ -: 134: }\ -: 135: break;\ -: 136: }\ -: 137: }\ -: 138:} -: 139: -: 140:int function ImagingGifEncode called 140 returned 100% blocks executed 83% 140: 141:ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 142:{ -: 143: UINT8* ptr; -: 144: int this; -: 145: -: 146: GIFENCODERBLOCK* block; 140: 147: GIFENCODERSTATE *context = (GIFENCODERSTATE*) state->context; -: 148: 140: 149: if (!state->state) { branch 0 taken 76% (fallthrough) branch 1 taken 24% -: 150: -: 151: /* place a clear code in the output buffer */ 107: 152: context->bitbuffer = CLEAR_CODE; 107: 153: context->bitcount = 9; -: 154: 107: 155: state->count = FIRST_CODE; -: 156: 107: 157: if (context->interlace) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 38: 158: context->interlace = 1; 38: 159: context->step = 8; -: 160: } else { 69: 161: context->step = 1; -: 162: } -: 163: 107: 164: context->last = -1; -: 165: -: 166: /* sanity check */ 107: 167: if (state->xsize <= 0 || state->ysize <= 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 168: state->state = ENCODE_EOF; -: 169: } -: 170: -: 171: } -: 172: -: 173: ptr = buf; -: 174: -: 175: for (;;) -: 176: 6715955: 177: switch (state->state) { branch 0 taken 0% branch 1 taken 1% branch 2 taken 99% branch 3 taken 1% -: 178: -: 179: case INIT: -: 180: case ENCODE: -: 181: -: 182: /* identify and store a run of pixels */ -: 183: 6707978: 184: if (state->x == 0 || state->x >= state->xsize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% -: 185: 24878: 186: if (!context->interlace && state->y >= state->ysize) { branch 0 taken 62% (fallthrough) branch 1 taken 38% branch 2 taken 1% (fallthrough) branch 3 taken 99% 107: 187: state->state = ENCODE_EOF; 107: 188: break; -: 189: } -: 190: 24771: 191: if (context->flush) { branch 0 taken 32% (fallthrough) branch 1 taken 68% 7837: 192: state->state = FLUSH; 7837: 193: break; -: 194: } -: 195: -: 196: /* get another line of data */ 33868: 197: state->shuffle( call 0 returned 100% -: 198: state->buffer, 16934: 199: (UINT8*) im->image[state->y + state->yoff] + 16934: 200: state->xoff * im->pixelsize, state->xsize -: 201: ); -: 202: 16934: 203: state->x = 0; -: 204: 16934: 205: if (state->state == INIT) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 206: /* preload the run-length buffer and get going */ 107: 207: context->last = state->buffer[0]; 107: 208: context->count = state->x = 1; 107: 209: state->state = ENCODE; -: 210: } -: 211: -: 212: /* step forward, according to the interlace settings */ 16934: 213: state->y += context->step; 33982: 214: while (context->interlace && state->y >= state->ysize) branch 0 taken 33% (fallthrough) branch 1 taken 67% branch 2 taken 2% branch 3 taken 98% (fallthrough) 114: 215: switch (context->interlace) { branch 0 taken 33% branch 1 taken 33% branch 2 taken 33% branch 3 taken 0% -: 216: case 1: 38: 217: state->y = 4; 38: 218: context->interlace = 2; 38: 219: break; -: 220: case 2: 38: 221: context->step = 4; 38: 222: state->y = 2; 38: 223: context->interlace = 3; 38: 224: break; -: 225: case 3: 38: 226: context->step = 2; 38: 227: state->y = 1; 38: 228: context->interlace = 0; 38: 229: break; -: 230: default: -: 231: /* just make sure we don't loop forever */ #####: 232: context->interlace = 0; -: 233: } -: 234: -: 235: } -: 236: 6700034: 237: this = state->buffer[state->x++]; -: 238: 6700034: 239: if (this == context->last) { branch 0 taken 13% (fallthrough) branch 1 taken 87% 5838910: 240: context->count++; -: 241: } else { 1400282: 242: EMIT_RUN(label1); call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% branch 3 taken 53% branch 4 taken 47% (fallthrough) branch 5 taken 1% (fallthrough) branch 6 taken 99% call 7 returned 100% branch 8 taken 0% (fallthrough) branch 9 taken 100% branch 10 taken 53% branch 11 taken 47% (fallthrough) call 12 returned 100% branch 13 taken 0% (fallthrough) branch 14 taken 100% branch 15 taken 53% branch 16 taken 47% (fallthrough) branch 17 taken 1% (fallthrough) branch 18 taken 99% call 19 returned 100% branch 20 taken 0% (fallthrough) branch 21 taken 100% branch 22 taken 53% branch 23 taken 47% (fallthrough) branch 24 taken 42% branch 25 taken 58% (fallthrough) branch 26 taken 11% (fallthrough) branch 27 taken 89% call 28 returned 100% branch 29 taken 0% (fallthrough) branch 30 taken 100% branch 31 taken 53% branch 32 taken 47% (fallthrough) branch 33 taken 1% (fallthrough) branch 34 taken 99% call 35 returned 100% branch 36 taken 0% (fallthrough) branch 37 taken 100% branch 38 taken 53% branch 39 taken 47% (fallthrough) branch 40 taken 67% branch 41 taken 33% (fallthrough) 861124: 243: context->last = this; 861124: 244: context->count = 1; -: 245: } -: 246: break; -: 247: -: 248: -: 249: case ENCODE_EOF: -: 250: -: 251: /* write the final run */ 127: 252: EMIT_RUN(label2); call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% branch 3 taken 59% branch 4 taken 41% (fallthrough) branch 5 taken 0% (fallthrough) branch 6 taken 100% call 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed call 12 returned 100% branch 13 taken 0% (fallthrough) branch 14 taken 100% branch 15 taken 53% branch 16 taken 47% (fallthrough) branch 17 taken 1% (fallthrough) branch 18 taken 99% call 19 returned 100% branch 20 taken 0% (fallthrough) branch 21 taken 100% branch 22 taken 56% branch 23 taken 44% (fallthrough) branch 24 taken 99% branch 25 taken 1% (fallthrough) branch 26 taken 71% (fallthrough) branch 27 taken 29% call 28 returned 100% branch 29 taken 0% (fallthrough) branch 30 taken 100% branch 31 taken 51% branch 32 taken 49% (fallthrough) branch 33 taken 0% (fallthrough) branch 34 taken 100% call 35 never executed branch 36 never executed branch 37 never executed branch 38 never executed branch 39 never executed branch 40 taken 84% branch 41 taken 16% (fallthrough) -: 253: -: 254: /* write an end of image marker */ 107: 255: EMIT(EOF_CODE); call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% branch 3 taken 51% branch 4 taken 49% (fallthrough) -: 256: -: 257: /* empty the bit buffer */ 209: 258: while (context->bitcount > 0) { branch 0 taken 49% branch 1 taken 51% (fallthrough) 102: 259: if (!emit(context, (UINT8) context->bitbuffer)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 260: state->errcode = IMAGING_CODEC_MEMORY; #####: 261: return 0; -: 262: } 102: 263: context->bitbuffer >>= 8; 102: 264: context->bitcount -= 8; -: 265: } -: 266: -: 267: /* flush the last block, and exit */ 107: 268: if (context->block) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 269: GIFENCODERBLOCK* block; 107: 270: block = context->flush; 107: 271: while (block && block->next) { branch 0 taken 19% (fallthrough) branch 1 taken 81% branch 2 taken 24% branch 3 taken 76% (fallthrough) -: 272: block = block->next; -: 273: } 107: 274: if (block) { branch 0 taken 15% (fallthrough) branch 1 taken 85% 16: 275: block->next = context->block; -: 276: } else { 91: 277: context->flush = context->block; -: 278: } 107: 279: context->block = NULL; -: 280: } -: 281: 107: 282: state->state = EXIT; -: 283: -: 284: /* fall through... */ -: 285: -: 286: case EXIT: -: 287: case FLUSH: -: 288: 19472: 289: while (context->flush) { branch 0 taken 59% branch 1 taken 41% (fallthrough) -: 290: -: 291: /* get a block from the flush queue */ 11528: 292: block = context->flush; -: 293: 11528: 294: if (block->size > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 295: -: 296: /* make sure it fits into the output buffer */ 11528: 297: if (bytes < block->size+1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 33: 298: return ptr - buf; -: 299: } -: 300: 11495: 301: ptr[0] = block->size; 22990: 302: memcpy(ptr+1, block->data, block->size); -: 303: 11495: 304: ptr += block->size+1; 11495: 305: bytes -= block->size+1; -: 306: -: 307: } -: 308: 11495: 309: context->flush = block->next; -: 310: 11495: 311: if (context->free) { branch 0 taken 31% (fallthrough) branch 1 taken 69% 3590: 312: free(context->free); -: 313: } 11495: 314: context->free = block; -: 315: -: 316: } -: 317: 7944: 318: if (state->state == EXIT) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 319: /* this was the last block! */ 107: 320: if (context->free) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 107: 321: free(context->free); -: 322: } 107: 323: state->errcode = IMAGING_CODEC_END; 107: 324: return ptr - buf; -: 325: } -: 326: 7837: 327: state->state = ENCODE; 7837: 328: break; -: 329: } -: 330:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#File.c.gcov -: 0:Source:src/libImaging/File.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/File.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/File.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * built-in image file handling -: 6: * -: 7: * history: -: 8: * 1995-11-26 fl Created, supports PGM/PPM -: 9: * 1996-08-07 fl Write "1" images as PGM -: 10: * 1999-02-21 fl Don't write non-standard modes -: 11: * -: 12: * Copyright (c) 1997-99 by Secret Labs AB. -: 13: * Copyright (c) 1995-96 by Fredrik Lundh. -: 14: * -: 15: * See the README file for information on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21:#include -: 22: -: 23: -: 24:int function ImagingSaveRaw called 20 returned 100% blocks executed 94% 20: 25:ImagingSaveRaw(Imaging im, FILE* fp) -: 26:{ -: 27: int x, y, i; -: 28: 20: 29: if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 35% (fallthrough) branch 5 taken 65% branch 6 taken 65% (fallthrough) branch 7 taken 35% -: 30: -: 31: /* @PIL227: FIXME: for mode "1", map != 0 to 255 */ -: 32: -: 33: /* PGM "L" */ 778: 34: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% branch 1 taken 1% 778: 35: fwrite(im->image[y], 1, im->xsize, fp); call 0 returned 100% -: 36: } -: 37: -: 38: } else { -: 39: -: 40: /* PPM "RGB" or other internal format */ 1546: 41: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 196708: 42: for (x = i = 0; x < im->xsize; x++, i += im->pixelsize) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 196708: 43: fwrite(im->image[y]+i, 1, im->bands, fp); call 0 returned 100% -: 44: } -: 45: } -: 46: -: 47: } -: 48: 20: 49: return 1; -: 50:} -: 51: -: 52: -: 53:int function ImagingSavePPM called 21 returned 100% blocks executed 81% 21: 54:ImagingSavePPM(Imaging im, const char* outfile) -: 55:{ -: 56: FILE* fp; -: 57: 21: 58: if (!im) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 59: (void) ImagingError_ValueError(NULL); call 0 never executed #####: 60: return 0; -: 61: } -: 62: 21: 63: fp = fopen(outfile, "wb"); call 0 returned 100% 21: 64: if (!fp) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 65: (void) ImagingError_OSError(); call 0 never executed #####: 66: return 0; -: 67: } -: 68: 21: 69: if (strcmp(im->mode, "1") == 0 || strcmp(im->mode, "L") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 33% (fallthrough) branch 5 taken 67% branch 6 taken 33% (fallthrough) branch 7 taken 67% -: 70: /* Write "PGM" */ 7: 71: fprintf(fp, "P5\n%d %d\n255\n", im->xsize, im->ysize); 14: 72: } else if (strcmp(im->mode, "RGB") == 0) { branch 0 taken 93% (fallthrough) branch 1 taken 7% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 93% (fallthrough) branch 7 taken 7% -: 73: /* Write "PPM" */ 13: 74: fprintf(fp, "P6\n%d %d\n255\n", im->xsize, im->ysize); -: 75: } else { 1: 76: fclose(fp); call 0 returned 100% 1: 77: (void) ImagingError_ModeError(); call 0 returned 100% 1: 78: return 0; -: 79: } -: 80: 20: 81: ImagingSaveRaw(im, fp); call 0 returned 100% -: 82: 20: 83: fclose(fp); call 0 returned 100% -: 84: 20: 85: return 1; -: 86:} -: 87: <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Negative.c.gcov -: 0:Source:src/libImaging/Negative.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Negative.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Negative.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * negate image -: 6: * -: 7: * to do: -: 8: * FIXME: Maybe this should be implemented using ImagingPoint() -: 9: * -: 10: * history: -: 11: * 95-11-27 fl: Created -: 12: * -: 13: * Copyright (c) Fredrik Lundh 1995. -: 14: * Copyright (c) Secret Labs AB 1997. -: 15: * -: 16: * See the README file for information on usage and redistribution. -: 17: */ -: 18: -: 19: -: 20:#include "Imaging.h" -: 21: -: 22: -: 23:Imaging function ImagingNegative called 2 returned 100% blocks executed 91% 2: 24:ImagingNegative(Imaging im) -: 25:{ -: 26: Imaging imOut; -: 27: int x, y; -: 28: 2: 29: if (!im) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 30: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 31: } -: 32: 2: 33: imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize); call 0 returned 100% 2: 34: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 35: return NULL; -: 36: } -: 37: 228: 38: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 56384: 39: for (x = 0; x < im->linesize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 56384: 40: imOut->image[y][x] = ~im->image[y][x]; -: 41: } -: 42: } -: 43: -: 44: return imOut; -: 45:} -: 46: <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#PcxDecode.c.gcov -: 0:Source:src/libImaging/PcxDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/PcxDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/PcxDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for PCX image data. -: 6: * -: 7: * history: -: 8: * 95-09-14 fl Created -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1995. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19:int function ImagingPcxDecode called 45 returned 100% blocks executed 96% 45: 20:ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 21:{ -: 22: UINT8 n; -: 23: UINT8* ptr; -: 24: 45: 25: if ((state->xsize * state->bits + 7) / 8 > state->bytes) { branch 0 taken 93% (fallthrough) branch 1 taken 7% 3: 26: state->errcode = IMAGING_CODEC_OVERRUN; 3: 27: return -1; -: 28: } -: 29: -: 30: ptr = buf; -: 31: -: 32: for (;;) { -: 33: 1084658: 34: if (bytes < 1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 16: 35: return ptr - buf; -: 36: } -: 37: 1084642: 38: if ((*ptr & 0xC0) == 0xC0) { branch 0 taken 39% (fallthrough) branch 1 taken 61% -: 39: -: 40: /* Run */ 421242: 41: if (bytes < 2) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 4: 42: return ptr - buf; -: 43: } -: 44: 421238: 45: n = ptr[0] & 0x3F; -: 46: 2817038: 47: while (n > 0) { branch 0 taken 82% branch 1 taken 18% (fallthrough) 1974562: 48: if (state->x >= state->bytes) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 49: state->errcode = IMAGING_CODEC_OVERRUN; #####: 50: break; -: 51: } 1974562: 52: state->buffer[state->x++] = ptr[1]; 1974562: 53: n--; -: 54: } -: 55: 421238: 56: ptr += 2; bytes -= 2; -: 57: -: 58: } else { -: 59: -: 60: /* Literal */ 663400: 61: state->buffer[state->x++] = ptr[0]; 663400: 62: ptr++; bytes--; -: 63: -: 64: } -: 65: 1084638: 66: if (state->x >= state->bytes) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 4499: 67: if (state->bytes % state->xsize && state->bytes > state->xsize) { branch 0 taken 52% (fallthrough) branch 1 taken 48% branch 2 taken 66% (fallthrough) branch 3 taken 34% 1538: 68: int bands = state->bytes / state->xsize; 1538: 69: int stride = state->bytes / bands; -: 70: int i; 2560: 71: for (i=1; i< bands; i++) { // note -- skipping first band branch 0 taken 40% branch 1 taken 60% (fallthrough) 3066: 72: memmove(&state->buffer[i*state->xsize], 1022: 73: &state->buffer[i*stride], -: 74: state->xsize); -: 75: } -: 76: } -: 77: /* Got a full line, unpack it */ 13497: 78: state->shuffle((UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 8998: 79: state->xoff * im->pixelsize, state->buffer, -: 80: state->xsize); -: 81: 4499: 82: state->x = 0; -: 83: 4499: 84: if (++state->y >= state->ysize) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 85: /* End of file (errcode = 0) */ -: 86: return -1; -: 87: } -: 88: } -: 89: -: 90: } -: 91:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#XbmDecode.c.gcov -: 0:Source:src/libImaging/XbmDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/XbmDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/XbmDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for XBM hex image data -: 6: * -: 7: * history: -: 8: * 96-04-13 fl Created -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1996. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19:#define HEX(v) ((v >= '0' && v <= '9') ? v - '0' :\ -: 20: (v >= 'a' && v <= 'f') ? v - 'a' + 10 :\ -: 21: (v >= 'A' && v <= 'F') ? v - 'A' + 10 : 0) -: 22: -: 23:int function ImagingXbmDecode called 3 returned 100% blocks executed 80% 3: 24:ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 25:{ -: 26: enum { BYTE = 1, SKIP }; -: 27: -: 28: UINT8* ptr; -: 29: 3: 30: if (!state->state) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 3: 31: state->state = SKIP; -: 32: } -: 33: -: 34: ptr = buf; -: 35: -: 36: for (;;) { -: 37: 127176: 38: if (state->state == SKIP) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 39: -: 40: /* Skip forward until next 'x' */ -: 41: 390136: 42: while (bytes > 0) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 390136: 43: if (*ptr == 'x') { branch 0 taken 67% (fallthrough) branch 1 taken 33% -: 44: break; -: 45: } 262960: 46: ptr++; 262960: 47: bytes--; -: 48: } -: 49: 127176: 50: if (bytes == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 51: return ptr - buf; -: 52: } -: 53: 127176: 54: state->state = BYTE; -: 55: -: 56: } -: 57: 127176: 58: if (bytes < 3) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 59: return ptr - buf; -: 60: } -: 61: 127176: 62: state->buffer[state->x] = (HEX(ptr[1])<<4) + HEX(ptr[2]); branch 0 taken 74% (fallthrough) branch 1 taken 26% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 never executed branch 5 never executed branch 6 taken 74% (fallthrough) branch 7 taken 26% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 never executed branch 11 never executed -: 63: 127176: 64: if (++state->x >= state->bytes) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 65: -: 66: /* Got a full line, unpack it */ 1160: 67: state->shuffle((UINT8*) im->image[state->y], state->buffer, call 0 returned 100% -: 68: state->xsize); -: 69: 1160: 70: state->x = 0; -: 71: 1160: 72: if (++state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 73: /* End of file (errcode = 0) */ -: 74: return -1; -: 75: } -: 76: } -: 77: 127173: 78: ptr += 3; 127173: 79: bytes -= 3; -: 80: 127173: 81: state->state = SKIP; -: 82: 127173: 83: } -: 84: -: 85:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#BcnDecode.c.gcov -: 0:Source:src/libImaging/BcnDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/BcnDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/BcnDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * -: 4: * decoder for DXTn-compressed data -: 5: * -: 6: * Format documentation: -: 7: * https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt -: 8: * -: 9: * The contents of this file are in the public domain (CC0) -: 10: * Full text of the CC0 license: -: 11: * https://creativecommons.org/publicdomain/zero/1.0/ -: 12: */ -: 13: -: 14: -: 15:#include "Imaging.h" -: 16: -: 17: -: 18:typedef struct { -: 19: UINT8 r, g, b, a; -: 20:} rgba; -: 21: -: 22:typedef struct { -: 23: UINT8 l; -: 24:} lum; -: 25: -: 26:typedef struct { -: 27: FLOAT32 r, g, b; -: 28:} rgb32f; -: 29: -: 30:typedef struct { -: 31: UINT16 c0, c1; -: 32: UINT32 lut; -: 33:} bc1_color; -: 34: -: 35:typedef struct { -: 36: UINT8 a0, a1; -: 37: UINT8 lut[6]; -: 38:} bc3_alpha; -: 39: -: 40:#define LOAD16(p) \ -: 41: (p)[0] | ((p)[1] << 8) -: 42: -: 43:#define LOAD32(p) \ -: 44: (p)[0] | ((p)[1] << 8) | ((p)[2] << 16) | ((p)[3] << 24) -: 45: -: 46:static void bc1_color_load(bc1_color *dst, const UINT8 *src) { 17401: 47: dst->c0 = LOAD16(src); 17401: 48: dst->c1 = LOAD16(src + 2); 17401: 49: dst->lut = LOAD32(src + 4); -: 50:} -: 51: -: 52:static void bc3_alpha_load(bc3_alpha *dst, const UINT8 *src) { -: 53: memcpy(dst, src, sizeof(bc3_alpha)); -: 54:} -: 55: -: 56:static rgba decode_565(UINT16 x) { -: 57: rgba c; -: 58: int r, g, b; 34802: 59: r = (x & 0xf800) >> 8; 34802: 60: r |= r >> 5; 34802: 61: c.r = r; 34802: 62: g = (x & 0x7e0) >> 3; 34802: 63: g |= g >> 6; 34802: 64: c.g = g; 34802: 65: b = (x & 0x1f) << 3; 34802: 66: b |= b >> 5; 34802: 67: c.b = b; 34802: 68: c.a = 0xff; -: 69: return c; -: 70:} -: 71: function decode_bc1_color called 17401 returned 100% blocks executed 100% 17401: 72:static void decode_bc1_color(rgba *dst, const UINT8 *src) { -: 73: bc1_color col; -: 74: rgba p[4]; -: 75: int n, cw; -: 76: UINT16 r0, g0, b0, r1, g1, b1; 17401: 77: bc1_color_load(&col, src); -: 78: 34802: 79: p[0] = decode_565(col.c0); 17401: 80: r0 = p[0].r; 17401: 81: g0 = p[0].g; 17401: 82: b0 = p[0].b; 34802: 83: p[1] = decode_565(col.c1); 17401: 84: r1 = p[1].r; 17401: 85: g1 = p[1].g; 17401: 86: b1 = p[1].b; 17401: 87: if (col.c0 > col.c1) { branch 0 taken 89% (fallthrough) branch 1 taken 11% 15466: 88: p[2].r = (2*r0 + 1*r1) / 3; 15466: 89: p[2].g = (2*g0 + 1*g1) / 3; 15466: 90: p[2].b = (2*b0 + 1*b1) / 3; 15466: 91: p[2].a = 0xff; 15466: 92: p[3].r = (1*r0 + 2*r1) / 3; 15466: 93: p[3].g = (1*g0 + 2*g1) / 3; 15466: 94: p[3].b = (1*b0 + 2*b1) / 3; 15466: 95: p[3].a = 0xff; -: 96: } else { 1935: 97: p[2].r = (r0 + r1) / 2; 1935: 98: p[2].g = (g0 + g1) / 2; 1935: 99: p[2].b = (b0 + b1) / 2; 1935: 100: p[2].a = 0xff; 1935: 101: p[3].r = 0; 1935: 102: p[3].g = 0; 1935: 103: p[3].b = 0; 1935: 104: p[3].a = 0; -: 105: } 278416: 106: for (n = 0; n < 16; n++) { branch 0 taken 94% branch 1 taken 6% (fallthrough) 278416: 107: cw = 3 & (col.lut >> (2 * n)); 278416: 108: dst[n] = p[cw]; -: 109: } 17401: 110:} -: 111: function decode_bc3_alpha called 8185 returned 100% blocks executed 100% 8185: 112:static void decode_bc3_alpha(char *dst, const UINT8 *src, int stride, int o) { -: 113: bc3_alpha b; -: 114: UINT16 a0, a1; -: 115: UINT8 a[8]; -: 116: int n, lut, aw; 8185: 117: bc3_alpha_load(&b, src); -: 118: 8185: 119: a0 = b.a0; 8185: 120: a1 = b.a1; 8185: 121: a[0] = (UINT8)a0; 8185: 122: a[1] = (UINT8)a1; 8185: 123: if (a0 > a1) { branch 0 taken 87% (fallthrough) branch 1 taken 13% 7087: 124: a[2] = (6*a0 + 1*a1) / 7; 7087: 125: a[3] = (5*a0 + 2*a1) / 7; 7087: 126: a[4] = (4*a0 + 3*a1) / 7; 7087: 127: a[5] = (3*a0 + 4*a1) / 7; 7087: 128: a[6] = (2*a0 + 5*a1) / 7; 7087: 129: a[7] = (1*a0 + 6*a1) / 7; -: 130: } else { 1098: 131: a[2] = (4*a0 + 1*a1) / 5; 1098: 132: a[3] = (3*a0 + 2*a1) / 5; 1098: 133: a[4] = (2*a0 + 3*a1) / 5; 1098: 134: a[5] = (1*a0 + 4*a1) / 5; 1098: 135: a[6] = 0; 1098: 136: a[7] = 0xff; -: 137: } 8185: 138: lut = b.lut[0] | (b.lut[1] << 8) | (b.lut[2] << 16); 73665: 139: for (n = 0; n < 8; n++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 65480: 140: aw = 7 & (lut >> (3 * n)); 65480: 141: dst[stride * n + o] = a[aw]; -: 142: } 8185: 143: lut = b.lut[3] | (b.lut[4] << 8) | (b.lut[5] << 16); 73665: 144: for (n = 0; n < 8; n++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 65480: 145: aw = 7 & (lut >> (3 * n)); 65480: 146: dst[stride * (8+n) + o] = a[aw]; -: 147: } 8185: 148:} -: 149: -: 150:static void decode_bc1_block(rgba *col, const UINT8* src) { 5120: 151: decode_bc1_color(col, src); call 0 returned 100% -: 152:} -: 153: function decode_bc2_block called 4096 returned 100% blocks executed 100% 4096: 154:static void decode_bc2_block(rgba *col, const UINT8* src) { -: 155: int n, bitI, byI, av; 4096: 156: decode_bc1_color(col, src + 8); 69632: 157: for (n = 0; n < 16; n++) { call 0 returned 100% branch 1 taken 94% branch 2 taken 6% (fallthrough) 65536: 158: bitI = n * 4; 65536: 159: byI = bitI >> 3; 65536: 160: av = 0xf & (src[byI] >> (bitI & 7)); 65536: 161: av = (av << 4) | av; 65536: 162: col[n].a = av; -: 163: } 4096: 164:} -: 165: function decode_bc3_block called 8185 returned 100% blocks executed 100% 8185: 166:static void decode_bc3_block(rgba *col, const UINT8* src) { 8185: 167: decode_bc1_color(col, src + 8); call 0 returned 100% 8185: 168: decode_bc3_alpha((char *)col, src, sizeof(col[0]), 3); call 0 returned 100% 8185: 169:} -: 170: -: 171:static void decode_bc4_block(lum *col, const UINT8* src) { #####: 172: decode_bc3_alpha((char *)col, src, sizeof(col[0]), 0); call 0 never executed -: 173:} -: 174: function decode_bc5_block called 0 returned 0% blocks executed 0% #####: 175:static void decode_bc5_block(rgba *col, const UINT8* src) { #####: 176: decode_bc3_alpha((char *)col, src, sizeof(col[0]), 0); call 0 never executed #####: 177: decode_bc3_alpha((char *)col, src + 8, sizeof(col[0]), 1); call 0 never executed #####: 178:} -: 179: -: 180:/* BC6 and BC7 are described here: -: 181: https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_compression_bptc.txt */ -: 182: -: 183:static UINT8 get_bit(const UINT8* src, int bit) { #####: 184: int by = bit >> 3; #####: 185: bit &= 7; #####: 186: return (src[by] >> bit) & 1; -: 187:} -: 188: function get_bits called 134464 returned 100% blocks executed 100% 134464: 189:static UINT8 get_bits(const UINT8* src, int bit, int count) { -: 190: UINT8 v; -: 191: int x; 142900: 192: int by = bit >> 3; 142900: 193: bit &= 7; 134464: 194: if (!count) { branch 0 taken 94% (fallthrough) branch 1 taken 6% -: 195: return 0; -: 196: } 134353: 197: if (bit + count <= 8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 69% (fallthrough) branch 5 taken 31% 95205: 198: v = (src[by] >> bit) & ((1 << count) - 1); -: 199: } else { 39148: 200: x = src[by] | (src[by+1] << 8); 39148: 201: v = (x >> bit) & ((1 << count) - 1); -: 202: } -: 203: return v; -: 204:} -: 205: -: 206:/* BC7 */ -: 207:typedef struct { -: 208: char ns; -: 209: char pb; -: 210: char rb; -: 211: char isb; -: 212: char cb; -: 213: char ab; -: 214: char epb; -: 215: char spb; -: 216: char ib; -: 217: char ib2; -: 218:} bc7_mode_info; -: 219: -: 220:static const bc7_mode_info bc7_modes[] = { -: 221: {3, 4, 0, 0, 4, 0, 1, 0, 3, 0}, -: 222: {2, 6, 0, 0, 6, 0, 0, 1, 3, 0}, -: 223: {3, 6, 0, 0, 5, 0, 0, 0, 2, 0}, -: 224: {2, 6, 0, 0, 7, 0, 1, 0, 2, 0}, -: 225: {1, 0, 2, 1, 5, 6, 0, 0, 2, 3}, -: 226: {1, 0, 2, 0, 7, 8, 0, 0, 2, 2}, -: 227: {1, 0, 0, 0, 7, 7, 1, 0, 4, 0}, -: 228: {2, 6, 0, 0, 5, 5, 1, 0, 2, 0} -: 229:}; -: 230: -: 231:/* Subset indices: -: 232: Table.P2, 1 bit per index */ -: 233:static const UINT16 bc7_si2[] = { -: 234: 0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, -: 235: 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000, -: 236: 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce, -: 237: 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c, -: 238: 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, -: 239: 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660, -: 240: 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, -: 241: 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22}; -: 242: -: 243:/* Table.P3, 2 bits per index */ -: 244:static const UINT32 bc7_si3[] = { -: 245: 0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, -: 246: 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050, -: 247: 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, -: 248: 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250, -: 249: 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, -: 250: 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500, -: 251: 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, -: 252: 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200, -: 253: 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, -: 254: 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, -: 255: 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, -: 256: 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600, -: 257: 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, -: 258: 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, -: 259: 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, -: 260: 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254}; -: 261: -: 262:/* Anchor indices: -: 263: Table.A2 */ -: 264:static const char bc7_ai0[] = { -: 265: 15,15,15,15,15,15,15,15, -: 266: 15,15,15,15,15,15,15,15, -: 267: 15, 2, 8, 2, 2, 8, 8,15, -: 268: 2, 8, 2, 2, 8, 8, 2, 2, -: 269: 15,15, 6, 8, 2, 8,15,15, -: 270: 2, 8, 2, 2, 2,15,15, 6, -: 271: 6, 2, 6, 8,15,15, 2, 2, -: 272: 15,15,15,15,15, 2, 2,15}; -: 273: -: 274:/* Table.A3a */ -: 275:static const char bc7_ai1[] = { -: 276: 3, 3,15,15, 8, 3,15,15, -: 277: 8, 8, 6, 6, 6, 5, 3, 3, -: 278: 3, 3, 8,15, 3, 3, 6,10, -: 279: 5, 8, 8, 6, 8, 5,15,15, -: 280: 8,15, 3, 5, 6,10, 8,15, -: 281: 15, 3,15, 5,15,15,15,15, -: 282: 3,15, 5, 5, 5, 8, 5,10, -: 283: 5,10, 8,13,15,12, 3, 3}; -: 284: -: 285:/* Table.A3b */ -: 286:static const char bc7_ai2[] = { -: 287: 15, 8, 8, 3,15,15, 3, 8, -: 288: 15,15,15,15,15,15,15, 8, -: 289: 15, 8,15, 3,15, 8,15, 8, -: 290: 3,15, 6,10,15,15,10, 8, -: 291: 15, 3,15,10,10, 8, 9,10, -: 292: 6,15, 8,15, 3, 6, 6, 8, -: 293: 15, 3,15,15,15,15,15,15, -: 294: 15,15,15,15, 3,15,15, 8}; -: 295: -: 296:/* Interpolation weights */ -: 297:static const char bc7_weights2[] = {0, 21, 43, 64}; -: 298:static const char bc7_weights3[] = {0, 9, 18, 27, 37, 46, 55, 64}; -: 299:static const char bc7_weights4[] = { -: 300: 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64}; -: 301: -: 302:static const char *bc7_get_weights(int n) { 8224: 303: if (n == 2) { branch 0 never executed branch 1 never executed branch 2 taken 72% (fallthrough) branch 3 taken 28% branch 4 taken 87% (fallthrough) branch 5 taken 13% -: 304: return bc7_weights2; -: 305: } 6562: 306: if (n == 3) { branch 0 never executed branch 1 never executed branch 2 taken 32% (fallthrough) branch 3 taken 68% branch 4 taken 26% (fallthrough) branch 5 taken 74% -: 307: return bc7_weights3; -: 308: } -: 309: return bc7_weights4; -: 310:} -: 311: -: 312:static int bc7_get_subset(int ns, int partition, int n) { 65792: 313: if (ns == 2) { branch 0 never executed branch 1 never executed branch 2 taken 52% (fallthrough) branch 3 taken 48% 34528: 314: return 1 & (bc7_si2[partition] >> n); -: 315: } 31264: 316: if (ns == 3) { branch 0 never executed branch 1 never executed branch 2 taken 13% (fallthrough) branch 3 taken 87% 3968: 317: return 3 & (bc7_si3[partition] >> (2 * n)); -: 318: } -: 319: return 0; -: 320:} -: 321: -: 322:static UINT8 expand_quantized(UINT8 v, int bits) { 44096: 323: v = v << (8 - bits); 44096: 324: return v | (v >> bits); -: 325:} -: 326: function bc7_lerp called 65792 returned 100% blocks executed 100% 65792: 327:static void bc7_lerp(rgba *dst, const rgba *e, int s0, int s1) { 65792: 328: int t0 = 64 - s0; 65792: 329: int t1 = 64 - s1; 65792: 330: dst->r = (UINT8)((t0 * e[0].r + s0 * e[1].r + 32) >> 6); 65792: 331: dst->g = (UINT8)((t0 * e[0].g + s0 * e[1].g + 32) >> 6); 65792: 332: dst->b = (UINT8)((t0 * e[0].b + s0 * e[1].b + 32) >> 6); 65792: 333: dst->a = (UINT8)((t1 * e[0].a + s1 * e[1].a + 32) >> 6); 65792: 334:} -: 335: function decode_bc7_block called 4112 returned 100% blocks executed 92% 4112: 336:static void decode_bc7_block(rgba *col, const UINT8* src) { -: 337: rgba endpoints[6]; 4112: 338: int bit = 0, cibit, aibit; 4112: 339: int mode = src[0]; -: 340: int i, j; -: 341: int numep, cb, ab, ib, ib2, i0, i1, s; -: 342: UINT8 index_sel, partition, rotation, val; -: 343: const char *cw, *aw; -: 344: const bc7_mode_info *info; -: 345: -: 346: /* mode is the number of unset bits before the first set bit: */ 4112: 347: if (!mode) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 348: /* degenerate case when no bits set */ #####: 349: for (i = 0; i < 16; i++) { branch 0 never executed branch 1 never executed #####: 350: col[i].r = col[i].g = col[i].b = 0; #####: 351: col[i].a = 255; -: 352: } #####: 353: return; -: 354: } 15961: 355: while (!(mode & (1 << bit++))) ; branch 0 taken 74% branch 1 taken 26% (fallthrough) 4112: 356: mode = bit - 1; 4112: 357: info = &bc7_modes[mode]; -: 358: /* color selection bits: {subset}{endpoint} */ 4112: 359: cb = info->cb; 4112: 360: ab = info->ab; 8224: 361: cw = bc7_get_weights(info->ib); 8224: 362: aw = bc7_get_weights((ab && info->ib2) ? info->ib2 : info->ib); branch 0 taken 42% (fallthrough) branch 1 taken 58% branch 2 taken 44% (fallthrough) branch 3 taken 56% -: 363: -: 364:#define LOAD(DST, N) \ -: 365: DST = get_bits(src, bit, N); \ -: 366: bit += N; 4112: 367: LOAD(partition, info->pb); call 0 returned 100% 4112: 368: LOAD(rotation, info->rb); call 0 returned 100% 4112: 369: LOAD(index_sel, info->isb); call 0 returned 100% 4112: 370: numep = info->ns << 1; -: 371: -: 372: /* red */ 17644: 373: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 13532: 374: LOAD(val, cb); call 0 returned 100% 13532: 375: endpoints[i].r = val; -: 376: } -: 377: -: 378: /* green */ 13532: 379: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 13532: 380: LOAD(val, cb); call 0 returned 100% 13532: 381: endpoints[i].g = val; -: 382: } -: 383: -: 384: /* blue */ 13532: 385: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 13532: 386: LOAD(val, cb); call 0 returned 100% 13532: 387: endpoints[i].b = val; -: 388: } -: 389: -: 390: /* alpha */ 13532: 391: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 13532: 392: if (ab) { branch 0 taken 26% (fallthrough) branch 1 taken 74% 3500: 393: LOAD(val, ab); call 0 returned 100% -: 394: } else { -: 395: val = 255; -: 396: } 13532: 397: endpoints[i].a = val; -: 398: } -: 399: -: 400: /* p-bits */ -: 401:#define ASSIGN_P(x) x = (x << 1) | val 4112: 402: if (info->epb) { branch 0 taken 38% (fallthrough) branch 1 taken 62% -: 403: /* per endpoint */ 1564: 404: cb++; 1564: 405: if (ab) { branch 0 taken 62% (fallthrough) branch 1 taken 38% 963: 406: ab++; -: 407: } 6434: 408: for (i = 0; i < numep; i++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 4870: 409: LOAD(val, 1); 4870: 410: ASSIGN_P(endpoints[i].r); 4870: 411: ASSIGN_P(endpoints[i].g); 4870: 412: ASSIGN_P(endpoints[i].b); 4870: 413: if (ab) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 1970: 414: ASSIGN_P(endpoints[i].a); -: 415: } -: 416: } -: 417: } 4112: 418: if (info->spb) { branch 0 taken 43% (fallthrough) branch 1 taken 57% -: 419: /* per subset */ 1783: 420: cb++; 1783: 421: if (ab) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 422: ab++; -: 423: } 5349: 424: for (i = 0; i < numep; i+=2) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 3566: 425: LOAD(val, 1); 10698: 426: for (j = 0; j < 2; j++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 7132: 427: ASSIGN_P(endpoints[i+j].r); 7132: 428: ASSIGN_P(endpoints[i+j].g); 7132: 429: ASSIGN_P(endpoints[i+j].b); 7132: 430: if (ab) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 431: ASSIGN_P(endpoints[i+j].a); -: 432: } -: 433: } -: 434: } -: 435: } -: 436:#undef ASSIGN_P -: 437:#define EXPAND(x, b) x = expand_quantized(x, b) 17644: 438: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 27064: 439: EXPAND(endpoints[i].r, cb); 27064: 440: EXPAND(endpoints[i].g, cb); 27064: 441: EXPAND(endpoints[i].b, cb); 13532: 442: if (ab) { branch 0 taken 26% (fallthrough) branch 1 taken 74% 7000: 443: EXPAND(endpoints[i].a, ab); -: 444: } -: 445: } -: 446:#undef EXPAND -: 447:#undef LOAD 4112: 448: cibit = bit; 4112: 449: aibit = cibit + 16 * info->ib - info->ns; 69904: 450: for (i = 0; i < 16; i++) { branch 0 taken 94% branch 1 taken 6% (fallthrough) 131584: 451: s = bc7_get_subset(info->ns, partition, i) << 1; 65792: 452: ib = info->ib; 65792: 453: if (i == 0) { branch 0 taken 6% (fallthrough) branch 1 taken 94% 4112: 454: ib--; 61680: 455: } else if (info->ns == 2) { branch 0 taken 52% (fallthrough) branch 1 taken 48% 32370: 456: if (i == bc7_ai0[partition]) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 2158: 457: ib--; -: 458: } 29310: 459: } else if (info->ns == 3) { branch 0 taken 13% (fallthrough) branch 1 taken 87% 3720: 460: if (i == bc7_ai1[partition]) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 248: 461: ib--; 3472: 462: } else if (i == bc7_ai2[partition]) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 248: 463: ib--; -: 464: } -: 465: } 65792: 466: i0 = get_bits(src, cibit, ib); call 0 returned 100% 65792: 467: cibit += ib; -: 468: 65792: 469: if (ab && info->ib2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% branch 2 taken 44% (fallthrough) branch 3 taken 56% 12240: 470: ib2 = info->ib2; 12240: 471: if (ib2 && i == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 6% (fallthrough) branch 3 taken 94% 765: 472: ib2--; -: 473: } 12240: 474: i1 = get_bits(src, aibit, ib2); call 0 returned 100% 12240: 475: aibit += ib2; 12240: 476: if (index_sel) { branch 0 taken 11% (fallthrough) branch 1 taken 89% 1360: 477: bc7_lerp(&col[i], &endpoints[s], aw[i1], cw[i0]); call 0 returned 100% -: 478: } else { 10880: 479: bc7_lerp(&col[i], &endpoints[s], cw[i0], aw[i1]); call 0 returned 100% -: 480: } -: 481: } else { 53552: 482: bc7_lerp(&col[i], &endpoints[s], cw[i0], cw[i0]); call 0 returned 100% -: 483: } -: 484:#define ROTATE(x, y) \ -: 485: val = x; \ -: 486: x = y; \ -: 487: y = val 65792: 488: if (rotation == 1) { branch 0 taken 14% (fallthrough) branch 1 taken 86% 9120: 489: ROTATE(col[i].r, col[i].a); 56672: 490: } else if (rotation == 2) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 912: 491: ROTATE(col[i].g, col[i].a); 55760: 492: } else if (rotation == 3) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 672: 493: ROTATE(col[i].b, col[i].a); -: 494: } -: 495:#undef ROTATE -: 496: } -: 497:} -: 498: -: 499:/* BC6 */ -: 500:typedef struct { -: 501: char ns; /* number of subsets (also called regions) */ -: 502: char tr; /* whether endpoints are delta-compressed */ -: 503: char pb; /* partition bits */ -: 504: char epb; /* endpoint bits */ -: 505: char rb; /* red bits (delta) */ -: 506: char gb; /* green bits (delta) */ -: 507: char bb; /* blue bits (delta) */ -: 508:} bc6_mode_info; -: 509: -: 510:static const bc6_mode_info bc6_modes[] = { -: 511: // 00 -: 512: {2, 1, 5, 10, 5, 5, 5}, -: 513: // 01 -: 514: {2, 1, 5, 7, 6, 6, 6}, -: 515: // 10 -: 516: {2, 1, 5, 11, 5, 4, 4}, -: 517: {2, 1, 5, 11, 4, 5, 4}, -: 518: {2, 1, 5, 11, 4, 4, 5}, -: 519: {2, 1, 5, 9, 5, 5, 5}, -: 520: {2, 1, 5, 8, 6, 5, 5}, -: 521: {2, 1, 5, 8, 5, 6, 5}, -: 522: {2, 1, 5, 8, 5, 5, 6}, -: 523: {2, 0, 5, 6, 6, 6, 6}, -: 524: // 11 -: 525: {1, 0, 0, 10, 10, 10, 10}, -: 526: {1, 1, 0, 11, 9, 9, 9}, -: 527: {1, 1, 0, 12, 8, 8, 8}, -: 528: {1, 1, 0, 16, 4, 4, 4} -: 529:}; -: 530: -: 531:/* Table.F, encoded as a sequence of bit indices */ -: 532:static const UINT8 bc6_bit_packings[][75] = { -: 533: {116, 132, 176, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, -: 534: 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, -: 535: 164, 112, 113, 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, -: 536: 81, 82, 83, 84, 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, -: 537: 145, 146, 147, 148, 175}, -: 538: {117, 164, 165, 0, 1, 2, 3, 4, 5, 6, 172, 173, 132, 16, 17, 18, 19, 20, 21, -: 539: 22, 133, 174, 116, 32, 33, 34, 35, 36, 37, 38, 175, 177, 176, 48, 49, 50, -: 540: 51, 52, 53, 112, 113, 114, 115, 64, 65, 66, 67, 68, 69, 160, 161, 162, 163, -: 541: 80, 81, 82, 83, 84, 85, 128, 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, -: 542: 145, 146, 147, 148, 149}, -: 543: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 544: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 10, 112, 113, 114, -: 545: 115, 64, 65, 66, 67, 26, 172, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, -: 546: 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, -: 547: 175}, -: 548: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 549: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 10, 164, 112, 113, 114, -: 550: 115, 64, 65, 66, 67, 68, 26, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, -: 551: 128, 129, 130, 131, 96, 97, 98, 99, 172, 174, 144, 145, 146, 147, 116, -: 552: 175}, -: 553: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 554: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 10, 132, 112, 113, 114, -: 555: 115, 64, 65, 66, 67, 26, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 42, -: 556: 128, 129, 130, 131, 96, 97, 98, 99, 173, 174, 144, 145, 146, 147, 176, -: 557: 175}, -: 558: {0, 1, 2, 3, 4, 5, 6, 7, 8, 132, 16, 17, 18, 19, 20, 21, 22, 23, 24, 116, -: 559: 32, 33, 34, 35, 36, 37, 38, 39, 40, 176, 48, 49, 50, 51, 52, 164, 112, 113, -: 560: 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, -: 561: 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, -: 562: 175}, -: 563: {0, 1, 2, 3, 4, 5, 6, 7, 164, 132, 16, 17, 18, 19, 20, 21, 22, 23, 174, 116, -: 564: 32, 33, 34, 35, 36, 37, 38, 39, 175, 176, 48, 49, 50, 51, 52, 53, 112, 113, -: 565: 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, -: 566: 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, -: 567: 149}, -: 568: {0, 1, 2, 3, 4, 5, 6, 7, 172, 132, 16, 17, 18, 19, 20, 21, 22, 23, 117, 116, -: 569: 32, 33, 34, 35, 36, 37, 38, 39, 165, 176, 48, 49, 50, 51, 52, 164, 112, -: 570: 113, 114, 115, 64, 65, 66, 67, 68, 69, 160, 161, 162, 163, 80, 81, 82, 83, -: 571: 84, 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, -: 572: 148, 175}, -: 573: {0, 1, 2, 3, 4, 5, 6, 7, 173, 132, 16, 17, 18, 19, 20, 21, 22, 23, 133, 116, -: 574: 32, 33, 34, 35, 36, 37, 38, 39, 177, 176, 48, 49, 50, 51, 52, 164, 112, -: 575: 113, 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, -: 576: 84, 85, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, -: 577: 148, 175}, -: 578: {0, 1, 2, 3, 4, 5, 164, 172, 173, 132, 16, 17, 18, 19, 20, 21, 117, 133, -: 579: 174, 116, 32, 33, 34, 35, 36, 37, 165, 175, 177, 176, 48, 49, 50, 51, 52, -: 580: 53, 112, 113, 114, 115, 64, 65, 66, 67, 68, 69, 160, 161, 162, 163, 80, 81, -: 581: 82, 83, 84, 85, 128, 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, 145, -: 582: 146, 147, 148, 149}, -: 583: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 584: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -: 585: 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 80, 81, 82, 83, 84, 85, 86, 87, 88, -: 586: 89}, -: 587: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 588: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 10, -: 589: 64, 65, 66, 67, 68, 69, 70, 71, 72, 26, 80, 81, 82, 83, 84, 85, 86, 87, 88, -: 590: 42}, -: 591: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 592: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 11, 10, -: 593: 64, 65, 66, 67, 68, 69, 70, 71, 27, 26, 80, 81, 82, 83, 84, 85, 86, 87, 43, -: 594: 42}, -: 595: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 596: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 15, 14, 13, 12, 11, 10, -: 597: 64, 65, 66, 67, 31, 30, 29, 28, 27, 26, 80, 81, 82, 83, 47, 46, 45, 44, 43, -: 598: 42}}; -: 599: -: 600:static void bc6_sign_extend(UINT16 *v, int prec) { #####: 601: int x = *v; #####: 602: if (x & (1 << (prec - 1))) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed #####: 603: x |= -1 << prec; -: 604: } #####: 605: *v = (UINT16)x; -: 606:} -: 607: function bc6_unquantize called 0 returned 0% blocks executed 0% #####: 608:static int bc6_unquantize(UINT16 v, int prec, int sign) { #####: 609: int s = 0; -: 610: int x; #####: 611: if (!sign) { branch 0 never executed branch 1 never executed #####: 612: x = v; #####: 613: if (prec >= 15) { branch 0 never executed branch 1 never executed -: 614: return x; -: 615: } #####: 616: if (x == 0) { branch 0 never executed branch 1 never executed -: 617: return 0; -: 618: } #####: 619: if (x == ((1 << prec) - 1)) { branch 0 never executed branch 1 never executed -: 620: return 0xffff; -: 621: } #####: 622: return ((x << 15) + 0x4000) >> (prec - 1); -: 623: } else { #####: 624: x = (INT16)v; #####: 625: if (prec >= 16) { branch 0 never executed branch 1 never executed -: 626: return x; -: 627: } #####: 628: if (x < 0) { branch 0 never executed branch 1 never executed #####: 629: s = 1; #####: 630: x = -x; -: 631: } -: 632: #####: 633: if (x != 0) { branch 0 never executed branch 1 never executed #####: 634: if (x >= ((1 << (prec - 1)) - 1)) { branch 0 never executed branch 1 never executed -: 635: x = 0x7fff; -: 636: } else { #####: 637: x = ((x << 15) + 0x4000) >> (prec - 1); -: 638: } -: 639: } -: 640: #####: 641: if (s) { branch 0 never executed branch 1 never executed #####: 642: return -x; -: 643: } -: 644: return x; -: 645: } -: 646:} -: 647: -: 648:static float half_to_float(UINT16 h) { -: 649: /* https://gist.github.com/rygorous/2144712 */ -: 650: union { -: 651: UINT32 u; -: 652: float f; -: 653: } o, m; #####: 654: m.u = 0x77800000; #####: 655: o.u = (h & 0x7fff) << 13; #####: 656: o.f *= m.f; #####: 657: m.u = 0x47800000; #####: 658: if (o.f >= m.f) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed #####: 659: o.u |= 255 << 23; -: 660: } #####: 661: o.u |= (h & 0x8000) << 16; #####: 662: return o.f; -: 663:} -: 664: function bc6_finalize called 0 returned 0% blocks executed 0% #####: 665:static float bc6_finalize(int v, int sign) { #####: 666: if (sign) { branch 0 never executed branch 1 never executed #####: 667: if (v < 0) { branch 0 never executed branch 1 never executed #####: 668: v = ((-v) * 31) / 32; #####: 669: return half_to_float((UINT16)(0x8000 | v)); -: 670: } else { #####: 671: return half_to_float((UINT16)((v * 31) / 32)); -: 672: } -: 673: } else { #####: 674: return half_to_float((UINT16)((v * 31) / 64)); -: 675: } -: 676:} -: 677: function bc6_lerp called 0 returned 0% blocks executed 0% #####: 678:static void bc6_lerp(rgb32f *col, int *e0, int *e1, int s, int sign) { -: 679: int r, g, b; #####: 680: int t = 64 - s; #####: 681: r = (e0[0] * t + e1[0] * s) >> 6; #####: 682: g = (e0[1] * t + e1[1] * s) >> 6; #####: 683: b = (e0[2] * t + e1[2] * s) >> 6; #####: 684: col->r = bc6_finalize(r, sign); call 0 never executed #####: 685: col->g = bc6_finalize(g, sign); call 0 never executed #####: 686: col->b = bc6_finalize(b, sign); call 0 never executed #####: 687:} -: 688: function decode_bc6_block called 0 returned 0% blocks executed 0% #####: 689:static void decode_bc6_block(rgb32f *col, const UINT8* src, int sign) { -: 690: UINT16 endpoints[12]; /* storage for r0, g0, b0, r1, ... */ -: 691: int ueps[12]; -: 692: int i, i0, ib2, di, dw, mask, numep, s; -: 693: UINT8 partition; -: 694: const bc6_mode_info *info; -: 695: const char *cw; #####: 696: int bit = 5; #####: 697: int epbits = 75; #####: 698: int ib = 3; #####: 699: int mode = src[0] & 0x1f; #####: 700: if ((mode & 3) == 0 || (mode & 3) == 1) { branch 0 never executed branch 1 never executed #####: 701: mode &= 3; #####: 702: bit = 2; #####: 703: } else if ((mode & 3) == 2) { branch 0 never executed branch 1 never executed #####: 704: mode = 2 + (mode >> 2); #####: 705: epbits = 72; -: 706: } else { #####: 707: mode = 10 + (mode >> 2); #####: 708: epbits = 60; #####: 709: ib = 4; -: 710: } #####: 711: if (mode >= 14) { branch 0 never executed branch 1 never executed -: 712: /* invalid block */ #####: 713: memset(col, 0, 16 * sizeof(col[0])); #####: 714: return; -: 715: } #####: 716: info = &bc6_modes[mode]; #####: 717: cw = bc7_get_weights(ib); #####: 718: numep = info->ns == 2 ? 12 : 6; branch 0 never executed branch 1 never executed #####: 719: for (i = 0; i < 12; i++) { branch 0 never executed branch 1 never executed #####: 720: endpoints[i] = 0; -: 721: } #####: 722: for (i = 0; i < epbits; i++) { branch 0 never executed branch 1 never executed #####: 723: di = bc6_bit_packings[mode][i]; #####: 724: dw = di >> 4; #####: 725: di &= 15; #####: 726: endpoints[dw] |= (UINT16)get_bit(src, bit + i) << di; -: 727: } #####: 728: bit += epbits; #####: 729: partition = get_bits(src, bit, info->pb); call 0 never executed #####: 730: bit += info->pb; #####: 731: mask = (1 << info->epb) - 1; #####: 732: if (sign) { /* sign-extend e0 if signed */ branch 0 never executed branch 1 never executed #####: 733: bc6_sign_extend(&endpoints[0], info->epb); #####: 734: bc6_sign_extend(&endpoints[1], info->epb); #####: 735: bc6_sign_extend(&endpoints[2], info->epb); -: 736: } #####: 737: if (sign || info->tr) { /* sign-extend e1,2,3 if signed or deltas */ branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 738: for (i = 3; i < numep; i += 3) { branch 0 never executed branch 1 never executed #####: 739: bc6_sign_extend(&endpoints[i+0], info->rb); #####: 740: bc6_sign_extend(&endpoints[i+1], info->gb); #####: 741: bc6_sign_extend(&endpoints[i+2], info->bb); -: 742: } -: 743: } #####: 744: if (info->tr) { /* apply deltas */ branch 0 never executed branch 1 never executed #####: 745: for (i = 3; i < numep; i++) { branch 0 never executed branch 1 never executed #####: 746: endpoints[i] = (endpoints[i] + endpoints[0]) & mask; -: 747: } #####: 748: if (sign) { branch 0 never executed branch 1 never executed #####: 749: for (i = 3; i < numep; i += 3) { branch 0 never executed branch 1 never executed #####: 750: bc6_sign_extend(&endpoints[i+0], info->rb); #####: 751: bc6_sign_extend(&endpoints[i+1], info->gb); #####: 752: bc6_sign_extend(&endpoints[i+2], info->bb); -: 753: } -: 754: } -: 755: } #####: 756: for (i = 0; i < numep; i++) { branch 0 never executed branch 1 never executed #####: 757: ueps[i] = bc6_unquantize(endpoints[i], info->epb, sign); call 0 never executed -: 758: } #####: 759: for (i = 0; i < 16; i++) { branch 0 never executed branch 1 never executed #####: 760: s = bc7_get_subset(info->ns, partition, i) * 6; #####: 761: ib2 = ib; #####: 762: if (i == 0) { branch 0 never executed branch 1 never executed #####: 763: ib2--; #####: 764: } else if (info->ns == 2) { branch 0 never executed branch 1 never executed #####: 765: if (i == bc7_ai0[partition]) { branch 0 never executed branch 1 never executed #####: 766: ib2--; -: 767: } -: 768: } #####: 769: i0 = get_bits(src, bit, ib2); call 0 never executed #####: 770: bit += ib2; -: 771: #####: 772: bc6_lerp(&col[i], &ueps[s], &ueps[s+3], cw[i0], sign); call 0 never executed -: 773: } -: 774:} -: 775: function put_block.isra.0 called 21513 returned 100% blocks executed 45% 21513: 776:static void put_block(Imaging im, ImagingCodecState state, const char *col, int sz, int C) { 21513: 777: int width = state->xsize; 21513: 778: int height = state->ysize; 21513: 779: int xmax = width + state->xoff; 21513: 780: int ymax = height + state->yoff; -: 781: int j, i, y, x; -: 782: char *dst; 107565: 783: for (j = 0; j < 4; j++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 86052: 784: y = state->y + j; 86052: 785: if (C) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 786: if (y >= height) { branch 0 never executed branch 1 never executed #####: 787: continue; -: 788: } #####: 789: if (state->ystep < 0) { branch 0 never executed branch 1 never executed #####: 790: y = state->yoff + ymax - y - 1; -: 791: } #####: 792: dst = im->image[y]; #####: 793: for (i = 0; i < 4; i++) { branch 0 never executed branch 1 never executed #####: 794: x = state->x + i; #####: 795: if (x >= width) { branch 0 never executed branch 1 never executed #####: 796: continue; -: 797: } #####: 798: memcpy(dst + sz*x, col + sz*(j*4 + i), sz); -: 799: } -: 800: } else { 86052: 801: if (state->ystep < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 802: y = state->yoff + ymax - y - 1; -: 803: } 86052: 804: x = state->x; 86052: 805: dst = im->image[y] + sz*x; 86052: 806: memcpy(dst, col + sz*(j*4), 4 * sz); -: 807: } -: 808: } 21513: 809: state->x += 4; 21513: 810: if (state->x >= xmax) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 355: 811: state->y += 4; 355: 812: state->x = state->xoff; -: 813: } 21513: 814:} -: 815: function decode_bcn called 7 returned 100% blocks executed 60% 7: 816:static int decode_bcn(Imaging im, ImagingCodecState state, const UINT8* src, int bytes, int N, int C) { 7: 817: int ymax = state->ysize + state->yoff; 7: 818: const UINT8 *ptr = src; 7: 819: switch (N) { branch 0 taken 29% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% branch 4 taken 29% branch 5 taken 14% branch 6 taken 29% branch 7 taken 0% -: 820:#define DECODE_LOOP(NN, SZ, TY, ...) \ -: 821: case NN: \ -: 822: while (bytes >= SZ) { \ -: 823: TY col[16]; \ -: 824: memset(col, 0, 16 * sizeof(col[0])); \ -: 825: decode_bc##NN##_block(col, ptr); \ -: 826: put_block(im, state, (const char *)col, sizeof(col[0]), C); \ -: 827: ptr += SZ; \ -: 828: bytes -= SZ; \ -: 829: if (state->y >= ymax) {\ -: 830: return -1; \ -: 831: }\ -: 832: } \ -: 833: break -: 834: 10240: 835: DECODE_LOOP(1, 8, rgba); call 0 returned 100% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 100% branch 4 taken 0% 4096: 836: DECODE_LOOP(2, 16, rgba); call 0 returned 100% call 1 returned 100% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 100% branch 5 taken 0% 8185: 837: DECODE_LOOP(3, 16, rgba); call 0 returned 100% call 1 returned 100% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 99% branch 5 taken 1% #####: 838: DECODE_LOOP(4, 8, lum); call 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed #####: 839: DECODE_LOOP(5, 16, rgba); call 0 never executed call 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed -: 840: case 6: #####: 841: while (bytes >= 16) { branch 0 never executed branch 1 never executed -: 842: rgb32f col[16]; #####: 843: decode_bc6_block(col, ptr, (state->state >> 4) & 1); call 0 never executed #####: 844: put_block(im, state, (const char *)col, sizeof(col[0]), C); call 0 never executed #####: 845: ptr += 16; #####: 846: bytes -= 16; #####: 847: if (state->y >= ymax) {\ branch 0 never executed branch 1 never executed #####: 848: return -1; \ -: 849: }\ -: 850: } -: 851: break; 4112: 852: DECODE_LOOP(7, 16, rgba); call 0 returned 100% call 1 returned 100% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 100% branch 5 taken 0% (fallthrough) -: 853:#undef DECODE_LOOP -: 854: } 1: 855: return (int)(ptr - src); -: 856:} -: 857: function ImagingBcnDecode called 7 returned 100% blocks executed 75% 7: 858:int ImagingBcnDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) { 7: 859: int N = state->state & 0xf; 7: 860: int width = state->xsize; 7: 861: int height = state->ysize; 7: 862: if ((width & 3) | (height & 3)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 863: return decode_bcn(im, state, buf, bytes, N, 1); call 0 never executed -: 864: } else { 7: 865: return decode_bcn(im, state, buf, bytes, N, 0); call 0 returned 100% -: 866: } -: 867:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/#usr#include#powerpc64le-linux-gnu#bits#mathcalls.h.gcov -: 0:Source:/usr/include/powerpc64le-linux-gnu/bits/mathcalls.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Convert.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Convert.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* Prototype declarations for math functions; helper file for . -: 2: Copyright (C) 1996-2016 Free Software Foundation, Inc. -: 3: This file is part of the GNU C Library. -: 4: -: 5: The GNU C Library is free software; you can redistribute it and/or -: 6: modify it under the terms of the GNU Lesser General Public -: 7: License as published by the Free Software Foundation; either -: 8: version 2.1 of the License, or (at your option) any later version. -: 9: -: 10: The GNU C Library is distributed in the hope that it will be useful, -: 11: but WITHOUT ANY WARRANTY; without even the implied warranty of -: 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -: 13: Lesser General Public License for more details. -: 14: -: 15: You should have received a copy of the GNU Lesser General Public -: 16: License along with the GNU C Library; if not, see -: 17: . */ -: 18: -: 19:/* NOTE: Because of the special way this file is used by , this -: 20: file must NOT be protected from multiple inclusion as header files -: 21: usually are. -: 22: -: 23: This file provides prototype declarations for the math functions. -: 24: Most functions are declared using the macro: -: 25: -: 26: __MATHCALL (NAME,[_r], (ARGS...)); -: 27: -: 28: This means there is a function `NAME' returning `double' and a function -: 29: `NAMEf' returning `float'. Each place `_Mdouble_' appears in the -: 30: prototype, that is actually `double' in the prototype for `NAME' and -: 31: `float' in the prototype for `NAMEf'. Reentrant variant functions are -: 32: called `NAME_r' and `NAMEf_r'. -: 33: -: 34: Functions returning other types like `int' are declared using the macro: -: 35: -: 36: __MATHDECL (TYPE, NAME,[_r], (ARGS...)); -: 37: -: 38: This is just like __MATHCALL but for a function returning `TYPE' -: 39: instead of `_Mdouble_'. In all of these cases, there is still -: 40: both a `NAME' and a `NAMEf' that takes `float' arguments. -: 41: -: 42: Note that there must be no whitespace before the argument passed for -: 43: NAME, to make token pasting work with -traditional. */ -: 44: -: 45:#ifndef _MATH_H -: 46:# error "Never include directly; include instead." -: 47:#endif -: 48: -: 49: -: 50:/* Trigonometric functions. */ -: 51: -: 52:_Mdouble_BEGIN_NAMESPACE -: 53:/* Arc cosine of X. */ -: 54:__MATHCALL (acos,, (_Mdouble_ __x)); -: 55:/* Arc sine of X. */ -: 56:__MATHCALL (asin,, (_Mdouble_ __x)); -: 57:/* Arc tangent of X. */ -: 58:__MATHCALL (atan,, (_Mdouble_ __x)); -: 59:/* Arc tangent of Y/X. */ -: 60:__MATHCALL (atan2,, (_Mdouble_ __y, _Mdouble_ __x)); -: 61: -: 62:/* Cosine of X. */ -: 63:__MATHCALL_VEC (cos,, (_Mdouble_ __x)); -: 64:/* Sine of X. */ -: 65:__MATHCALL_VEC (sin,, (_Mdouble_ __x)); -: 66:/* Tangent of X. */ -: 67:__MATHCALL (tan,, (_Mdouble_ __x)); -: 68: -: 69:/* Hyperbolic functions. */ -: 70: -: 71:/* Hyperbolic cosine of X. */ -: 72:__MATHCALL (cosh,, (_Mdouble_ __x)); -: 73:/* Hyperbolic sine of X. */ -: 74:__MATHCALL (sinh,, (_Mdouble_ __x)); -: 75:/* Hyperbolic tangent of X. */ -: 76:__MATHCALL (tanh,, (_Mdouble_ __x)); -: 77:_Mdouble_END_NAMESPACE -: 78: -: 79:#ifdef __USE_GNU -: 80:/* Cosine and sine of X. */ -: 81:__MATHDECL_VEC (void,sincos,, -: 82: (_Mdouble_ __x, _Mdouble_ *__sinx, _Mdouble_ *__cosx)); -: 83:#endif -: 84: -: 85:#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99 -: 86:__BEGIN_NAMESPACE_C99 -: 87:/* Hyperbolic arc cosine of X. */ -: 88:__MATHCALL (acosh,, (_Mdouble_ __x)); -: 89:/* Hyperbolic arc sine of X. */ -: 90:__MATHCALL (asinh,, (_Mdouble_ __x)); -: 91:/* Hyperbolic arc tangent of X. */ -: 92:__MATHCALL (atanh,, (_Mdouble_ __x)); -: 93:__END_NAMESPACE_C99 -: 94:#endif -: 95: -: 96:/* Exponential and logarithmic functions. */ -: 97: -: 98:_Mdouble_BEGIN_NAMESPACE -: 99:/* Exponential function of X. */ -: 100:__MATHCALL_VEC (exp,, (_Mdouble_ __x)); -: 101: -: 102:/* Break VALUE into a normalized fraction and an integral power of 2. */ -: 103:__MATHCALL (frexp,, (_Mdouble_ __x, int *__exponent)); -: 104: -: 105:/* X times (two to the EXP power). */ -: 106:__MATHCALL (ldexp,, (_Mdouble_ __x, int __exponent)); -: 107: -: 108:/* Natural logarithm of X. */ -: 109:__MATHCALL_VEC (log,, (_Mdouble_ __x)); -: 110: -: 111:/* Base-ten logarithm of X. */ -: 112:__MATHCALL (log10,, (_Mdouble_ __x)); -: 113: -: 114:/* Break VALUE into integral and fractional parts. */ -: 115:__MATHCALL (modf,, (_Mdouble_ __x, _Mdouble_ *__iptr)) __nonnull ((2)); -: 116:_Mdouble_END_NAMESPACE -: 117: -: 118:#ifdef __USE_GNU -: 119:/* A function missing in all standards: compute exponent to base ten. */ -: 120:__MATHCALL (exp10,, (_Mdouble_ __x)); -: 121:/* Another name occasionally used. */ -: 122:__MATHCALL (pow10,, (_Mdouble_ __x)); -: 123:#endif -: 124: -: 125:#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99 -: 126:__BEGIN_NAMESPACE_C99 -: 127:/* Return exp(X) - 1. */ -: 128:__MATHCALL (expm1,, (_Mdouble_ __x)); -: 129: -: 130:/* Return log(1 + X). */ -: 131:__MATHCALL (log1p,, (_Mdouble_ __x)); -: 132: -: 133:/* Return the base 2 signed integral exponent of X. */ -: 134:__MATHCALL (logb,, (_Mdouble_ __x)); -: 135:__END_NAMESPACE_C99 -: 136:#endif -: 137: -: 138:#ifdef __USE_ISOC99 -: 139:__BEGIN_NAMESPACE_C99 -: 140:/* Compute base-2 exponential of X. */ -: 141:__MATHCALL (exp2,, (_Mdouble_ __x)); -: 142: -: 143:/* Compute base-2 logarithm of X. */ -: 144:__MATHCALL (log2,, (_Mdouble_ __x)); -: 145:__END_NAMESPACE_C99 -: 146:#endif -: 147: -: 148: -: 149:/* Power functions. */ -: 150: -: 151:_Mdouble_BEGIN_NAMESPACE -: 152:/* Return X to the Y power. */ -: 153:__MATHCALL_VEC (pow,, (_Mdouble_ __x, _Mdouble_ __y)); -: 154: -: 155:/* Return the square root of X. */ -: 156:__MATHCALL (sqrt,, (_Mdouble_ __x)); -: 157:_Mdouble_END_NAMESPACE -: 158: -: 159:#if defined __USE_XOPEN || defined __USE_ISOC99 -: 160:__BEGIN_NAMESPACE_C99 -: 161:/* Return `sqrt(X*X + Y*Y)'. */ -: 162:__MATHCALL (hypot,, (_Mdouble_ __x, _Mdouble_ __y)); -: 163:__END_NAMESPACE_C99 -: 164:#endif -: 165: -: 166:#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99 -: 167:__BEGIN_NAMESPACE_C99 -: 168:/* Return the cube root of X. */ -: 169:__MATHCALL (cbrt,, (_Mdouble_ __x)); -: 170:__END_NAMESPACE_C99 -: 171:#endif -: 172: -: 173: -: 174:/* Nearest integer, absolute value, and remainder functions. */ -: 175: -: 176:_Mdouble_BEGIN_NAMESPACE -: 177:/* Smallest integral value not less than X. */ -: 178:__MATHCALLX (ceil,, (_Mdouble_ __x), (__const__)); -: 179: -: 180:/* Absolute value of X. */ -: 181:__MATHCALLX (fabs,, (_Mdouble_ __x), (__const__)); -: 182: -: 183:/* Largest integer not greater than X. */ -: 184:__MATHCALLX (floor,, (_Mdouble_ __x), (__const__)); -: 185: -: 186:/* Floating-point modulo remainder of X/Y. */ -: 187:__MATHCALL (fmod,, (_Mdouble_ __x, _Mdouble_ __y)); -: 188: -: 189: -: 190:/* Return 0 if VALUE is finite or NaN, +1 if it -: 191: is +Infinity, -1 if it is -Infinity. */ -: 192:__MATHDECL_1 (int,__isinf,, (_Mdouble_ __value)) __attribute__ ((__const__)); -: 193: -: 194:/* Return nonzero if VALUE is finite and not NaN. */ -: 195:__MATHDECL_1 (int,__finite,, (_Mdouble_ __value)) __attribute__ ((__const__)); -: 196:_Mdouble_END_NAMESPACE -: 197: -: 198:#ifdef __USE_MISC -: 199:# if (!defined __cplusplus \ -: 200: || __cplusplus < 201103L /* isinf conflicts with C++11. */ \ -: 201: || __MATH_DECLARING_DOUBLE == 0) /* isinff or isinfl don't. */ -: 202:/* Return 0 if VALUE is finite or NaN, +1 if it -: 203: is +Infinity, -1 if it is -Infinity. */ -: 204:__MATHDECL_1 (int,isinf,, (_Mdouble_ __value)) __attribute__ ((__const__)); -: 205:# endif -: 206: -: 207:/* Return nonzero if VALUE is finite and not NaN. */ -: 208:__MATHDECL_1 (int,finite,, (_Mdouble_ __value)) __attribute__ ((__const__)); -: 209: -: 210:/* Return the remainder of X/Y. */ -: 211:__MATHCALL (drem,, (_Mdouble_ __x, _Mdouble_ __y)); -: 212: -: 213: -: 214:/* Return the fractional part of X after dividing out `ilogb (X)'. */ -: 215:__MATHCALL (significand,, (_Mdouble_ __x)); -: 216:#endif /* Use misc. */ -: 217: -: 218:#ifdef __USE_ISOC99 -: 219:__BEGIN_NAMESPACE_C99 -: 220:/* Return X with its signed changed to Y's. */ -: 221:__MATHCALLX (copysign,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); -: 222:__END_NAMESPACE_C99 -: 223:#endif -: 224: -: 225:#ifdef __USE_ISOC99 -: 226:__BEGIN_NAMESPACE_C99 -: 227:/* Return representation of qNaN for double type. */ -: 228:__MATHCALLX (nan,, (const char *__tagb), (__const__)); -: 229:__END_NAMESPACE_C99 -: 230:#endif -: 231: -: 232: -: 233:/* Return nonzero if VALUE is not a number. */ -: 234:__MATHDECL_1 (int,__isnan,, (_Mdouble_ __value)) __attribute__ ((__const__)); -: 235: -: 236:#if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K) -: 237:# if (!defined __cplusplus \ -: 238: || __cplusplus < 201103L /* isnan conflicts with C++11. */ \ -: 239: || __MATH_DECLARING_DOUBLE == 0) /* isnanf or isnanl don't. */ -: 240:/* Return nonzero if VALUE is not a number. */ -: 241:__MATHDECL_1 (int,isnan,, (_Mdouble_ __value)) __attribute__ ((__const__)); -: 242:# endif -: 243:#endif -: 244: -: 245:#if defined __USE_MISC || (defined __USE_XOPEN && __MATH_DECLARING_DOUBLE) -: 246:/* Bessel functions. */ -: 247:__MATHCALL (j0,, (_Mdouble_)); -: 248:__MATHCALL (j1,, (_Mdouble_)); -: 249:__MATHCALL (jn,, (int, _Mdouble_)); -: 250:__MATHCALL (y0,, (_Mdouble_)); -: 251:__MATHCALL (y1,, (_Mdouble_)); -: 252:__MATHCALL (yn,, (int, _Mdouble_)); -: 253:#endif -: 254: -: 255: -: 256:#if defined __USE_XOPEN || defined __USE_ISOC99 -: 257:__BEGIN_NAMESPACE_C99 -: 258:/* Error and gamma functions. */ -: 259:__MATHCALL (erf,, (_Mdouble_)); -: 260:__MATHCALL (erfc,, (_Mdouble_)); -: 261:__MATHCALL (lgamma,, (_Mdouble_)); -: 262:__END_NAMESPACE_C99 -: 263:#endif -: 264: -: 265:#ifdef __USE_ISOC99 -: 266:__BEGIN_NAMESPACE_C99 -: 267:/* True gamma function. */ -: 268:__MATHCALL (tgamma,, (_Mdouble_)); -: 269:__END_NAMESPACE_C99 -: 270:#endif -: 271: -: 272:#if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K) -: 273:/* Obsolete alias for `lgamma'. */ -: 274:__MATHCALL (gamma,, (_Mdouble_)); -: 275:#endif -: 276: -: 277:#ifdef __USE_MISC -: 278:/* Reentrant version of lgamma. This function uses the global variable -: 279: `signgam'. The reentrant version instead takes a pointer and stores -: 280: the value through it. */ -: 281:__MATHCALL (lgamma,_r, (_Mdouble_, int *__signgamp)); -: 282:#endif -: 283: -: 284: -: 285:#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99 -: 286:__BEGIN_NAMESPACE_C99 -: 287:/* Return the integer nearest X in the direction of the -: 288: prevailing rounding mode. */ -: 289:__MATHCALL (rint,, (_Mdouble_ __x)); -: 290: -: 291:/* Return X + epsilon if X < Y, X - epsilon if X > Y. */ -: 292:__MATHCALLX (nextafter,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); -: 293:# if defined __USE_ISOC99 && !defined __LDBL_COMPAT -: 294:__MATHCALLX (nexttoward,, (_Mdouble_ __x, long double __y), (__const__)); -: 295:# endif -: 296: -: 297:/* Return the remainder of integer divison X / Y with infinite precision. */ -: 298:__MATHCALL (remainder,, (_Mdouble_ __x, _Mdouble_ __y)); -: 299: -: 300:# ifdef __USE_ISOC99 -: 301:/* Return X times (2 to the Nth power). */ -: 302:__MATHCALL (scalbn,, (_Mdouble_ __x, int __n)); -: 303:# endif -: 304: -: 305:/* Return the binary exponent of X, which must be nonzero. */ -: 306:__MATHDECL (int,ilogb,, (_Mdouble_ __x)); -: 307:#endif -: 308: -: 309:#ifdef __USE_ISOC99 -: 310:/* Return X times (2 to the Nth power). */ -: 311:__MATHCALL (scalbln,, (_Mdouble_ __x, long int __n)); -: 312: -: 313:/* Round X to integral value in floating-point format using current -: 314: rounding direction, but do not raise inexact exception. */ -: 315:__MATHCALL (nearbyint,, (_Mdouble_ __x)); -: 316: -: 317:/* Round X to nearest integral value, rounding halfway cases away from -: 318: zero. */ function round called 0 returned 0% blocks executed 0% #####: 319:__MATHCALLX (round,, (_Mdouble_ __x), (__const__)); -: 320: -: 321:/* Round X to the integral value in floating-point format nearest but -: 322: not larger in magnitude. */ -: 323:__MATHCALLX (trunc,, (_Mdouble_ __x), (__const__)); -: 324: -: 325:/* Compute remainder of X and Y and put in *QUO a value with sign of x/y -: 326: and magnitude congruent `mod 2^n' to the magnitude of the integral -: 327: quotient x/y, with n >= 3. */ -: 328:__MATHCALL (remquo,, (_Mdouble_ __x, _Mdouble_ __y, int *__quo)); -: 329: -: 330: -: 331:/* Conversion functions. */ -: 332: -: 333:/* Round X to nearest integral value according to current rounding -: 334: direction. */ -: 335:__MATHDECL (long int,lrint,, (_Mdouble_ __x)); -: 336:__extension__ -: 337:__MATHDECL (long long int,llrint,, (_Mdouble_ __x)); -: 338: -: 339:/* Round X to nearest integral value, rounding halfway cases away from -: 340: zero. */ -: 341:__MATHDECL (long int,lround,, (_Mdouble_ __x)); -: 342:__extension__ -: 343:__MATHDECL (long long int,llround,, (_Mdouble_ __x)); -: 344: -: 345: -: 346:/* Return positive difference between X and Y. */ -: 347:__MATHCALL (fdim,, (_Mdouble_ __x, _Mdouble_ __y)); -: 348: -: 349:/* Return maximum numeric value from X and Y. */ -: 350:__MATHCALLX (fmax,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); -: 351: -: 352:/* Return minimum numeric value from X and Y. */ -: 353:__MATHCALLX (fmin,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); -: 354: -: 355: -: 356:/* Classify given number. */ -: 357:__MATHDECL_1 (int, __fpclassify,, (_Mdouble_ __value)) -: 358: __attribute__ ((__const__)); -: 359: -: 360:/* Test for negative number. */ -: 361:__MATHDECL_1 (int, __signbit,, (_Mdouble_ __value)) -: 362: __attribute__ ((__const__)); -: 363: -: 364: -: 365:/* Multiply-add function computed as a ternary operation. */ -: 366:__MATHCALL (fma,, (_Mdouble_ __x, _Mdouble_ __y, _Mdouble_ __z)); -: 367:#endif /* Use ISO C99. */ -: 368: -: 369:#if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99 -: 370:__END_NAMESPACE_C99 -: 371:#endif -: 372: -: 373:#ifdef __USE_GNU -: 374:/* Test for signaling NaN. */ -: 375:__MATHDECL_1 (int, __issignaling,, (_Mdouble_ __value)) -: 376: __attribute__ ((__const__)); -: 377:#endif -: 378: -: 379:#if defined __USE_MISC || (defined __USE_XOPEN_EXTENDED \ -: 380: && __MATH_DECLARING_DOUBLE \ -: 381: && !defined __USE_XOPEN2K8) -: 382:/* Return X times (2 to the Nth power). */ -: 383:__MATHCALL (scalb,, (_Mdouble_ __x, _Mdouble_ __n)); -: 384:#endif <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Pack.c.gcov -: 0:Source:src/libImaging/Pack.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Pack.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Pack.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1: /* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * code to pack raw data -: 6: * -: 7: * history: -: 8: * 1996-04-30 fl Created -: 9: * 1996-05-12 fl Published a few RGB packers -: 10: * 1996-11-01 fl More RGB packers (Tk booster stuff) -: 11: * 1996-12-30 fl Added P;1, P;2 and P;4 packers -: 12: * 1997-06-02 fl Added F (F;32NF) packer -: 13: * 1997-08-28 fl Added 1 as L packer -: 14: * 1998-02-08 fl Added I packer -: 15: * 1998-03-09 fl Added mode field, RGBA/RGBX as RGB packers -: 16: * 1998-07-01 fl Added YCbCr support -: 17: * 1998-07-12 fl Added I 16 packer -: 18: * 1999-02-03 fl Added BGR packers -: 19: * 2003-09-26 fl Added LA/PA packers -: 20: * 2006-06-22 fl Added CMYK;I packer -: 21: * -: 22: * Copyright (c) 1997-2006 by Secret Labs AB. -: 23: * Copyright (c) 1996-1997 by Fredrik Lundh. -: 24: * -: 25: * See the README file for information on usage and redistribution. -: 26: */ -: 27: -: 28: -: 29:#include "Imaging.h" -: 30: -: 31:#define R 0 -: 32:#define G 1 -: 33:#define B 2 -: 34:#define X 3 -: 35:#define A 3 -: 36: -: 37:#define C 0 -: 38:#define M 1 -: 39:#define Y 2 -: 40:#define K 3 -: 41: -: 42:/* byte swapping macros */ -: 43: -: 44:#define C16N\ -: 45: (out[0]=tmp[0], out[1]=tmp[1]); -: 46:#define C16S\ -: 47: (out[1]=tmp[0], out[0]=tmp[1]); -: 48:#define C32N\ -: 49: (out[0]=tmp[0], out[1]=tmp[1], out[2]=tmp[2], out[3]=tmp[3]); -: 50:#define C32S\ -: 51: (out[3]=tmp[0], out[2]=tmp[1], out[1]=tmp[2], out[0]=tmp[3]); -: 52:#define C64N\ -: 53: (out[0]=tmp[0], out[1]=tmp[1], out[2]=tmp[2], out[3]=tmp[3],\ -: 54: out[4]=tmp[4], out[5]=tmp[5], out[6]=tmp[6], out[7]=tmp[7]); -: 55:#define C64S\ -: 56: (out[7]=tmp[0], out[6]=tmp[1], out[5]=tmp[2], out[4]=tmp[3],\ -: 57: out[3]=tmp[4], out[2]=tmp[5], out[1]=tmp[6], out[0]=tmp[7]); -: 58: -: 59:#ifdef WORDS_BIGENDIAN -: 60:#define C16B C16N -: 61:#define C16L C16S -: 62:#define C32B C32N -: 63:#define C32L C32S -: 64:#define C64B C64N -: 65:#define C64L C64S -: 66:#else -: 67:#define C16B C16S -: 68:#define C16L C16N -: 69:#define C32B C32S -: 70:#define C32L C32N -: 71:#define C64B C64S -: 72:#define C64L C64N -: 73:#endif -: 74: -: 75: -: 76:static void function pack1 called 23398 returned 100% blocks executed 100% 23398: 77:pack1(UINT8* out, const UINT8* in, int pixels) -: 78:{ -: 79: int i, m, b; -: 80: /* bilevel (black is 0) */ 23398: 81: b = 0; m = 128; 15596631: 82: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 15573233: 83: if (in[i] != 0) { branch 0 taken 46% (fallthrough) branch 1 taken 54% 7136230: 84: b |= m; -: 85: } 15573233: 86: m >>= 1; 15573233: 87: if (m == 0) { branch 0 taken 12% (fallthrough) branch 1 taken 88% 1944082: 88: *out++ = b; 1944082: 89: b = 0; m = 128; -: 90: } -: 91: } 23398: 92: if (m != 128) { branch 0 taken 30% (fallthrough) branch 1 taken 70% 6955: 93: *out++ = b; -: 94: } 23398: 95:} -: 96: -: 97:static void function pack1I called 258 returned 100% blocks executed 90% 258: 98:pack1I(UINT8* out, const UINT8* in, int pixels) -: 99:{ -: 100: int i, m, b; -: 101: /* bilevel (black is 1) */ 258: 102: b = 0; m = 128; 33042: 103: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32784: 104: if (in[i] == 0) { branch 0 taken 67% (fallthrough) branch 1 taken 33% 21993: 105: b |= m; -: 106: } 32784: 107: m >>= 1; 32784: 108: if (m == 0) { branch 0 taken 13% (fallthrough) branch 1 taken 88% 4098: 109: *out++ = b; 4098: 110: b = 0; m = 128; -: 111: } -: 112: } 258: 113: if (m != 128) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 114: *out++ = b; -: 115: } 258: 116:} -: 117: -: 118:static void function pack1R called 1386 returned 100% blocks executed 90% 1386: 119:pack1R(UINT8* out, const UINT8* in, int pixels) -: 120:{ -: 121: int i, m, b; -: 122: /* bilevel, lsb first (black is 0) */ 1386: 123: b = 0; m = 1; 1050554: 124: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1049168: 125: if (in[i] != 0) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 348100: 126: b |= m; -: 127: } 1049168: 128: m <<= 1; 1049168: 129: if (m == 256){ branch 0 taken 13% (fallthrough) branch 1 taken 88% 131146: 130: *out++ = b; 131146: 131: b = 0; m = 1; -: 132: } -: 133: } 1386: 134: if (m != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 135: *out++ = b; -: 136: } 1386: 137:} -: 138: -: 139:static void function pack1IR called 2 returned 100% blocks executed 90% 2: 140:pack1IR(UINT8* out, const UINT8* in, int pixels) -: 141:{ -: 142: int i, m, b; -: 143: /* bilevel, lsb first (black is 1) */ 2: 144: b = 0; m = 1; 18: 145: for (i = 0; i < pixels; i++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 16: 146: if (in[i] == 0) { branch 0 taken 31% (fallthrough) branch 1 taken 69% 5: 147: b |= m; -: 148: } 16: 149: m <<= 1; 16: 150: if (m == 256){ branch 0 taken 13% (fallthrough) branch 1 taken 88% 2: 151: *out++ = b; 2: 152: b = 0; m = 1; -: 153: } -: 154: } 2: 155: if (m != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 156: *out++ = b; -: 157: } 2: 158:} -: 159: -: 160:static void function pack1L called 45 returned 100% blocks executed 100% 45: 161:pack1L(UINT8* out, const UINT8* in, int pixels) -: 162:{ -: 163: int i; -: 164: /* bilevel, stored as bytes */ 663: 165: for (i = 0; i < pixels; i++) { branch 0 taken 93% branch 1 taken 7% (fallthrough) 618: 166: out[i] = (in[i] != 0) ? 255 : 0; branch 0 taken 96% (fallthrough) branch 1 taken 4% -: 167: } 45: 168:} -: 169: -: 170:static void function packP4 called 1 returned 100% blocks executed 83% 1: 171:packP4(UINT8* out, const UINT8* in, int pixels) -: 172:{ 4: 173: while (pixels >= 2) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 4: 174: *out++ = (in[0] << 4) | 2: 175: (in[1] & 15); 2: 176: in += 2; pixels -= 2; -: 177: } -: 178: 1: 179: if (pixels) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 180: out[0] = (in[0] << 4); -: 181: } 1: 182:} -: 183: -: 184:static void function packP2 called 2 returned 100% blocks executed 75% 2: 185:packP2(UINT8* out, const UINT8* in, int pixels) -: 186:{ 6: 187: while (pixels >= 4) { branch 0 taken 50% branch 1 taken 50% (fallthrough) 8: 188: *out++ = (in[0] << 6) | 2: 189: ((in[1] & 3) << 4) | 2: 190: ((in[2] & 3) << 2) | 2: 191: (in[3] & 3); 2: 192: in += 4; pixels -= 4; -: 193: } -: 194: 2: 195: switch (pixels) { branch 0 taken 0% branch 1 taken 50% branch 2 taken 0% branch 3 taken 50% -: 196: case 3: #####: 197: out[0] = (in[0] << 6) | #####: 198: ((in[1] & 3) << 4) | #####: 199: ((in[2] & 3) << 2); #####: 200: break; -: 201: case 2: 2: 202: out[0] = (in[0] << 6) | 1: 203: ((in[1] & 3) << 4); 1: 204: break; -: 205: case 1: #####: 206: out[0] = (in[0] << 6); -: 207: } 2: 208:} -: 209: -: 210:static void function packL16 called 1 returned 100% blocks executed 100% 1: 211:packL16(UINT8* out, const UINT8* in, int pixels) -: 212:{ -: 213: int i; -: 214: /* L -> L;16, e.g: \xff77 -> \x00\xff\x00\x77 */ 3: 215: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 216: out[0] = 0; 2: 217: out[1] = in[i]; 2: 218: out += 2; -: 219: } 1: 220:} -: 221: -: 222:static void function packL16B called 385 returned 100% blocks executed 100% 385: 223:packL16B(UINT8* out, const UINT8* in, int pixels) -: 224:{ -: 225: int i; -: 226: /* L -> L;16B, e.g: \xff77 -> \xff\x00\x77\x00 */ 49539: 227: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 49154: 228: out[0] = in[i]; 49154: 229: out[1] = 0; 49154: 230: out += 2; -: 231: } 385: 232:} -: 233: -: 234: -: 235:static void function packLA called 13122 returned 100% blocks executed 100% 13122: 236:packLA(UINT8* out, const UINT8* in, int pixels) -: 237:{ -: 238: int i; -: 239: /* LA, pixel interleaved */ 1411686: 240: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1398564: 241: out[0] = in[R]; 1398564: 242: out[1] = in[A]; 1398564: 243: out += 2; in += 4; -: 244: } 13122: 245:} -: 246: -: 247:static void function packLAL called 130 returned 100% blocks executed 100% 130: 248:packLAL(UINT8* out, const UINT8* in, int pixels) -: 249:{ -: 250: int i; -: 251: /* LA, line interleaved */ 16520: 252: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16390: 253: out[i] = in[R]; 16390: 254: out[i+pixels] = in[A]; 16390: 255: in += 4; -: 256: } 130: 257:} -: 258: -: 259:void function ImagingPackRGB called 188815 returned 100% blocks executed 100% 188815: 260:ImagingPackRGB(UINT8* out, const UINT8* in, int pixels) -: 261:{ 188815: 262: int i = 0; -: 263: /* RGB triplets */ -: 264:#ifdef __sparc -: 265: /* SPARC CPUs cannot read integers from nonaligned addresses. */ -: 266: for (; i < pixels; i++) { -: 267: out[0] = in[R]; -: 268: out[1] = in[G]; -: 269: out[2] = in[B]; -: 270: out += 3; in += 4; -: 271: } -: 272:#else 195550569: 273: for (; i < pixels-1; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 390723508: 274: memcpy(out, in + i * 4, 4); 195361754: 275: out += 3; -: 276: } 188815: 277: for (; i < pixels; i++) { branch 0 taken 50% branch 1 taken 50% (fallthrough) 188815: 278: out[0] = in[i*4+R]; 188815: 279: out[1] = in[i*4+G]; 188815: 280: out[2] = in[i*4+B]; 188815: 281: out += 3; -: 282: } -: 283:#endif 188815: 284:} -: 285: -: 286:void function ImagingPackXRGB called 1 returned 100% blocks executed 100% 1: 287:ImagingPackXRGB(UINT8* out, const UINT8* in, int pixels) -: 288:{ -: 289: int i; -: 290: /* XRGB, triplets with left padding */ 3: 291: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 292: out[0] = 0; 2: 293: out[1] = in[R]; 2: 294: out[2] = in[G]; 2: 295: out[3] = in[B]; 2: 296: out += 4; in += 4; -: 297: } 1: 298:} -: 299: -: 300:void function ImagingPackBGR called 1379 returned 100% blocks executed 100% 1379: 301:ImagingPackBGR(UINT8* out, const UINT8* in, int pixels) -: 302:{ -: 303: int i; -: 304: /* RGB, reversed bytes */ 208412: 305: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 207033: 306: out[0] = in[B]; 207033: 307: out[1] = in[G]; 207033: 308: out[2] = in[R]; 207033: 309: out += 3; in += 4; -: 310: } 1379: 311:} -: 312: -: 313:void function ImagingPackBGRX called 3 returned 100% blocks executed 100% 3: 314:ImagingPackBGRX(UINT8* out, const UINT8* in, int pixels) -: 315:{ -: 316: int i; -: 317: /* BGRX, reversed bytes with right padding */ 264: 318: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 261: 319: out[0] = in[B]; 261: 320: out[1] = in[G]; 261: 321: out[2] = in[R]; 261: 322: out[3] = 0; 261: 323: out += 4; in += 4; -: 324: } 3: 325:} -: 326: -: 327:void function ImagingPackXBGR called 2 returned 100% blocks executed 100% 2: 328:ImagingPackXBGR(UINT8* out, const UINT8* in, int pixels) -: 329:{ -: 330: int i; -: 331: /* XBGR, reversed bytes with left padding */ 7: 332: for (i = 0; i < pixels; i++) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 5: 333: out[0] = 0; 5: 334: out[1] = in[B]; 5: 335: out[2] = in[G]; 5: 336: out[3] = in[R]; 5: 337: out += 4; in += 4; -: 338: } 2: 339:} -: 340: -: 341:void function ImagingPackBGRA called 1687 returned 100% blocks executed 100% 1687: 342:ImagingPackBGRA(UINT8* out, const UINT8* in, int pixels) -: 343:{ -: 344: int i; -: 345: /* BGRX, reversed bytes with right padding */ 322628: 346: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 320941: 347: out[0] = in[B]; 320941: 348: out[1] = in[G]; 320941: 349: out[2] = in[R]; 320941: 350: out[3] = in[A]; 320941: 351: out += 4; in += 4; -: 352: } 1687: 353:} -: 354: -: 355:void function ImagingPackABGR called 2 returned 100% blocks executed 100% 2: 356:ImagingPackABGR(UINT8* out, const UINT8* in, int pixels) -: 357:{ -: 358: int i; -: 359: /* XBGR, reversed bytes with left padding */ 8: 360: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 6: 361: out[0] = in[A]; 6: 362: out[1] = in[B]; 6: 363: out[2] = in[G]; 6: 364: out[3] = in[R]; 6: 365: out += 4; in += 4; -: 366: } 2: 367:} -: 368: -: 369:void function ImagingPackBGRa called 1 returned 100% blocks executed 100% 1: 370:ImagingPackBGRa(UINT8* out, const UINT8* in, int pixels) -: 371:{ -: 372: int i; -: 373: /* BGRa, reversed bytes with premultiplied alpha */ 4: 374: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 375: int alpha = out[3] = in[A]; -: 376: int tmp; 3: 377: out[0] = MULDIV255(in[B], alpha, tmp); 3: 378: out[1] = MULDIV255(in[G], alpha, tmp); 3: 379: out[2] = MULDIV255(in[R], alpha, tmp); 3: 380: out += 4; in += 4; -: 381: } 1: 382:} -: 383: -: 384:static void function packRGBL called 1033 returned 100% blocks executed 100% 1033: 385:packRGBL(UINT8* out, const UINT8* in, int pixels) -: 386:{ -: 387: int i; -: 388: /* RGB, line interleaved */ 329744: 389: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 328711: 390: out[i] = in[R]; 328711: 391: out[i+pixels] = in[G]; 328711: 392: out[i+pixels+pixels] = in[B]; 328711: 393: in += 4; -: 394: } 1033: 395:} -: 396: -: 397:static void function packRGBXL called 3 returned 100% blocks executed 100% 3: 398:packRGBXL(UINT8* out, const UINT8* in, int pixels) -: 399:{ -: 400: int i; -: 401: /* RGBX, line interleaved */ 12: 402: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 9: 403: out[i] = in[R]; 9: 404: out[i+pixels] = in[G]; 9: 405: out[i+pixels+pixels] = in[B]; 9: 406: out[i+pixels+pixels+pixels] = in[X]; 9: 407: in += 4; -: 408: } 3: 409:} -: 410: -: 411:static void function packI16B called 293 returned 100% blocks executed 89% 293: 412:packI16B(UINT8* out, const UINT8* in_, int pixels) -: 413:{ -: 414: int i; -: 415: UINT16 tmp_; 293: 416: UINT8* tmp = (UINT8*) &tmp_; 22775: 417: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 418: INT32 in; 22482: 419: memcpy(&in, in_, sizeof(in)); 22482: 420: if (in <= 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 75: 421: tmp_ = 0; 22407: 422: } else if (in > 65535) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 423: tmp_ = 65535; -: 424: } else { 22407: 425: tmp_ = in; -: 426: } 22482: 427: C16B; 22482: 428: out += 2; in_ += sizeof(in); -: 429: } 293: 430:} -: 431: -: 432:static void function packI16N_I16B called 256 returned 100% blocks executed 100% 256: 433:packI16N_I16B(UINT8* out, const UINT8* in, int pixels){ -: 434: int i; 256: 435: UINT8* tmp = (UINT8*) in; 33024: 436: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 437: C16B; 32768: 438: out += 2; tmp += 2; -: 439: } -: 440: 256: 441:} -: 442:static void function packI16N_I16 called 0 returned 0% blocks executed 0% #####: 443:packI16N_I16(UINT8* out, const UINT8* in, int pixels){ -: 444: int i; #####: 445: UINT8* tmp = (UINT8*) in; #####: 446: for (i = 0; i < pixels; i++) { branch 0 never executed branch 1 never executed #####: 447: C16L; #####: 448: out += 2; tmp += 2; -: 449: } #####: 450:} -: 451: -: 452: -: 453:static void function packI32S called 290 returned 100% blocks executed 100% 290: 454:packI32S(UINT8* out, const UINT8* in, int pixels) -: 455:{ -: 456: int i; 290: 457: UINT8* tmp = (UINT8*) in; 34086: 458: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 33796: 459: C32L; 33796: 460: out += 4; tmp += 4; -: 461: } 290: 462:} -: 463: -: 464:void function ImagingPackLAB called 1025 returned 100% blocks executed 100% 1025: 465:ImagingPackLAB(UINT8* out, const UINT8* in, int pixels) -: 466:{ -: 467: int i; -: 468: /* LAB triplets */ 132100: 469: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 131075: 470: out[0] = in[0]; 131075: 471: out[1] = in[1] ^ 128; /* signed in outside world */ 131075: 472: out[2] = in[2] ^ 128; 131075: 473: out += 3; in += 4; -: 474: } 1025: 475:} -: 476: -: 477:static void function copy1 called 195347 returned 100% blocks executed 100% 195347: 478:copy1(UINT8* out, const UINT8* in, int pixels) -: 479:{ -: 480: /* L, P */ 390694: 481: memcpy(out, in, pixels); 195347: 482:} -: 483: -: 484:static void function copy2 called 8121 returned 100% blocks executed 100% 8121: 485:copy2(UINT8* out, const UINT8* in, int pixels) -: 486:{ -: 487: /* I;16, etc */ 16242: 488: memcpy(out, in, pixels*2); 8121: 489:} -: 490: -: 491:static void function copy3 called 0 returned 0% blocks executed 0% #####: 492:copy3(UINT8* out, const UINT8* in, int pixels) -: 493:{ -: 494: /* BGR;24, etc */ #####: 495: memcpy(out, in, pixels*3); #####: 496:} -: 497: -: 498:static void function copy4 called 74849 returned 100% blocks executed 100% 74849: 499:copy4(UINT8* out, const UINT8* in, int pixels) -: 500:{ -: 501: /* RGBA, CMYK quadruples */ 149698: 502: memcpy(out, in, 4*pixels); 74849: 503:} -: 504: -: 505:static void function copy4I called 2189 returned 100% blocks executed 100% 2189: 506:copy4I(UINT8* out, const UINT8* in, int pixels) -: 507:{ -: 508: /* RGBA, CMYK quadruples, inverted */ -: 509: int i; 1022553: 510: for (i = 0; i < pixels*4; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1020364: 511: out[i] = ~in[i]; -: 512: } 2189: 513:} -: 514: -: 515:static void function band0 called 6 returned 100% blocks executed 100% 6: 516:band0(UINT8* out, const UINT8* in, int pixels) -: 517:{ -: 518: int i; 24: 519: for (i = 0; i < pixels; i++, in += 4) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 18: 520: out[i] = in[0]; -: 521: } 6: 522:} -: 523: -: 524:static void function band1 called 6 returned 100% blocks executed 100% 6: 525:band1(UINT8* out, const UINT8* in, int pixels) -: 526:{ -: 527: int i; 24: 528: for (i = 0; i < pixels; i++, in += 4) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 18: 529: out[i] = in[1]; -: 530: } 6: 531:} -: 532: -: 533:static void function band2 called 6 returned 100% blocks executed 100% 6: 534:band2(UINT8* out, const UINT8* in, int pixels) -: 535:{ -: 536: int i; 24: 537: for (i = 0; i < pixels; i++, in += 4) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 18: 538: out[i] = in[2]; -: 539: } 6: 540:} -: 541: -: 542:static void function band3 called 5 returned 100% blocks executed 100% 5: 543:band3(UINT8* out, const UINT8* in, int pixels) -: 544:{ -: 545: int i; 526: 546: for (i = 0; i < pixels; i++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 521: 547: out[i] = in[3]; -: 548: } 5: 549:} -: 550: -: 551:static struct { -: 552: const char* mode; -: 553: const char* rawmode; -: 554: int bits; -: 555: ImagingShuffler pack; -: 556:} packers[] = { -: 557: -: 558: /* bilevel */ -: 559: {"1", "1", 1, pack1}, -: 560: {"1", "1;I", 1, pack1I}, -: 561: {"1", "1;R", 1, pack1R}, -: 562: {"1", "1;IR", 1, pack1IR}, -: 563: {"1", "L", 8, pack1L}, -: 564: -: 565: /* greyscale */ -: 566: {"L", "L", 8, copy1}, -: 567: {"L", "L;16", 16, packL16}, -: 568: {"L", "L;16B", 16, packL16B}, -: 569: -: 570: /* greyscale w. alpha */ -: 571: {"LA", "LA", 16, packLA}, -: 572: {"LA", "LA;L", 16, packLAL}, -: 573: -: 574: /* greyscale w. alpha premultiplied */ -: 575: {"La", "La", 16, packLA}, -: 576: -: 577: /* palette */ -: 578: {"P", "P;1", 1, pack1}, -: 579: {"P", "P;2", 2, packP2}, -: 580: {"P", "P;4", 4, packP4}, -: 581: {"P", "P", 8, copy1}, -: 582: -: 583: /* palette w. alpha */ -: 584: {"PA", "PA", 16, packLA}, -: 585: {"PA", "PA;L", 16, packLAL}, -: 586: -: 587: /* true colour */ -: 588: {"RGB", "RGB", 24, ImagingPackRGB}, -: 589: {"RGB", "RGBX", 32, copy4}, -: 590: {"RGB", "XRGB", 32, ImagingPackXRGB}, -: 591: {"RGB", "BGR", 24, ImagingPackBGR}, -: 592: {"RGB", "BGRX", 32, ImagingPackBGRX}, -: 593: {"RGB", "XBGR", 32, ImagingPackXBGR}, -: 594: {"RGB", "RGB;L", 24, packRGBL}, -: 595: {"RGB", "R", 8, band0}, -: 596: {"RGB", "G", 8, band1}, -: 597: {"RGB", "B", 8, band2}, -: 598: -: 599: /* true colour w. alpha */ -: 600: {"RGBA", "RGBA", 32, copy4}, -: 601: {"RGBA", "RGBA;L", 32, packRGBXL}, -: 602: {"RGBA", "RGB", 24, ImagingPackRGB}, -: 603: {"RGBA", "BGR", 24, ImagingPackBGR}, -: 604: {"RGBA", "BGRA", 32, ImagingPackBGRA}, -: 605: {"RGBA", "ABGR", 32, ImagingPackABGR}, -: 606: {"RGBA", "BGRa", 32, ImagingPackBGRa}, -: 607: {"RGBA", "R", 8, band0}, -: 608: {"RGBA", "G", 8, band1}, -: 609: {"RGBA", "B", 8, band2}, -: 610: {"RGBA", "A", 8, band3}, -: 611: -: 612: /* true colour w. alpha premultiplied */ -: 613: {"RGBa", "RGBa", 32, copy4}, -: 614: {"RGBa", "BGRa", 32, ImagingPackBGRA}, -: 615: {"RGBa", "aBGR", 32, ImagingPackABGR}, -: 616: -: 617: /* true colour w. padding */ -: 618: {"RGBX", "RGBX", 32, copy4}, -: 619: {"RGBX", "RGBX;L", 32, packRGBXL}, -: 620: {"RGBX", "RGB", 24, ImagingPackRGB}, -: 621: {"RGBX", "BGR", 24, ImagingPackBGR}, -: 622: {"RGBX", "BGRX", 32, ImagingPackBGRX}, -: 623: {"RGBX", "XBGR", 32, ImagingPackXBGR}, -: 624: {"RGBX", "R", 8, band0}, -: 625: {"RGBX", "G", 8, band1}, -: 626: {"RGBX", "B", 8, band2}, -: 627: {"RGBX", "X", 8, band3}, -: 628: -: 629: /* colour separation */ -: 630: {"CMYK", "CMYK", 32, copy4}, -: 631: {"CMYK", "CMYK;I", 32, copy4I}, -: 632: {"CMYK", "CMYK;L", 32, packRGBXL}, -: 633: {"CMYK", "C", 8, band0}, -: 634: {"CMYK", "M", 8, band1}, -: 635: {"CMYK", "Y", 8, band2}, -: 636: {"CMYK", "K", 8, band3}, -: 637: -: 638: /* video (YCbCr) */ -: 639: {"YCbCr", "YCbCr", 24, ImagingPackRGB}, -: 640: {"YCbCr", "YCbCr;L", 24, packRGBL}, -: 641: {"YCbCr", "YCbCrX", 32, copy4}, -: 642: {"YCbCr", "YCbCrK", 32, copy4}, -: 643: {"YCbCr", "Y", 8, band0}, -: 644: {"YCbCr", "Cb", 8, band1}, -: 645: {"YCbCr", "Cr", 8, band2}, -: 646: -: 647: /* LAB Color */ -: 648: {"LAB", "LAB", 24, ImagingPackLAB}, -: 649: {"LAB", "L", 8, band0}, -: 650: {"LAB", "A", 8, band1}, -: 651: {"LAB", "B", 8, band2}, -: 652: -: 653: /* HSV */ -: 654: {"HSV", "HSV", 24, ImagingPackRGB}, -: 655: {"HSV", "H", 8, band0}, -: 656: {"HSV", "S", 8, band1}, -: 657: {"HSV", "V", 8, band2}, -: 658: -: 659: /* integer */ -: 660: {"I", "I", 32, copy4}, -: 661: {"I", "I;16B", 16, packI16B}, -: 662: {"I", "I;32S", 32, packI32S}, -: 663: {"I", "I;32NS", 32, copy4}, -: 664: -: 665: /* floating point */ -: 666: {"F", "F", 32, copy4}, -: 667: {"F", "F;32F", 32, packI32S}, -: 668: {"F", "F;32NF", 32, copy4}, -: 669: -: 670: /* storage modes */ -: 671: {"I;16", "I;16", 16, copy2}, -: 672: {"I;16", "I;16B", 16, packI16N_I16B}, -: 673: {"I;16B", "I;16B", 16, copy2}, -: 674: {"I;16L", "I;16L", 16, copy2}, -: 675: {"I;16", "I;16N", 16, packI16N_I16}, // LibTiff native->image endian. -: 676: {"I;16L", "I;16N", 16, packI16N_I16}, -: 677: {"I;16B", "I;16N", 16, packI16N_I16B}, -: 678: {"BGR;15", "BGR;15", 16, copy2}, -: 679: {"BGR;16", "BGR;16", 16, copy2}, -: 680: {"BGR;24", "BGR;24", 24, copy3}, -: 681: -: 682: {NULL} /* sentinel */ -: 683:}; -: 684: -: 685: -: 686:ImagingShuffler function ImagingFindPacker called 4061 returned 100% blocks executed 100% 4061: 687:ImagingFindPacker(const char* mode, const char* rawmode, int* bits_out) -: 688:{ -: 689: int i; -: 690: -: 691: /* find a suitable pixel packer */ 73470: 692: for (i = 0; packers[i].rawmode; i++) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 79838: 693: if (strcmp(packers[i].mode, mode) == 0 && branch 0 taken 9% (fallthrough) branch 1 taken 91% branch 2 taken 64% (fallthrough) branch 3 taken 36% 6368: 694: strcmp(packers[i].rawmode, rawmode) == 0) { 4061: 695: if (bits_out) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 4061: 696: *bits_out = packers[i].bits; -: 697: } 4061: 698: return packers[i].pack; -: 699: } -: 700: } -: 701: return NULL; -: 702:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#_imagingmorph.c.gcov -: 0:Source:src/_imagingmorph.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imagingmorph.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imagingmorph.gcda -: 0:Runs:1 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * -: 4: * A binary morphology add-on for the Python Imaging Library -: 5: * -: 6: * History: -: 7: * 2014-06-04 Initial version. -: 8: * -: 9: * Copyright (c) 2014 Dov Grobgeld -: 10: * -: 11: * See the README file for information on usage and redistribution. -: 12: */ -: 13: -: 14:#include "Python.h" -: 15:#include "libImaging/Imaging.h" -: 16: -: 17:#define LUT_SIZE (1<<9) -: 18: -: 19:/* Apply a morphologic LUT to a binary image. Outputs a -: 20: a new binary image. -: 21: -: 22: Expected parameters: -: 23: -: 24: 1. a LUT - a 512 byte size lookup table. -: 25: 2. an input Imaging image id. -: 26: 3. an output Imaging image id -: 27: -: 28: Returns number of changed pixels. -: 29:*/ -: 30:static PyObject* function apply called 9 returned 100% blocks executed 82% 9: 31:apply(PyObject *self, PyObject* args) -: 32:{ -: 33: const char *lut; -: 34: PyObject *py_lut; -: 35: Py_ssize_t lut_len, i0, i1; -: 36: Imaging imgin, imgout; -: 37: int width, height; -: 38: int row_idx, col_idx; -: 39: UINT8 **inrows, **outrows; 9: 40: int num_changed_pixels = 0; -: 41: 9: 42: if (!PyArg_ParseTuple(args, "Onn", &py_lut, &i0, &i1)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 43: PyErr_SetString(PyExc_RuntimeError, "Argument parsing problem"); call 0 never executed #####: 44: return NULL; -: 45: } -: 46: 9: 47: if (!PyBytes_Check(py_lut)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 48: PyErr_SetString(PyExc_RuntimeError, "The morphology LUT is not a bytes object"); call 0 never executed #####: 49: return NULL; -: 50: } -: 51: 9: 52: lut_len = PyBytes_Size(py_lut); call 0 returned 100% -: 53: 9: 54: if (lut_len < LUT_SIZE) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 55: PyErr_SetString(PyExc_RuntimeError, "The morphology LUT has the wrong size"); call 0 never executed #####: 56: return NULL; -: 57: } -: 58: 9: 59: lut = PyBytes_AsString(py_lut); call 0 returned 100% -: 60: 9: 61: imgin = (Imaging) i0; 9: 62: imgout = (Imaging) i1; 9: 63: width = imgin->xsize; 9: 64: height = imgin->ysize; -: 65: 18: 66: if (imgin->type != IMAGING_TYPE_UINT8 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 11% (fallthrough) branch 3 taken 89% 9: 67: imgin->bands != 1) { 1: 68: PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); call 0 returned 100% 1: 69: return NULL; -: 70: } 16: 71: if (imgout->type != IMAGING_TYPE_UINT8 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 13% (fallthrough) branch 3 taken 88% 8: 72: imgout->bands != 1) { 1: 73: PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); call 0 returned 100% 1: 74: return NULL; -: 75: } -: 76: 7: 77: inrows = imgin->image8; 7: 78: outrows = imgout->image8; -: 79: 56: 80: for (row_idx=0; row_idx < height; row_idx++) { branch 0 taken 88% branch 1 taken 13% (fallthrough) 49: 81: UINT8 *outrow = outrows[row_idx]; 49: 82: UINT8 *inrow = inrows[row_idx]; -: 83: UINT8 *prow, *nrow; /* Previous and next row */ -: 84: -: 85: /* zero boundary conditions. TBD support other modes */ 49: 86: outrow[0] = outrow[width-1] = 0; 49: 87: if (row_idx==0 || row_idx == height-1) { branch 0 taken 86% (fallthrough) branch 1 taken 14% branch 2 taken 17% (fallthrough) branch 3 taken 83% 98: 88: for(col_idx=0; col_idxtype != IMAGING_TYPE_UINT8 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 33% (fallthrough) branch 3 taken 67% 3: 171: imgin->bands != 1) { 1: 172: PyErr_SetString(PyExc_RuntimeError, "Unsupported image type"); call 0 returned 100% 1: 173: return NULL; -: 174: } -: 175: 2: 176: inrows = imgin->image8; 2: 177: width = imgin->xsize; 2: 178: height = imgin->ysize; -: 179: 15: 180: for (row_idx=1; row_idx < height-1; row_idx++) { branch 0 taken 87% branch 1 taken 13% (fallthrough) 13: 181: UINT8 *inrow = inrows[row_idx]; -: 182: UINT8 *prow, *nrow; -: 183: 13: 184: prow = inrows[row_idx-1]; 13: 185: nrow = inrows[row_idx+1]; -: 186: 115: 187: for (col_idx=1; col_idximage8; 1: 242: width = img->xsize; 1: 243: height = img->ysize; -: 244: 8: 245: for (row_idx=0; row_idx < height; row_idx++) { branch 0 taken 88% branch 1 taken 13% (fallthrough) 7: 246: UINT8 *row = rows[row_idx]; 56: 247: for (col_idx=0; col_idx /* write */ -: 33:#endif -: 34: -: 35:/* -------------------------------------------------------------------- */ -: 36:/* Common */ -: 37:/* -------------------------------------------------------------------- */ -: 38: -: 39:typedef struct { -: 40: PyObject_HEAD -: 41: int (*encode)(Imaging im, ImagingCodecState state, -: 42: UINT8* buffer, int bytes); -: 43: int (*cleanup)(ImagingCodecState state); -: 44: struct ImagingCodecStateInstance state; -: 45: Imaging im; -: 46: PyObject* lock; -: 47: int pushes_fd; -: 48:} ImagingEncoderObject; -: 49: -: 50:static PyTypeObject ImagingEncoderType; -: 51: -: 52:static ImagingEncoderObject* function PyImaging_EncoderNew called 3705 returned 100% blocks executed 67% 3705: 53:PyImaging_EncoderNew(int contextsize) -: 54:{ -: 55: ImagingEncoderObject *encoder; -: 56: void *context; -: 57: 3705: 58: if(PyType_Ready(&ImagingEncoderType) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 59: return NULL; -: 60: } -: 61: 3705: 62: encoder = PyObject_New(ImagingEncoderObject, &ImagingEncoderType); call 0 returned 100% 3705: 63: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 64: return NULL; -: 65: } -: 66: -: 67: /* Clear the encoder state */ 7410: 68: memset(&encoder->state, 0, sizeof(encoder->state)); -: 69: -: 70: /* Allocate encoder context */ 3705: 71: if (contextsize > 0) { branch 0 taken 11% (fallthrough) branch 1 taken 89% 410: 72: context = (void*) calloc(1, contextsize); 410: 73: if (!context) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 74: Py_DECREF(encoder); branch 0 never executed branch 1 never executed call 2 never executed #####: 75: (void) PyErr_NoMemory(); call 0 never executed #####: 76: return NULL; -: 77: } -: 78: } else { -: 79: context = 0; -: 80: } -: 81: -: 82: /* Initialize encoder context */ 3705: 83: encoder->state.context = context; -: 84: -: 85: /* Most encoders don't need this */ 3705: 86: encoder->cleanup = NULL; -: 87: -: 88: /* Target image */ 3705: 89: encoder->lock = NULL; 3705: 90: encoder->im = NULL; 3705: 91: encoder->pushes_fd = 0; -: 92: 3705: 93: return encoder; -: 94:} -: 95: -: 96:static void function _dealloc called 3705 returned 100% blocks executed 80% 3705: 97:_dealloc(ImagingEncoderObject* encoder) -: 98:{ 3705: 99: if (encoder->cleanup) { branch 0 taken 4% (fallthrough) branch 1 taken 96% 146: 100: encoder->cleanup(&encoder->state); call 0 returned 100% -: 101: } 3705: 102: free(encoder->state.buffer); 3705: 103: free(encoder->state.context); 3705: 104: Py_XDECREF(encoder->lock); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 0% (fallthrough) branch 3 taken 100% call 4 never executed 3705: 105: Py_XDECREF(encoder->state.fd); branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 0% (fallthrough) branch 3 taken 100% call 4 never executed 3705: 106: PyObject_Del(encoder); call 0 returned 100% 3705: 107:} -: 108: -: 109:static PyObject* function _encode_cleanup called 560 returned 100% blocks executed 100% 560: 110:_encode_cleanup(ImagingEncoderObject* encoder, PyObject* args) -: 111:{ 560: 112: int status = 0; -: 113: 560: 114: if (encoder->cleanup){ branch 0 taken 26% (fallthrough) branch 1 taken 74% 144: 115: status = encoder->cleanup(&encoder->state); call 0 returned 100% -: 116: } -: 117: 560: 118: return Py_BuildValue("i", status); call 0 returned 100% -: 119:} -: 120: -: 121:static PyObject* function _encode called 12992 returned 100% blocks executed 92% 12992: 122:_encode(ImagingEncoderObject* encoder, PyObject* args) -: 123:{ -: 124: PyObject* buf; -: 125: PyObject* result; -: 126: int status; -: 127: -: 128: /* Encode to a Python string (allocated by this method) */ -: 129: 12992: 130: Py_ssize_t bufsize = 16384; -: 131: 12992: 132: if (!PyArg_ParseTuple(args, "|n", &bufsize)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 133: return NULL; -: 134: } -: 135: 12992: 136: buf = PyBytes_FromStringAndSize(NULL, bufsize); call 0 returned 100% 12992: 137: if (!buf) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 138: return NULL; -: 139: } -: 140: 25984: 141: status = encoder->encode(encoder->im, &encoder->state, call 0 returned 100% 12992: 142: (UINT8*) PyBytes_AsString(buf), bufsize); call 0 returned 100% -: 143: -: 144: /* adjust string length to avoid slicing in encoder */ 12992: 145: if (_PyBytes_Resize(&buf, (status > 0) ? status : 0) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 146: return NULL; -: 147: } -: 148: 12992: 149: result = Py_BuildValue("iiO", status, encoder->state.errcode, buf); call 0 returned 100% -: 150: 12992: 151: Py_DECREF(buf); /* must release buffer!!! */ branch 0 taken 0% (fallthrough) branch 1 taken 100% call 2 never executed -: 152: -: 153: return result; -: 154:} -: 155: -: 156:static PyObject* function _encode_to_pyfd called 14 returned 100% blocks executed 71% 14: 157:_encode_to_pyfd(ImagingEncoderObject* encoder, PyObject* args) -: 158:{ -: 159: -: 160: PyObject *result; -: 161: int status; -: 162: 14: 163: if (!encoder->pushes_fd) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 164: // UNDONE, appropriate errcode??? #####: 165: result = Py_BuildValue("ii", 0, IMAGING_CODEC_CONFIG);; call 0 never executed #####: 166: return result; -: 167: } -: 168: 14: 169: status = encoder->encode(encoder->im, &encoder->state, call 0 returned 100% -: 170: (UINT8*) NULL, 0); -: 171: 14: 172: result = Py_BuildValue("ii", status, encoder->state.errcode); call 0 returned 100% -: 173: 14: 174: return result; -: 175:} -: 176: -: 177:static PyObject* function _encode_to_file called 237 returned 100% blocks executed 81% 237: 178:_encode_to_file(ImagingEncoderObject* encoder, PyObject* args) -: 179:{ -: 180: UINT8* buf; -: 181: int status; -: 182: ImagingSectionCookie cookie; -: 183: -: 184: /* Encode to a file handle */ -: 185: -: 186: Py_ssize_t fh; 237: 187: Py_ssize_t bufsize = 16384; -: 188: 237: 189: if (!PyArg_ParseTuple(args, "n|n", &fh, &bufsize)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 190: return NULL; -: 191: } -: 192: -: 193: /* Allocate an encoder buffer */ -: 194: /* malloc check ok, either constant int, or checked by PyArg_ParseTuple */ 237: 195: buf = (UINT8*) malloc(bufsize); 237: 196: if (!buf) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 197: return PyErr_NoMemory(); call 0 never executed -: 198: } -: 199: 237: 200: ImagingSectionEnter(&cookie); call 0 returned 100% -: 201: -: 202: do { -: 203: -: 204: /* This replaces the inner loop in the ImageFile _save -: 205: function. */ -: 206: 324: 207: status = encoder->encode(encoder->im, &encoder->state, buf, bufsize); call 0 returned 100% -: 208: 324: 209: if (status > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 324: 210: if (write(fh, buf, status) < 0) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 211: ImagingSectionLeave(&cookie); call 0 never executed #####: 212: free(buf); #####: 213: return PyErr_SetFromErrno(PyExc_OSError); call 0 never executed -: 214: } -: 215: } -: 216: 324: 217: } while (encoder->state.errcode == 0); branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 218: 237: 219: ImagingSectionLeave(&cookie); call 0 returned 100% -: 220: 237: 221: free(buf); -: 222: 237: 223: return Py_BuildValue("i", encoder->state.errcode); call 0 returned 100% -: 224:} -: 225: -: 226:extern Imaging PyImaging_AsImaging(PyObject *op); -: 227: -: 228:static PyObject* function _setimage called 3704 returned 100% blocks executed 75% 3704: 229:_setimage(ImagingEncoderObject* encoder, PyObject* args) -: 230:{ -: 231: PyObject* op; -: 232: Imaging im; -: 233: ImagingCodecState state; -: 234: Py_ssize_t x0, y0, x1, y1; -: 235: -: 236: /* Define where image data should be stored */ -: 237: 3704: 238: x0 = y0 = x1 = y1 = 0; -: 239: -: 240: /* FIXME: should publish the ImagingType descriptor */ 3704: 241: if (!PyArg_ParseTuple(args, "O|(nnnn)", &op, &x0, &y0, &x1, &y1)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 242: return NULL; -: 243: } 3704: 244: im = PyImaging_AsImaging(op); call 0 returned 100% 3704: 245: if (!im) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 246: return NULL; -: 247: } -: 248: 3704: 249: encoder->im = im; -: 250: 3704: 251: state = &encoder->state; -: 252: 3704: 253: if (x0 == 0 && x1 == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 85% (fallthrough) branch 3 taken 15% 3143: 254: state->xsize = im->xsize; 3143: 255: state->ysize = im->ysize; -: 256: } else { 561: 257: state->xoff = x0; 561: 258: state->yoff = y0; 561: 259: state->xsize = x1 - x0; 561: 260: state->ysize = y1 - y0; -: 261: } -: 262: 7408: 263: if (state->xsize <= 0 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 7408: 264: state->xsize + state->xoff > im->xsize || branch 0 taken 100% (fallthrough) branch 1 taken 0% 7408: 265: state->ysize <= 0 || branch 0 taken 0% (fallthrough) branch 1 taken 100% 3704: 266: state->ysize + state->yoff > im->ysize) { #####: 267: PyErr_SetString(PyExc_SystemError, "tile cannot extend outside image"); call 0 never executed #####: 268: return NULL; -: 269: } -: 270: -: 271: /* Allocate memory buffer (if bits field is set) */ 3704: 272: if (state->bits > 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 3670: 273: if (state->xsize > ((INT_MAX / state->bits)-7)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 274: return PyErr_NoMemory(); call 0 never executed -: 275: } 3670: 276: state->bytes = (state->bits * state->xsize+7)/8; -: 277: /* malloc check ok, overflow checked above */ 3670: 278: state->buffer = (UINT8*) malloc(state->bytes); 3670: 279: if (!state->buffer) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 280: return PyErr_NoMemory(); call 0 never executed -: 281: } -: 282: } -: 283: -: 284: /* Keep a reference to the image object, to make sure it doesn't -: 285: go away before we do */ 3704: 286: Py_INCREF(op); 3704: 287: Py_XDECREF(encoder->lock); branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed call 4 never executed 3704: 288: encoder->lock = op; -: 289: 3704: 290: Py_INCREF(Py_None); 3704: 291: return Py_None; -: 292:} -: 293: -: 294:static PyObject* function _setfd called 14 returned 100% blocks executed 100% 14: 295:_setfd(ImagingEncoderObject* encoder, PyObject* args) -: 296:{ -: 297: PyObject* fd; -: 298: ImagingCodecState state; -: 299: 14: 300: if (!PyArg_ParseTuple(args, "O", &fd)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 301: return NULL; -: 302: } -: 303: 14: 304: state = &encoder->state; -: 305: 14: 306: Py_XINCREF(fd); branch 0 taken 100% (fallthrough) branch 1 taken 0% 14: 307: state->fd = fd; -: 308: 14: 309: Py_INCREF(Py_None); 14: 310: return Py_None; -: 311:} -: 312: -: 313:static PyObject * function _get_pushes_fd called 561 returned 100% blocks executed 100% 561: 314:_get_pushes_fd(ImagingEncoderObject *encoder) -: 315:{ 561: 316: return PyBool_FromLong(encoder->pushes_fd); call 0 returned 100% -: 317:} -: 318: -: 319:static struct PyMethodDef methods[] = { -: 320: {"encode", (PyCFunction)_encode, 1}, -: 321: {"cleanup", (PyCFunction)_encode_cleanup, 1}, -: 322: {"encode_to_file", (PyCFunction)_encode_to_file, 1}, -: 323: {"encode_to_pyfd", (PyCFunction)_encode_to_pyfd, 1}, -: 324: {"setimage", (PyCFunction)_setimage, 1}, -: 325: {"setfd", (PyCFunction)_setfd, 1}, -: 326: {NULL, NULL} /* sentinel */ -: 327:}; -: 328: -: 329:static struct PyGetSetDef getseters[] = { -: 330: {"pushes_fd", (getter)_get_pushes_fd, NULL, -: 331: "True if this decoder expects to push directly to self.fd", -: 332: NULL}, -: 333: {NULL, NULL, NULL, NULL, NULL} /* sentinel */ -: 334:}; -: 335: -: 336:static PyTypeObject ImagingEncoderType = { -: 337: PyVarObject_HEAD_INIT(NULL, 0) -: 338: "ImagingEncoder", /*tp_name*/ -: 339: sizeof(ImagingEncoderObject), /*tp_size*/ -: 340: 0, /*tp_itemsize*/ -: 341: /* methods */ -: 342: (destructor)_dealloc, /*tp_dealloc*/ -: 343: 0, /*tp_print*/ -: 344: 0, /*tp_getattr*/ -: 345: 0, /*tp_setattr*/ -: 346: 0, /*tp_compare*/ -: 347: 0, /*tp_repr*/ -: 348: 0, /*tp_as_number */ -: 349: 0, /*tp_as_sequence */ -: 350: 0, /*tp_as_mapping */ -: 351: 0, /*tp_hash*/ -: 352: 0, /*tp_call*/ -: 353: 0, /*tp_str*/ -: 354: 0, /*tp_getattro*/ -: 355: 0, /*tp_setattro*/ -: 356: 0, /*tp_as_buffer*/ -: 357: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 358: 0, /*tp_doc*/ -: 359: 0, /*tp_traverse*/ -: 360: 0, /*tp_clear*/ -: 361: 0, /*tp_richcompare*/ -: 362: 0, /*tp_weaklistoffset*/ -: 363: 0, /*tp_iter*/ -: 364: 0, /*tp_iternext*/ -: 365: methods, /*tp_methods*/ -: 366: 0, /*tp_members*/ -: 367: getseters, /*tp_getset*/ -: 368:}; -: 369: -: 370:/* -------------------------------------------------------------------- */ -: 371: -: 372:int function get_packer called 3670 returned 100% blocks executed 50% 3670: 373:get_packer(ImagingEncoderObject* encoder, const char* mode, -: 374: const char* rawmode) -: 375:{ -: 376: int bits; -: 377: ImagingShuffler pack; -: 378: 3670: 379: pack = ImagingFindPacker(mode, rawmode, &bits); call 0 returned 100% 3670: 380: if (!pack) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 381: Py_DECREF(encoder); branch 0 never executed branch 1 never executed call 2 never executed #####: 382: PyErr_Format(PyExc_ValueError, "No packer found from %s to %s", mode, rawmode); call 0 never executed #####: 383: return -1; -: 384: } -: 385: 3670: 386: encoder->state.shuffle = pack; 3670: 387: encoder->state.bits = bits; -: 388: 3670: 389: return 0; -: 390:} -: 391: -: 392: -: 393:/* -------------------------------------------------------------------- */ -: 394:/* EPS */ -: 395:/* -------------------------------------------------------------------- */ -: 396: -: 397:PyObject* function PyImaging_EpsEncoderNew called 20 returned 100% blocks executed 100% 20: 398:PyImaging_EpsEncoderNew(PyObject* self, PyObject* args) -: 399:{ -: 400: ImagingEncoderObject* encoder; -: 401: 20: 402: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 20: 403: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 404: return NULL; -: 405: } -: 406: 20: 407: encoder->encode = ImagingEpsEncode; -: 408: 20: 409: return (PyObject*) encoder; -: 410:} -: 411: -: 412: -: 413:/* -------------------------------------------------------------------- */ -: 414:/* GIF */ -: 415:/* -------------------------------------------------------------------- */ -: 416: -: 417:PyObject* function PyImaging_GifEncoderNew called 107 returned 100% blocks executed 100% 107: 418:PyImaging_GifEncoderNew(PyObject* self, PyObject* args) -: 419:{ -: 420: ImagingEncoderObject* encoder; -: 421: -: 422: char *mode; -: 423: char *rawmode; 107: 424: Py_ssize_t bits = 8; 107: 425: Py_ssize_t interlace = 0; 107: 426: if (!PyArg_ParseTuple(args, "ss|nn", &mode, &rawmode, &bits, &interlace)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 427: return NULL; -: 428: } -: 429: 107: 430: encoder = PyImaging_EncoderNew(sizeof(GIFENCODERSTATE)); call 0 returned 100% 107: 431: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 432: return NULL; -: 433: } -: 434: 107: 435: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 436: return NULL; -: 437: } -: 438: 107: 439: encoder->encode = ImagingGifEncode; -: 440: 107: 441: ((GIFENCODERSTATE*)encoder->state.context)->bits = bits; 107: 442: ((GIFENCODERSTATE*)encoder->state.context)->interlace = interlace; -: 443: 107: 444: return (PyObject*) encoder; -: 445:} -: 446: -: 447: -: 448:/* -------------------------------------------------------------------- */ -: 449:/* PCX */ -: 450:/* -------------------------------------------------------------------- */ -: 451: -: 452:PyObject* function PyImaging_PcxEncoderNew called 17 returned 100% blocks executed 100% 17: 453:PyImaging_PcxEncoderNew(PyObject* self, PyObject* args) -: 454:{ -: 455: ImagingEncoderObject* encoder; -: 456: -: 457: char *mode; -: 458: char *rawmode; 17: 459: Py_ssize_t bits = 8; -: 460: 17: 461: if (!PyArg_ParseTuple(args, "ss|n", &mode, &rawmode, &bits)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 462: return NULL; -: 463: } -: 464: 17: 465: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 17: 466: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 467: return NULL; -: 468: } -: 469: 17: 470: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 471: return NULL; -: 472: } -: 473: 17: 474: encoder->encode = ImagingPcxEncode; -: 475: 17: 476: return (PyObject*) encoder; -: 477:} -: 478: -: 479: -: 480:/* -------------------------------------------------------------------- */ -: 481:/* RAW */ -: 482:/* -------------------------------------------------------------------- */ -: 483: -: 484:PyObject* function PyImaging_RawEncoderNew called 3234 returned 100% blocks executed 100% 3234: 485:PyImaging_RawEncoderNew(PyObject* self, PyObject* args) -: 486:{ -: 487: ImagingEncoderObject* encoder; -: 488: -: 489: char *mode; -: 490: char *rawmode; 3234: 491: Py_ssize_t stride = 0; 3234: 492: Py_ssize_t ystep = 1; -: 493: 3234: 494: if (!PyArg_ParseTuple(args, "ss|nn", &mode, &rawmode, &stride, &ystep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 495: return NULL; -: 496: } -: 497: 3234: 498: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 3234: 499: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 500: return NULL; -: 501: } -: 502: 3234: 503: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 504: return NULL; -: 505: } -: 506: 3234: 507: encoder->encode = ImagingRawEncode; -: 508: 3234: 509: encoder->state.ystep = ystep; 3234: 510: encoder->state.count = stride; -: 511: 3234: 512: return (PyObject*) encoder; -: 513:} -: 514: -: 515: -: 516:/* -------------------------------------------------------------------- */ -: 517:/* TGA */ -: 518:/* -------------------------------------------------------------------- */ -: 519: -: 520:PyObject* function PyImaging_TgaRleEncoderNew called 20 returned 100% blocks executed 100% 20: 521:PyImaging_TgaRleEncoderNew(PyObject* self, PyObject* args) -: 522:{ -: 523: ImagingEncoderObject* encoder; -: 524: -: 525: char *mode; -: 526: char *rawmode; 20: 527: Py_ssize_t ystep = 1; -: 528: 20: 529: if (!PyArg_ParseTuple(args, "ss|n", &mode, &rawmode, &ystep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 530: return NULL; -: 531: } -: 532: 20: 533: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 20: 534: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 535: return NULL; -: 536: } -: 537: 20: 538: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 539: return NULL; -: 540: } -: 541: 20: 542: encoder->encode = ImagingTgaRleEncode; -: 543: 20: 544: encoder->state.ystep = ystep; -: 545: 20: 546: return (PyObject*) encoder; -: 547:} -: 548: -: 549: -: 550: -: 551:/* -------------------------------------------------------------------- */ -: 552:/* XBM */ -: 553:/* -------------------------------------------------------------------- */ -: 554: -: 555:PyObject* function PyImaging_XbmEncoderNew called 4 returned 100% blocks executed 100% 4: 556:PyImaging_XbmEncoderNew(PyObject* self, PyObject* args) -: 557:{ -: 558: ImagingEncoderObject* encoder; -: 559: 4: 560: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 4: 561: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 562: return NULL; -: 563: } -: 564: 4: 565: if (get_packer(encoder, "1", "1;R") < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 566: return NULL; -: 567: } -: 568: 4: 569: encoder->encode = ImagingXbmEncode; -: 570: 4: 571: return (PyObject*) encoder; -: 572:} -: 573: -: 574: -: 575:/* -------------------------------------------------------------------- */ -: 576:/* ZIP */ -: 577:/* -------------------------------------------------------------------- */ -: 578: -: 579:#ifdef HAVE_LIBZ -: 580: -: 581:#include "libImaging/ZipCodecs.h" -: 582: -: 583:PyObject* function PyImaging_ZipEncoderNew called 131 returned 100% blocks executed 72% 131: 584:PyImaging_ZipEncoderNew(PyObject* self, PyObject* args) -: 585:{ -: 586: ImagingEncoderObject* encoder; -: 587: -: 588: char* mode; -: 589: char* rawmode; 131: 590: Py_ssize_t optimize = 0; 131: 591: Py_ssize_t compress_level = -1; 131: 592: Py_ssize_t compress_type = -1; 131: 593: char* dictionary = NULL; 131: 594: Py_ssize_t dictionary_size = 0; 131: 595: if (!PyArg_ParseTuple(args, "ss|nnny#", &mode, &rawmode, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 596: &optimize, -: 597: &compress_level, &compress_type, -: 598: &dictionary, &dictionary_size)) { -: 599: return NULL; -: 600: } -: 601: -: 602: /* Copy to avoid referencing Python's memory */ 131: 603: if (dictionary && dictionary_size > 0) { branch 0 taken 76% (fallthrough) branch 1 taken 24% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 604: /* malloc check ok, size comes from PyArg_ParseTuple */ #####: 605: char* p = malloc(dictionary_size); #####: 606: if (!p) { branch 0 never executed branch 1 never executed #####: 607: return PyErr_NoMemory(); call 0 never executed -: 608: } #####: 609: memcpy(p, dictionary, dictionary_size); #####: 610: dictionary = p; -: 611: } else { 131: 612: dictionary = NULL; -: 613: } -: 614: 131: 615: encoder = PyImaging_EncoderNew(sizeof(ZIPSTATE)); call 0 returned 100% 131: 616: if (encoder == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 617: free(dictionary); #####: 618: return NULL; -: 619: } -: 620: 131: 621: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 622: free(dictionary); #####: 623: return NULL; -: 624: } -: 625: 131: 626: encoder->encode = ImagingZipEncode; 131: 627: encoder->cleanup = ImagingZipEncodeCleanup; -: 628: 131: 629: if (rawmode[0] == 'P') { branch 0 taken 9% (fallthrough) branch 1 taken 91% -: 630: /* disable filtering */ 12: 631: ((ZIPSTATE*)encoder->state.context)->mode = ZIP_PNG_PALETTE; -: 632: } -: 633: 131: 634: ((ZIPSTATE*)encoder->state.context)->optimize = optimize; 131: 635: ((ZIPSTATE*)encoder->state.context)->compress_level = compress_level; 131: 636: ((ZIPSTATE*)encoder->state.context)->compress_type = compress_type; 131: 637: ((ZIPSTATE*)encoder->state.context)->dictionary = dictionary; 131: 638: ((ZIPSTATE*)encoder->state.context)->dictionary_size = dictionary_size; -: 639: 131: 640: return (PyObject*) encoder; -: 641:} -: 642:#endif -: 643: -: 644: -: 645:/* -------------------------------------------------------------------- */ -: 646:/* LibTiff */ -: 647:/* -------------------------------------------------------------------- */ -: 648: -: 649:#ifdef HAVE_LIBTIFF -: 650: -: 651:#include "libImaging/TiffDecode.h" -: 652: -: 653:#include -: 654: -: 655:PyObject* -: 656:PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) -: 657:{ -: 658: ImagingEncoderObject* encoder; -: 659: -: 660: char* mode; -: 661: char* rawmode; -: 662: char* compname; -: 663: char* filename; -: 664: Py_ssize_t fp; -: 665: -: 666: PyObject *tags, *types; -: 667: PyObject *key, *value; -: 668: Py_ssize_t pos = 0; -: 669: int key_int, status, is_core_tag, is_var_length, num_core_tags, i; -: 670: TIFFDataType type = TIFF_NOTYPE; -: 671: // This list also exists in TiffTags.py -: 672: const int core_tags[] = { -: 673: 256, 257, 258, 259, 262, 263, 266, 269, 274, 277, 278, 280, 281, 340, -: 674: 341, 282, 283, 284, 286, 287, 296, 297, 320, 321, 338, 32995, 32998, 32996, -: 675: 339, 32997, 330, 531, 530, 65537 -: 676: }; -: 677: -: 678: Py_ssize_t tags_size; -: 679: PyObject *item; -: 680: -: 681: if (! PyArg_ParseTuple(args, "sssnsOO", &mode, &rawmode, &compname, &fp, &filename, &tags, &types)) { -: 682: return NULL; -: 683: } -: 684: -: 685: if (!PyList_Check(tags)) { -: 686: PyErr_SetString(PyExc_ValueError, "Invalid tags list"); -: 687: return NULL; -: 688: } else { -: 689: tags_size = PyList_Size(tags); -: 690: TRACE(("tags size: %d\n", (int)tags_size)); -: 691: for (pos=0;posstate, filename, fp)) { -: 717: Py_DECREF(encoder); -: 718: PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed"); -: 719: return NULL; -: 720: } -: 721: -: 722: num_core_tags = sizeof(core_tags) / sizeof(int); -: 723: for (pos = 0; pos < tags_size; pos++) { -: 724: item = PyList_GetItem(tags, pos); -: 725: // We already checked that tags is a 2-tuple list. -: 726: key = PyTuple_GetItem(item, 0); -: 727: key_int = (int)PyLong_AsLong(key); -: 728: value = PyTuple_GetItem(item, 1); -: 729: status = 0; -: 730: is_core_tag = 0; -: 731: is_var_length = 0; -: 732: type = TIFF_NOTYPE; -: 733: -: 734: for (i=0; i= TIFF_BYTE && type_int <= TIFF_DOUBLE) { -: 746: type = (TIFFDataType)type_int; -: 747: } -: 748: } -: 749: } -: 750: -: 751: -: 752: if (type == TIFF_NOTYPE) { -: 753: // Autodetect type. Types should not be changed for backwards -: 754: // compatibility. -: 755: if (PyLong_Check(value)) { -: 756: type = TIFF_LONG; -: 757: } else if (PyFloat_Check(value)) { -: 758: type = TIFF_DOUBLE; -: 759: } else if (PyBytes_Check(value)) { -: 760: type = TIFF_ASCII; -: 761: } -: 762: } -: 763: -: 764: if (PyTuple_Check(value)) { -: 765: Py_ssize_t len; -: 766: len = PyTuple_Size(value); -: 767: -: 768: is_var_length = 1; -: 769: -: 770: if (!len) { -: 771: continue; -: 772: } -: 773: -: 774: if (type == TIFF_NOTYPE) { -: 775: // Autodetect type based on first item. Types should not be -: 776: // changed for backwards compatibility. -: 777: if (PyLong_Check(PyTuple_GetItem(value,0))) { -: 778: type = TIFF_LONG; -: 779: } else if (PyFloat_Check(PyTuple_GetItem(value,0))) { -: 780: type = TIFF_FLOAT; -: 781: } -: 782: } -: 783: } -: 784: -: 785: if (!is_core_tag) { -: 786: // Register field for non core tags. -: 787: if (type == TIFF_BYTE) { -: 788: is_var_length = 1; -: 789: } -: 790: if (ImagingLibTiffMergeFieldInfo(&encoder->state, type, key_int, is_var_length)) { -: 791: continue; -: 792: } -: 793: } -: 794: -: 795: if (type == TIFF_BYTE || type == TIFF_UNDEFINED) { -: 796: status = ImagingLibTiffSetField(&encoder->state, -: 797: (ttag_t) key_int, -: 798: PyBytes_Size(value), PyBytes_AsString(value)); -: 799: } else if (is_var_length) { -: 800: Py_ssize_t len,i; -: 801: TRACE(("Setting from Tuple: %d \n", key_int)); -: 802: len = PyTuple_Size(value); -: 803: -: 804: if (key_int == TIFFTAG_COLORMAP) { -: 805: int stride = 256; -: 806: if (len != 768) { -: 807: PyErr_SetString(PyExc_ValueError, "Requiring 768 items for for Colormap"); -: 808: return NULL; -: 809: } -: 810: UINT16 *av; -: 811: /* malloc check ok, calloc checks for overflow */ -: 812: av = calloc(len, sizeof(UINT16)); -: 813: if (av) { -: 814: for (i=0;istate, (ttag_t) key_int, -: 818: av, -: 819: av + stride, -: 820: av + stride * 2); -: 821: free(av); -: 822: } -: 823: } else if (type == TIFF_SHORT) { -: 824: UINT16 *av; -: 825: /* malloc check ok, calloc checks for overflow */ -: 826: av = calloc(len, sizeof(UINT16)); -: 827: if (av) { -: 828: for (i=0;istate, (ttag_t) key_int, len, av); -: 832: free(av); -: 833: } -: 834: } else if (type == TIFF_LONG) { -: 835: UINT32 *av; -: 836: /* malloc check ok, calloc checks for overflow */ -: 837: av = calloc(len, sizeof(UINT32)); -: 838: if (av) { -: 839: for (i=0;istate, (ttag_t) key_int, len, av); -: 843: free(av); -: 844: } -: 845: } else if (type == TIFF_SBYTE) { -: 846: INT8 *av; -: 847: /* malloc check ok, calloc checks for overflow */ -: 848: av = calloc(len, sizeof(INT8)); -: 849: if (av) { -: 850: for (i=0;istate, (ttag_t) key_int, len, av); -: 854: free(av); -: 855: } -: 856: } else if (type == TIFF_SSHORT) { -: 857: INT16 *av; -: 858: /* malloc check ok, calloc checks for overflow */ -: 859: av = calloc(len, sizeof(INT16)); -: 860: if (av) { -: 861: for (i=0;istate, (ttag_t) key_int, len, av); -: 865: free(av); -: 866: } -: 867: } else if (type == TIFF_SLONG) { -: 868: INT32 *av; -: 869: /* malloc check ok, calloc checks for overflow */ -: 870: av = calloc(len, sizeof(INT32)); -: 871: if (av) { -: 872: for (i=0;istate, (ttag_t) key_int, len, av); -: 876: free(av); -: 877: } -: 878: } else if (type == TIFF_FLOAT) { -: 879: FLOAT32 *av; -: 880: /* malloc check ok, calloc checks for overflow */ -: 881: av = calloc(len, sizeof(FLOAT32)); -: 882: if (av) { -: 883: for (i=0;istate, (ttag_t) key_int, len, av); -: 887: free(av); -: 888: } -: 889: } else if (type == TIFF_DOUBLE) { -: 890: FLOAT64 *av; -: 891: /* malloc check ok, calloc checks for overflow */ -: 892: av = calloc(len, sizeof(FLOAT64)); -: 893: if (av) { -: 894: for (i=0;istate, (ttag_t) key_int, len, av); -: 898: free(av); -: 899: } -: 900: } -: 901: } else { -: 902: if (type == TIFF_SHORT) { -: 903: status = ImagingLibTiffSetField(&encoder->state, -: 904: (ttag_t) key_int, -: 905: (UINT16)PyLong_AsLong(value)); -: 906: } else if (type == TIFF_LONG) { -: 907: status = ImagingLibTiffSetField(&encoder->state, -: 908: (ttag_t) key_int, -: 909: (UINT32)PyLong_AsLong(value)); -: 910: } else if (type == TIFF_SSHORT) { -: 911: status = ImagingLibTiffSetField(&encoder->state, -: 912: (ttag_t) key_int, -: 913: (INT16)PyLong_AsLong(value)); -: 914: } else if (type == TIFF_SLONG) { -: 915: status = ImagingLibTiffSetField(&encoder->state, -: 916: (ttag_t) key_int, -: 917: (INT32)PyLong_AsLong(value)); -: 918: } else if (type == TIFF_FLOAT) { -: 919: status = ImagingLibTiffSetField(&encoder->state, -: 920: (ttag_t) key_int, -: 921: (FLOAT32)PyFloat_AsDouble(value)); -: 922: } else if (type == TIFF_DOUBLE) { -: 923: status = ImagingLibTiffSetField(&encoder->state, -: 924: (ttag_t) key_int, -: 925: (FLOAT64)PyFloat_AsDouble(value)); -: 926: } else if (type == TIFF_SBYTE) { -: 927: status = ImagingLibTiffSetField(&encoder->state, -: 928: (ttag_t) key_int, -: 929: (INT8)PyLong_AsLong(value)); -: 930: } else if (type == TIFF_ASCII) { -: 931: status = ImagingLibTiffSetField(&encoder->state, -: 932: (ttag_t) key_int, -: 933: PyBytes_AsString(value)); -: 934: } else if (type == TIFF_RATIONAL) { -: 935: status = ImagingLibTiffSetField(&encoder->state, -: 936: (ttag_t) key_int, -: 937: (FLOAT64)PyFloat_AsDouble(value)); -: 938: } else { -: 939: TRACE(("Unhandled type for key %d : %s \n", -: 940: key_int, -: 941: PyBytes_AsString(PyObject_Str(value)))); -: 942: } -: 943: } -: 944: if (!status) { -: 945: TRACE(("Error setting Field\n")); -: 946: Py_DECREF(encoder); -: 947: PyErr_SetString(PyExc_RuntimeError, "Error setting from dictionary"); -: 948: return NULL; -: 949: } -: 950: } -: 951: -: 952: encoder->encode = ImagingLibTiffEncode; -: 953: -: 954: return (PyObject*) encoder; -: 955:} -: 956: -: 957:#endif -: 958: -: 959:/* -------------------------------------------------------------------- */ -: 960:/* JPEG */ -: 961:/* -------------------------------------------------------------------- */ -: 962: -: 963:#ifdef HAVE_LIBJPEG -: 964: -: 965:/* We better define this encoder last in this file, so the following -: 966: undef's won't mess things up for the Imaging library proper. */ -: 967: -: 968:#undef HAVE_PROTOTYPES -: 969:#undef HAVE_STDDEF_H -: 970:#undef HAVE_STDLIB_H -: 971:#undef UINT8 -: 972:#undef UINT16 -: 973:#undef UINT32 -: 974:#undef INT8 -: 975:#undef INT16 -: 976:#undef INT32 -: 977: -: 978:#include "libImaging/Jpeg.h" -: 979: function get_qtables_arrays called 157 returned 100% blocks executed 63% 157: 980:static unsigned int* get_qtables_arrays(PyObject* qtables, int* qtablesLen) { -: 981: PyObject* tables; -: 982: PyObject* table; -: 983: PyObject* table_data; -: 984: int i, j, num_tables; -: 985: unsigned int *qarrays; -: 986: 157: 987: if ((qtables == NULL) || (qtables == Py_None)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 20% (fallthrough) branch 3 taken 80% -: 988: return NULL; -: 989: } -: 990: 32: 991: if (!PySequence_Check(qtables)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 992: PyErr_SetString(PyExc_ValueError, "Invalid quantization tables"); call 0 never executed #####: 993: return NULL; -: 994: } -: 995: 32: 996: tables = PySequence_Fast(qtables, "expected a sequence"); call 0 returned 100% 32: 997: num_tables = PySequence_Size(qtables); call 0 returned 100% 32: 998: if (num_tables < 1 || num_tables > NUM_QUANT_TBLS) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 999: PyErr_SetString(PyExc_ValueError, call 0 never executed -: 1000: "Not a valid number of quantization tables. Should be between 1 and 4."); #####: 1001: Py_DECREF(tables); branch 0 never executed branch 1 never executed call 2 never executed -: 1002: return NULL; -: 1003: } -: 1004: /* malloc check ok, num_tables <4, DCTSIZE2 == 64 from jpeglib.h */ 32: 1005: qarrays = (unsigned int*) malloc(num_tables * DCTSIZE2 * sizeof(unsigned int)); 32: 1006: if (!qarrays) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 1007: Py_DECREF(tables); branch 0 never executed branch 1 never executed call 2 never executed #####: 1008: PyErr_NoMemory(); call 0 never executed #####: 1009: return NULL; -: 1010: } 63: 1011: for (i = 0; i < num_tables; i++) { branch 0 taken 66% branch 1 taken 34% (fallthrough) 63: 1012: table = PySequence_Fast_GET_ITEM(tables, i); branch 0 taken 100% (fallthrough) branch 1 taken 0% 63: 1013: if (!PySequence_Check(table)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1014: PyErr_SetString(PyExc_ValueError, "Invalid quantization tables"); call 0 never executed #####: 1015: goto JPEG_QTABLES_ERR; -: 1016: } 63: 1017: if (PySequence_Size(table) != DCTSIZE2) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1018: PyErr_SetString(PyExc_ValueError, "Invalid quantization table size"); call 0 never executed #####: 1019: goto JPEG_QTABLES_ERR; -: 1020: } 63: 1021: table_data = PySequence_Fast(table, "expected a sequence"); 4095: 1022: for (j = 0; j < DCTSIZE2; j++) { call 0 returned 100% branch 1 taken 98% branch 2 taken 2% (fallthrough) 4032: 1023: qarrays[i * DCTSIZE2 + j] = PyLong_AS_LONG(PySequence_Fast_GET_ITEM(table_data, j)); branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% -: 1024: } 63: 1025: Py_DECREF(table_data); branch 0 taken 0% (fallthrough) branch 1 taken 100% call 2 never executed -: 1026: } -: 1027: 32: 1028: *qtablesLen = num_tables; -: 1029: -: 1030:JPEG_QTABLES_ERR: 32: 1031: Py_DECREF(tables); // Run on both error and not error branch 0 taken 0% (fallthrough) branch 1 taken 100% call 2 never executed 32: 1032: if (PyErr_Occurred()) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1033: free(qarrays); #####: 1034: qarrays = NULL; #####: 1035: return NULL; -: 1036: } -: 1037: -: 1038: return qarrays; -: 1039:} -: 1040: -: 1041:PyObject* function PyImaging_JpegEncoderNew called 158 returned 100% blocks executed 87% 158: 1042:PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) -: 1043:{ -: 1044: ImagingEncoderObject* encoder; -: 1045: -: 1046: char *mode; -: 1047: char *rawmode; 158: 1048: Py_ssize_t quality = 0; 158: 1049: Py_ssize_t progressive = 0; 158: 1050: Py_ssize_t smooth = 0; 158: 1051: Py_ssize_t optimize = 0; 158: 1052: Py_ssize_t streamtype = 0; /* 0=interchange, 1=tables only, 2=image only */ 158: 1053: Py_ssize_t xdpi = 0, ydpi = 0; 158: 1054: Py_ssize_t subsampling = -1; /* -1=default, 0=none, 1=medium, 2=high */ 158: 1055: PyObject* qtables=NULL; 158: 1056: unsigned int *qarrays = NULL; 158: 1057: int qtablesLen = 0; 158: 1058: char* extra = NULL; -: 1059: Py_ssize_t extra_size; 158: 1060: char* rawExif = NULL; 158: 1061: Py_ssize_t rawExifLen = 0; -: 1062: 158: 1063: if (!PyArg_ParseTuple(args, "ss|nnnnnnnnOy#y#", call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 1064: &mode, &rawmode, &quality, -: 1065: &progressive, &smooth, &optimize, &streamtype, -: 1066: &xdpi, &ydpi, &subsampling, &qtables, &extra, &extra_size, -: 1067: &rawExif, &rawExifLen)) { -: 1068: return NULL; -: 1069: } -: 1070: 157: 1071: encoder = PyImaging_EncoderNew(sizeof(JPEGENCODERSTATE)); call 0 returned 100% 157: 1072: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1073: return NULL; -: 1074: } -: 1075: -: 1076: // libjpeg-turbo supports different output formats. -: 1077: // We are choosing Pillow's native format (3 color bytes + 1 padding) -: 1078: // to avoid extra conversion in Pack.c. 157: 1079: if (ImagingJpegUseJCSExtensions() && strcmp(rawmode, "RGB") == 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 65% (fallthrough) branch 4 taken 35% branch 5 taken 100% (fallthrough) branch 6 taken 0% branch 7 taken 100% (fallthrough) branch 8 taken 0% branch 9 taken 65% (fallthrough) branch 10 taken 35% 102: 1080: rawmode = "RGBX"; -: 1081: } -: 1082: 157: 1083: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1084: return NULL; -: 1085: } -: 1086: -: 1087: // Freed in JpegEncode, Case 5 157: 1088: qarrays = get_qtables_arrays(qtables, &qtablesLen); call 0 returned 100% -: 1089: 169: 1090: if (extra && extra_size > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 8% (fallthrough) branch 3 taken 92% -: 1091: /* malloc check ok, length is from python parsearg */ 12: 1092: char* p = malloc(extra_size); // Freed in JpegEncode, Case 5 12: 1093: if (!p) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1094: return PyErr_NoMemory(); call 0 never executed -: 1095: } 24: 1096: memcpy(p, extra, extra_size); 12: 1097: extra = p; -: 1098: } else { 145: 1099: extra = NULL; -: 1100: } -: 1101: 162: 1102: if (rawExif && rawExifLen > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 3% (fallthrough) branch 3 taken 97% -: 1103: /* malloc check ok, length is from python parsearg */ 5: 1104: char* pp = malloc(rawExifLen); // Freed in JpegEncode, Case 5 5: 1105: if (!pp) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1106: if (extra) { branch 0 never executed branch 1 never executed #####: 1107: free(extra); -: 1108: } #####: 1109: return PyErr_NoMemory(); call 0 never executed -: 1110: } 10: 1111: memcpy(pp, rawExif, rawExifLen); 5: 1112: rawExif = pp; -: 1113: } else { 152: 1114: rawExif = NULL; -: 1115: } -: 1116: 157: 1117: encoder->encode = ImagingJpegEncode; -: 1118: 314: 1119: strncpy(((JPEGENCODERSTATE*)encoder->state.context)->rawmode, rawmode, 8); -: 1120: 157: 1121: ((JPEGENCODERSTATE*)encoder->state.context)->quality = quality; 157: 1122: ((JPEGENCODERSTATE*)encoder->state.context)->qtables = qarrays; 157: 1123: ((JPEGENCODERSTATE*)encoder->state.context)->qtablesLen = qtablesLen; 157: 1124: ((JPEGENCODERSTATE*)encoder->state.context)->subsampling = subsampling; 157: 1125: ((JPEGENCODERSTATE*)encoder->state.context)->progressive = progressive; 157: 1126: ((JPEGENCODERSTATE*)encoder->state.context)->smooth = smooth; 157: 1127: ((JPEGENCODERSTATE*)encoder->state.context)->optimize = optimize; 157: 1128: ((JPEGENCODERSTATE*)encoder->state.context)->streamtype = streamtype; 157: 1129: ((JPEGENCODERSTATE*)encoder->state.context)->xdpi = xdpi; 157: 1130: ((JPEGENCODERSTATE*)encoder->state.context)->ydpi = ydpi; 157: 1131: ((JPEGENCODERSTATE*)encoder->state.context)->extra = extra; 157: 1132: ((JPEGENCODERSTATE*)encoder->state.context)->extra_size = extra_size; 157: 1133: ((JPEGENCODERSTATE*)encoder->state.context)->rawExif = rawExif; 157: 1134: ((JPEGENCODERSTATE*)encoder->state.context)->rawExifLen = rawExifLen; -: 1135: 157: 1136: return (PyObject*) encoder; -: 1137:} -: 1138: -: 1139:#endif -: 1140: -: 1141: -: 1142:/* -------------------------------------------------------------------- */ -: 1143:/* JPEG 2000 */ -: 1144:/* -------------------------------------------------------------------- */ -: 1145: -: 1146:#ifdef HAVE_OPENJPEG -: 1147: -: 1148:#include "libImaging/Jpeg2K.h" -: 1149: -: 1150:static void function j2k_decode_coord_tuple called 73 returned 100% blocks executed 80% 73: 1151:j2k_decode_coord_tuple(PyObject *tuple, int *x, int *y) -: 1152:{ 73: 1153: *x = *y = 0; -: 1154: 73: 1155: if (tuple && PyTuple_Check(tuple) && PyTuple_GET_SIZE(tuple) == 2) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 10% (fallthrough) branch 3 taken 90% branch 4 taken 100% (fallthrough) branch 5 taken 0% 7: 1156: *x = (int)PyLong_AsLong(PyTuple_GET_ITEM(tuple, 0)); call 0 returned 100% 7: 1157: *y = (int)PyLong_AsLong(PyTuple_GET_ITEM(tuple, 1)); call 0 returned 100% -: 1158: 7: 1159: if (*x < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1160: *x = 0; -: 1161: } 7: 1162: if (*y < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1163: *y = 0; -: 1164: } -: 1165: } 73: 1166:} -: 1167: -: 1168:PyObject* function PyImaging_Jpeg2KEncoderNew called 15 returned 100% blocks executed 76% 15: 1169:PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) -: 1170:{ -: 1171: ImagingEncoderObject *encoder; -: 1172: JPEG2KENCODESTATE *context; -: 1173: -: 1174: char *mode; -: 1175: char *format; -: 1176: OPJ_CODEC_FORMAT codec_format; 15: 1177: PyObject *offset = NULL, *tile_offset = NULL, *tile_size = NULL; 15: 1178: char *quality_mode = "rates"; 15: 1179: PyObject *quality_layers = NULL; 15: 1180: Py_ssize_t num_resolutions = 0; 15: 1181: PyObject *cblk_size = NULL, *precinct_size = NULL; 15: 1182: PyObject *irreversible = NULL; 15: 1183: char *progression = "LRCP"; -: 1184: OPJ_PROG_ORDER prog_order; 15: 1185: char *cinema_mode = "no"; -: 1186: OPJ_CINEMA_MODE cine_mode; 15: 1187: Py_ssize_t fd = -1; -: 1188: 15: 1189: if (!PyArg_ParseTuple(args, "ss|OOOsOnOOOssn", &mode, &format, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1190: &offset, &tile_offset, &tile_size, -: 1191: &quality_mode, &quality_layers, &num_resolutions, -: 1192: &cblk_size, &precinct_size, -: 1193: &irreversible, &progression, &cinema_mode, -: 1194: &fd)) { -: 1195: return NULL; -: 1196: } -: 1197: 15: 1198: if (strcmp (format, "j2k") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 never executed branch 5 never executed branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 1199: codec_format = OPJ_CODEC_J2K; 15: 1200: } else if (strcmp (format, "jpt") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 1201: codec_format = OPJ_CODEC_JPT; 15: 1202: } else if (strcmp (format, "jp2") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 1203: codec_format = OPJ_CODEC_JP2; -: 1204: } else { -: 1205: return NULL; -: 1206: } -: 1207: 15: 1208: if (strcmp(progression, "LRCP") == 0) { branch 0 taken 7% (fallthrough) branch 1 taken 93% -: 1209: prog_order = OPJ_LRCP; 1: 1210: } else if (strcmp(progression, "RLCP") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 1211: prog_order = OPJ_RLCP; #####: 1212: } else if (strcmp(progression, "RPCL") == 0) { branch 0 never executed branch 1 never executed -: 1213: prog_order = OPJ_RPCL; #####: 1214: } else if (strcmp(progression, "PCRL") == 0) { branch 0 never executed branch 1 never executed -: 1215: prog_order = OPJ_PCRL; #####: 1216: } else if (strcmp(progression, "CPRL") == 0) { branch 0 never executed branch 1 never executed -: 1217: prog_order = OPJ_CPRL; -: 1218: } else { -: 1219: return NULL; -: 1220: } -: 1221: 15: 1222: if (strcmp(cinema_mode, "no") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% -: 1223: cine_mode = OPJ_OFF; #####: 1224: } else if (strcmp(cinema_mode, "cinema2k-24") == 0) { branch 0 never executed branch 1 never executed -: 1225: cine_mode = OPJ_CINEMA2K_24; #####: 1226: } else if (strcmp(cinema_mode, "cinema2k-48") == 0) { branch 0 never executed branch 1 never executed -: 1227: cine_mode = OPJ_CINEMA2K_48; #####: 1228: } else if (strcmp(cinema_mode, "cinema4k-24") == 0) { branch 0 never executed branch 1 never executed -: 1229: cine_mode = OPJ_CINEMA4K_24; -: 1230: } else { -: 1231: return NULL; -: 1232: } -: 1233: 15: 1234: encoder = PyImaging_EncoderNew(sizeof(JPEG2KENCODESTATE)); call 0 returned 100% 15: 1235: if (!encoder) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1236: return NULL; -: 1237: } -: 1238: 15: 1239: encoder->encode = ImagingJpeg2KEncode; 15: 1240: encoder->cleanup = ImagingJpeg2KEncodeCleanup; 15: 1241: encoder->pushes_fd = 1; -: 1242: 15: 1243: context = (JPEG2KENCODESTATE *)encoder->state.context; -: 1244: 15: 1245: context->fd = fd; 15: 1246: context->format = codec_format; 15: 1247: context->offset_x = context->offset_y = 0; -: 1248: -: 1249: 15: 1250: j2k_decode_coord_tuple(offset, &context->offset_x, &context->offset_y); call 0 returned 100% 15: 1251: j2k_decode_coord_tuple(tile_offset, call 0 returned 100% -: 1252: &context->tile_offset_x, -: 1253: &context->tile_offset_y); 15: 1254: j2k_decode_coord_tuple(tile_size, call 0 returned 100% -: 1255: &context->tile_size_x, -: 1256: &context->tile_size_y); -: 1257: -: 1258: /* Error on illegal tile offsets */ 15: 1259: if (context->tile_size_x && context->tile_size_y) { branch 0 taken 20% (fallthrough) branch 1 taken 80% branch 2 taken 100% (fallthrough) branch 3 taken 0% 3: 1260: if (context->tile_offset_x <= context->offset_x - context->tile_size_x branch 0 taken 67% (fallthrough) branch 1 taken 33% 2: 1261: || context->tile_offset_y <= context->offset_y - context->tile_size_y) { branch 0 taken 0% (fallthrough) branch 1 taken 100% 1: 1262: PyErr_SetString(PyExc_ValueError, call 0 returned 100% -: 1263: "JPEG 2000 tile offset too small; top left tile must " -: 1264: "intersect image area"); 1: 1265: Py_DECREF(encoder); branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% -: 1266: return NULL; -: 1267: } -: 1268: 2: 1269: if (context->tile_offset_x > context->offset_x branch 0 taken 100% (fallthrough) branch 1 taken 0% 2: 1270: || context->tile_offset_y > context->offset_y) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1271: PyErr_SetString(PyExc_ValueError, call 0 never executed -: 1272: "JPEG 2000 tile offset too large to cover image area"); #####: 1273: Py_DECREF(encoder); branch 0 never executed branch 1 never executed call 2 never executed -: 1274: return NULL; -: 1275: } -: 1276: } -: 1277: 14: 1278: if (quality_layers && PySequence_Check(quality_layers)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% branch 3 taken 43% (fallthrough) branch 4 taken 57% 6: 1279: context->quality_is_in_db = strcmp (quality_mode, "dB") == 0; branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed 6: 1280: context->quality_layers = quality_layers; 6: 1281: Py_INCREF(quality_layers); -: 1282: } -: 1283: 14: 1284: context->num_resolutions = num_resolutions; -: 1285: 14: 1286: j2k_decode_coord_tuple(cblk_size, call 0 returned 100% -: 1287: &context->cblk_width, -: 1288: &context->cblk_height); 14: 1289: j2k_decode_coord_tuple(precinct_size, call 0 returned 100% -: 1290: &context->precinct_width, -: 1291: &context->precinct_height); -: 1292: 14: 1293: context->irreversible = PyObject_IsTrue(irreversible); call 0 returned 100% 14: 1294: context->progression = prog_order; 14: 1295: context->cinema_mode = cine_mode; -: 1296: 14: 1297: return (PyObject *)encoder; -: 1298:} -: 1299: -: 1300:#endif -: 1301: -: 1302:/* -: 1303: * Local Variables: -: 1304: * c-basic-offset: 4 -: 1305: * End: -: 1306: * -: 1307: */ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#decode.c.gcov -: 0:Source:src/decode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/decode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/decode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * -: 4: * standard decoder interfaces for the Imaging library -: 5: * -: 6: * history: -: 7: * 1996-03-28 fl Moved from _imagingmodule.c -: 8: * 1996-04-15 fl Support subregions in setimage -: 9: * 1996-04-19 fl Allocate decoder buffer (where appropriate) -: 10: * 1996-05-02 fl Added jpeg decoder -: 11: * 1996-05-12 fl Compile cleanly as C++ -: 12: * 1996-05-16 fl Added hex decoder -: 13: * 1996-05-26 fl Added jpeg configuration parameters -: 14: * 1996-12-14 fl Added zip decoder -: 15: * 1996-12-30 fl Plugged potential memory leak for tiled images -: 16: * 1997-01-03 fl Added fli and msp decoders -: 17: * 1997-01-04 fl Added sun_rle and tga_rle decoders -: 18: * 1997-05-31 fl Added bitfield decoder -: 19: * 1998-09-11 fl Added orientation and pixelsize fields to tga_rle decoder -: 20: * 1998-12-29 fl Added mode/rawmode argument to decoders -: 21: * 1998-12-30 fl Added mode argument to *all* decoders -: 22: * 2002-06-09 fl Added stride argument to pcx decoder -: 23: * -: 24: * Copyright (c) 1997-2002 by Secret Labs AB. -: 25: * Copyright (c) 1995-2002 by Fredrik Lundh. -: 26: * -: 27: * See the README file for information on usage and redistribution. -: 28: */ -: 29: -: 30:/* FIXME: make these pluggable! */ -: 31: -: 32:#define PY_SSIZE_T_CLEAN -: 33:#include "Python.h" -: 34: -: 35:#include "libImaging/Imaging.h" -: 36: -: 37:#include "libImaging/Gif.h" -: 38:#include "libImaging/Raw.h" -: 39:#include "libImaging/Bit.h" -: 40:#include "libImaging/Sgi.h" -: 41: -: 42: -: 43:/* -------------------------------------------------------------------- */ -: 44:/* Common */ -: 45:/* -------------------------------------------------------------------- */ -: 46: -: 47:typedef struct { -: 48: PyObject_HEAD -: 49: int (*decode)(Imaging im, ImagingCodecState state, -: 50: UINT8* buffer, Py_ssize_t bytes); -: 51: int (*cleanup)(ImagingCodecState state); -: 52: struct ImagingCodecStateInstance state; -: 53: Imaging im; -: 54: PyObject* lock; -: 55: int pulls_fd; -: 56:} ImagingDecoderObject; -: 57: -: 58:static PyTypeObject ImagingDecoderType; -: 59: -: 60:static ImagingDecoderObject* function PyImaging_DecoderNew called 17261 returned 100% blocks executed 67% 17261: 61:PyImaging_DecoderNew(int contextsize) -: 62:{ -: 63: ImagingDecoderObject *decoder; -: 64: void *context; -: 65: 17261: 66: if(PyType_Ready(&ImagingDecoderType) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 67: return NULL; -: 68: } -: 69: 17261: 70: decoder = PyObject_New(ImagingDecoderObject, &ImagingDecoderType); call 0 returned 100% 17261: 71: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 72: return NULL; -: 73: } -: 74: -: 75: /* Clear the decoder state */ 34522: 76: memset(&decoder->state, 0, sizeof(decoder->state)); -: 77: -: 78: /* Allocate decoder context */ 17261: 79: if (contextsize > 0) { branch 0 taken 96% (fallthrough) branch 1 taken 4% 16533: 80: context = (void*) calloc(1, contextsize); 16533: 81: if (!context) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 82: Py_DECREF(decoder); branch 0 never executed branch 1 never executed call 2 never executed #####: 83: (void) PyErr_NoMemory(); call 0 never executed #####: 84: return NULL; -: 85: } -: 86: } else { -: 87: context = 0; -: 88: } -: 89: -: 90: /* Initialize decoder context */ 17261: 91: decoder->state.context = context; -: 92: -: 93: /* Target image */ 17261: 94: decoder->lock = NULL; 17261: 95: decoder->im = NULL; -: 96: -: 97: /* Initialize the cleanup function pointer */ 17261: 98: decoder->cleanup = NULL; -: 99: -: 100: /* set if the decoder needs to pull data from the fd, instead of -: 101: having it pushed */ 17261: 102: decoder->pulls_fd = 0; -: 103: 17261: 104: return decoder; -: 105:} -: 106: -: 107:static void function _dealloc called 17261 returned 100% blocks executed 100% 17261: 108:_dealloc(ImagingDecoderObject* decoder) -: 109:{ 17261: 110: if (decoder->cleanup) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 1241: 111: decoder->cleanup(&decoder->state); call 0 returned 100% -: 112: } 17261: 113: free(decoder->state.buffer); 17261: 114: free(decoder->state.context); 17261: 115: Py_XDECREF(decoder->lock); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 3% (fallthrough) branch 3 taken 97% call 4 returned 100% 17261: 116: Py_XDECREF(decoder->state.fd); branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 65% (fallthrough) branch 3 taken 35% call 4 returned 100% 17261: 117: PyObject_Del(decoder); call 0 returned 100% 17261: 118:} -: 119: -: 120:static PyObject* function _decode called 18341 returned 100% blocks executed 100% 18341: 121:_decode(ImagingDecoderObject* decoder, PyObject* args) -: 122:{ -: 123: UINT8* buffer; -: 124: Py_ssize_t bufsize; -: 125: int status; -: 126: ImagingSectionCookie cookie; -: 127: 18341: 128: if (!PyArg_ParseTuple(args, "y#", &buffer, &bufsize)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 129: return NULL; -: 130: } -: 131: 18341: 132: if (!decoder->pulls_fd) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 18301: 133: ImagingSectionEnter(&cookie); call 0 returned 100% -: 134: } -: 135: 18341: 136: status = decoder->decode(decoder->im, &decoder->state, buffer, bufsize); call 0 returned 100% -: 137: 18341: 138: if (!decoder->pulls_fd) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 18301: 139: ImagingSectionLeave(&cookie); call 0 returned 100% -: 140: } -: 141: 18341: 142: return Py_BuildValue("ii", status, decoder->state.errcode); call 0 returned 100% -: 143:} -: 144: -: 145:static PyObject* function _decode_cleanup called 3329 returned 100% blocks executed 100% 3329: 146:_decode_cleanup(ImagingDecoderObject* decoder, PyObject* args) -: 147:{ 3329: 148: int status = 0; -: 149: 3329: 150: if (decoder->cleanup){ branch 0 taken 37% (fallthrough) branch 1 taken 63% 1240: 151: status = decoder->cleanup(&decoder->state); call 0 returned 100% -: 152: } -: 153: 3329: 154: return Py_BuildValue("i", status); call 0 returned 100% -: 155:} -: 156: -: 157: -: 158: -: 159:extern Imaging PyImaging_AsImaging(PyObject *op); -: 160: -: 161:static PyObject* function _setimage called 17261 returned 100% blocks executed 77% 17261: 162:_setimage(ImagingDecoderObject* decoder, PyObject* args) -: 163:{ -: 164: PyObject* op; -: 165: Imaging im; -: 166: ImagingCodecState state; -: 167: int x0, y0, x1, y1; -: 168: 17261: 169: x0 = y0 = x1 = y1 = 0; -: 170: -: 171: /* FIXME: should publish the ImagingType descriptor */ 17261: 172: if (!PyArg_ParseTuple(args, "O|(iiii)", &op, &x0, &y0, &x1, &y1)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 173: return NULL; -: 174: } 17261: 175: im = PyImaging_AsImaging(op); call 0 returned 100% 17261: 176: if (!im) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 177: return NULL; -: 178: } -: 179: 17261: 180: decoder->im = im; -: 181: 17261: 182: state = &decoder->state; -: 183: -: 184: /* Setup decoding tile extent */ 17261: 185: if (x0 == 0 && x1 == 0) { branch 0 taken 98% (fallthrough) branch 1 taken 2% branch 2 taken 82% (fallthrough) branch 3 taken 18% 13905: 186: state->xsize = im->xsize; 13905: 187: state->ysize = im->ysize; -: 188: } else { 3356: 189: state->xoff = x0; 3356: 190: state->yoff = y0; 3356: 191: state->xsize = x1 - x0; 3356: 192: state->ysize = y1 - y0; -: 193: } -: 194: 34522: 195: if (state->xsize <= 0 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 34522: 196: state->xsize + state->xoff > (int) im->xsize || branch 0 taken 100% (fallthrough) branch 1 taken 0% 34522: 197: state->ysize <= 0 || branch 0 taken 0% (fallthrough) branch 1 taken 100% 17261: 198: state->ysize + state->yoff > (int) im->ysize) { #####: 199: PyErr_SetString(PyExc_ValueError, "tile cannot extend outside image"); call 0 never executed #####: 200: return NULL; -: 201: } -: 202: -: 203: /* Allocate memory buffer (if bits field is set) */ 17261: 204: if (state->bits > 0) { branch 0 taken 94% (fallthrough) branch 1 taken 6% 16291: 205: if (!state->bytes) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 16266: 206: if (state->xsize > ((INT_MAX / state->bits)-7)){ branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 207: return PyErr_NoMemory(); call 0 never executed -: 208: } 16266: 209: state->bytes = (state->bits * state->xsize+7)/8; -: 210: } -: 211: /* malloc check ok, overflow checked above */ 16291: 212: state->buffer = (UINT8*) malloc(state->bytes); 16291: 213: if (!state->buffer) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 214: return PyErr_NoMemory(); call 0 never executed -: 215: } -: 216: } -: 217: -: 218: /* Keep a reference to the image object, to make sure it doesn't -: 219: go away before we do */ 17261: 220: Py_INCREF(op); 17261: 221: Py_XDECREF(decoder->lock); branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed call 4 never executed 17261: 222: decoder->lock = op; -: 223: 17261: 224: Py_INCREF(Py_None); 17261: 225: return Py_None; -: 226:} -: 227: -: 228:static PyObject* function _setfd called 40 returned 100% blocks executed 100% 40: 229:_setfd(ImagingDecoderObject* decoder, PyObject* args) -: 230:{ -: 231: PyObject* fd; -: 232: ImagingCodecState state; -: 233: 40: 234: if (!PyArg_ParseTuple(args, "O", &fd)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 235: return NULL; -: 236: } -: 237: 40: 238: state = &decoder->state; -: 239: 40: 240: Py_XINCREF(fd); branch 0 taken 100% (fallthrough) branch 1 taken 0% 40: 241: state->fd = fd; -: 242: 40: 243: Py_INCREF(Py_None); 40: 244: return Py_None; -: 245:} -: 246: -: 247: -: 248:static PyObject * function _get_pulls_fd called 3329 returned 100% blocks executed 100% 3329: 249:_get_pulls_fd(ImagingDecoderObject *decoder) -: 250:{ 3329: 251: return PyBool_FromLong(decoder->pulls_fd); call 0 returned 100% -: 252:} -: 253: -: 254:static struct PyMethodDef methods[] = { -: 255: {"decode", (PyCFunction)_decode, 1}, -: 256: {"cleanup", (PyCFunction)_decode_cleanup, 1}, -: 257: {"setimage", (PyCFunction)_setimage, 1}, -: 258: {"setfd", (PyCFunction)_setfd, 1}, -: 259: {NULL, NULL} /* sentinel */ -: 260:}; -: 261: -: 262:static struct PyGetSetDef getseters[] = { -: 263: {"pulls_fd", (getter)_get_pulls_fd, NULL, -: 264: "True if this decoder expects to pull from self.fd itself.", -: 265: NULL}, -: 266: {NULL, NULL, NULL, NULL, NULL} /* sentinel */ -: 267:}; -: 268: -: 269:static PyTypeObject ImagingDecoderType = { -: 270: PyVarObject_HEAD_INIT(NULL, 0) -: 271: "ImagingDecoder", /*tp_name*/ -: 272: sizeof(ImagingDecoderObject), /*tp_size*/ -: 273: 0, /*tp_itemsize*/ -: 274: /* methods */ -: 275: (destructor)_dealloc, /*tp_dealloc*/ -: 276: 0, /*tp_print*/ -: 277: 0, /*tp_getattr*/ -: 278: 0, /*tp_setattr*/ -: 279: 0, /*tp_compare*/ -: 280: 0, /*tp_repr*/ -: 281: 0, /*tp_as_number */ -: 282: 0, /*tp_as_sequence */ -: 283: 0, /*tp_as_mapping */ -: 284: 0, /*tp_hash*/ -: 285: 0, /*tp_call*/ -: 286: 0, /*tp_str*/ -: 287: 0, /*tp_getattro*/ -: 288: 0, /*tp_setattro*/ -: 289: 0, /*tp_as_buffer*/ -: 290: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 291: 0, /*tp_doc*/ -: 292: 0, /*tp_traverse*/ -: 293: 0, /*tp_clear*/ -: 294: 0, /*tp_richcompare*/ -: 295: 0, /*tp_weaklistoffset*/ -: 296: 0, /*tp_iter*/ -: 297: 0, /*tp_iternext*/ -: 298: methods, /*tp_methods*/ -: 299: 0, /*tp_members*/ -: 300: getseters, /*tp_getset*/ -: 301:}; -: 302: -: 303:/* -------------------------------------------------------------------- */ -: 304: -: 305:int function get_unpacker called 16291 returned 100% blocks executed 50% 16291: 306:get_unpacker(ImagingDecoderObject* decoder, const char* mode, -: 307: const char* rawmode) -: 308:{ -: 309: int bits; -: 310: ImagingShuffler unpack; -: 311: 16291: 312: unpack = ImagingFindUnpacker(mode, rawmode, &bits); call 0 returned 100% 16291: 313: if (!unpack) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 314: Py_DECREF(decoder); branch 0 never executed branch 1 never executed call 2 never executed #####: 315: PyErr_SetString(PyExc_ValueError, "unknown raw mode"); call 0 never executed #####: 316: return -1; -: 317: } -: 318: 16291: 319: decoder->state.shuffle = unpack; 16291: 320: decoder->state.bits = bits; -: 321: 16291: 322: return 0; -: 323:} -: 324: -: 325: -: 326:/* -------------------------------------------------------------------- */ -: 327:/* BIT (packed fields) */ -: 328:/* -------------------------------------------------------------------- */ -: 329: -: 330:PyObject* function PyImaging_BitDecoderNew called 0 returned 0% blocks executed 0% #####: 331:PyImaging_BitDecoderNew(PyObject* self, PyObject* args) -: 332:{ -: 333: ImagingDecoderObject* decoder; -: 334: -: 335: char* mode; #####: 336: int bits = 8; #####: 337: int pad = 8; #####: 338: int fill = 0; #####: 339: int sign = 0; #####: 340: int ystep = 1; #####: 341: if (!PyArg_ParseTuple(args, "s|iiiii", &mode, &bits, &pad, &fill, call 0 never executed branch 1 never executed branch 2 never executed -: 342: &sign, &ystep)) { -: 343: return NULL; -: 344: } -: 345: #####: 346: if (strcmp(mode, "F") != 0) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 347: PyErr_SetString(PyExc_ValueError, "bad image mode"); call 0 never executed #####: 348: return NULL; -: 349: } -: 350: #####: 351: decoder = PyImaging_DecoderNew(sizeof(BITSTATE)); call 0 never executed #####: 352: if (decoder == NULL) { branch 0 never executed branch 1 never executed -: 353: return NULL; -: 354: } -: 355: #####: 356: decoder->decode = ImagingBitDecode; -: 357: #####: 358: decoder->state.ystep = ystep; -: 359: #####: 360: ((BITSTATE*)decoder->state.context)->bits = bits; #####: 361: ((BITSTATE*)decoder->state.context)->pad = pad; #####: 362: ((BITSTATE*)decoder->state.context)->fill = fill; #####: 363: ((BITSTATE*)decoder->state.context)->sign = sign; -: 364: #####: 365: return (PyObject*) decoder; -: 366:} -: 367: -: 368: -: 369:/* -------------------------------------------------------------------- */ -: 370:/* BCn: GPU block-compressed texture formats */ -: 371:/* -------------------------------------------------------------------- */ -: 372: -: 373:PyObject* function PyImaging_BcnDecoderNew called 7 returned 100% blocks executed 60% 7: 374:PyImaging_BcnDecoderNew(PyObject* self, PyObject* args) -: 375:{ -: 376: ImagingDecoderObject* decoder; -: 377: -: 378: char* mode; -: 379: char* actual; 7: 380: int n = 0; 7: 381: int ystep = 1; 7: 382: if (!PyArg_ParseTuple(args, "s|ii", &mode, &n, &ystep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 383: return NULL; -: 384: } -: 385: 7: 386: switch (n) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed -: 387: case 1: /* BC1: 565 color, 1-bit alpha */ -: 388: case 2: /* BC2: 565 color, 4-bit alpha */ -: 389: case 3: /* BC3: 565 color, 2-endpoint 8-bit interpolated alpha */ -: 390: case 5: /* BC5: 2-channel 8-bit via 2 BC3 alpha blocks */ -: 391: case 7: /* BC7: 4-channel 8-bit via everything */ -: 392: actual = "RGBA"; break; -: 393: case 4: /* BC4: 1-channel 8-bit via 1 BC3 alpha block */ -: 394: actual = "L"; break; -: 395: case 6: /* BC6: 3-channel 16-bit float */ -: 396: /* TODO: support 4-channel floating point images */ -: 397: actual = "RGBAF"; break; -: 398: default: #####: 399: PyErr_SetString(PyExc_ValueError, "block compression type unknown"); call 0 never executed #####: 400: return NULL; -: 401: } -: 402: 7: 403: if (strcmp(mode, actual) != 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 404: PyErr_SetString(PyExc_ValueError, "bad image mode"); call 0 never executed #####: 405: return NULL; -: 406: } -: 407: 7: 408: decoder = PyImaging_DecoderNew(0); call 0 returned 100% 7: 409: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 410: return NULL; -: 411: } -: 412: 7: 413: decoder->decode = ImagingBcnDecode; 7: 414: decoder->state.state = n; 7: 415: decoder->state.ystep = ystep; -: 416: 7: 417: return (PyObject*) decoder; -: 418:} -: 419: -: 420: -: 421:/* -------------------------------------------------------------------- */ -: 422:/* FLI */ -: 423:/* -------------------------------------------------------------------- */ -: 424: -: 425:PyObject* function PyImaging_FliDecoderNew called 443 returned 100% blocks executed 100% 443: 426:PyImaging_FliDecoderNew(PyObject* self, PyObject* args) -: 427:{ -: 428: ImagingDecoderObject* decoder; -: 429: 443: 430: decoder = PyImaging_DecoderNew(0); call 0 returned 100% 443: 431: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 432: return NULL; -: 433: } -: 434: 443: 435: decoder->decode = ImagingFliDecode; -: 436: 443: 437: return (PyObject*) decoder; -: 438:} -: 439: -: 440: -: 441:/* -------------------------------------------------------------------- */ -: 442:/* GIF */ -: 443:/* -------------------------------------------------------------------- */ -: 444: -: 445:PyObject* function PyImaging_GifDecoderNew called 486 returned 100% blocks executed 86% 486: 446:PyImaging_GifDecoderNew(PyObject* self, PyObject* args) -: 447:{ -: 448: ImagingDecoderObject* decoder; -: 449: -: 450: char* mode; 486: 451: int bits = 8; 486: 452: int interlace = 0; 486: 453: if (!PyArg_ParseTuple(args, "s|ii", &mode, &bits, &interlace)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 454: return NULL; -: 455: } -: 456: 486: 457: if (strcmp(mode, "L") != 0 && strcmp(mode, "P") != 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 458: PyErr_SetString(PyExc_ValueError, "bad image mode"); call 0 never executed #####: 459: return NULL; -: 460: } -: 461: 486: 462: decoder = PyImaging_DecoderNew(sizeof(GIFDECODERSTATE)); call 0 returned 100% 486: 463: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 464: return NULL; -: 465: } -: 466: 486: 467: decoder->decode = ImagingGifDecode; -: 468: 486: 469: ((GIFDECODERSTATE*)decoder->state.context)->bits = bits; 486: 470: ((GIFDECODERSTATE*)decoder->state.context)->interlace = interlace; -: 471: 486: 472: return (PyObject*) decoder; -: 473:} -: 474: -: 475: -: 476:/* -------------------------------------------------------------------- */ -: 477:/* HEX */ -: 478:/* -------------------------------------------------------------------- */ -: 479: -: 480:PyObject* function PyImaging_HexDecoderNew called 194 returned 100% blocks executed 100% 194: 481:PyImaging_HexDecoderNew(PyObject* self, PyObject* args) -: 482:{ -: 483: ImagingDecoderObject* decoder; -: 484: -: 485: char* mode; -: 486: char* rawmode; 194: 487: if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 488: return NULL; -: 489: } -: 490: 194: 491: decoder = PyImaging_DecoderNew(0); call 0 returned 100% 194: 492: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 493: return NULL; -: 494: } -: 495: 194: 496: if (get_unpacker(decoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 497: return NULL; -: 498: } -: 499: 194: 500: decoder->decode = ImagingHexDecode; -: 501: 194: 502: return (PyObject*) decoder; -: 503:} -: 504: -: 505: -: 506:/* -------------------------------------------------------------------- */ -: 507:/* LibTiff */ -: 508:/* -------------------------------------------------------------------- */ -: 509: -: 510:#ifdef HAVE_LIBTIFF -: 511: -: 512:#include "libImaging/TiffDecode.h" -: 513: -: 514:#include -: 515: -: 516:PyObject* -: 517:PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args) -: 518:{ -: 519: ImagingDecoderObject* decoder; -: 520: char* mode; -: 521: char* rawmode; -: 522: char* compname; -: 523: int fp; -: 524: uint32 ifdoffset; -: 525: -: 526: if (! PyArg_ParseTuple(args, "sssiI", &mode, &rawmode, &compname, &fp, &ifdoffset)) { -: 527: return NULL; -: 528: } -: 529: -: 530: TRACE(("new tiff decoder %s\n", compname)); -: 531: -: 532: decoder = PyImaging_DecoderNew(sizeof(TIFFSTATE)); -: 533: if (decoder == NULL) { -: 534: return NULL; -: 535: } -: 536: -: 537: if (get_unpacker(decoder, mode, rawmode) < 0) { -: 538: return NULL; -: 539: } -: 540: -: 541: if (! ImagingLibTiffInit(&decoder->state, fp, ifdoffset)) { -: 542: Py_DECREF(decoder); -: 543: PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed"); -: 544: return NULL; -: 545: } -: 546: -: 547: decoder->decode = ImagingLibTiffDecode; -: 548: -: 549: return (PyObject*) decoder; -: 550:} -: 551: -: 552:#endif -: 553: -: 554: -: 555:/* -------------------------------------------------------------------- */ -: 556:/* PackBits */ -: 557:/* -------------------------------------------------------------------- */ -: 558: -: 559:PyObject* function PyImaging_PackbitsDecoderNew called 21 returned 100% blocks executed 100% 21: 560:PyImaging_PackbitsDecoderNew(PyObject* self, PyObject* args) -: 561:{ -: 562: ImagingDecoderObject* decoder; -: 563: -: 564: char* mode; -: 565: char* rawmode; 21: 566: if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 567: return NULL; -: 568: } -: 569: 21: 570: decoder = PyImaging_DecoderNew(0); call 0 returned 100% 21: 571: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 572: return NULL; -: 573: } -: 574: 21: 575: if (get_unpacker(decoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 576: return NULL; -: 577: } -: 578: 21: 579: decoder->decode = ImagingPackbitsDecode; -: 580: 21: 581: return (PyObject*) decoder; -: 582:} -: 583: -: 584: -: 585:/* -------------------------------------------------------------------- */ -: 586:/* PCD */ -: 587:/* -------------------------------------------------------------------- */ -: 588: -: 589:PyObject* function PyImaging_PcdDecoderNew called 1 returned 100% blocks executed 100% 1: 590:PyImaging_PcdDecoderNew(PyObject* self, PyObject* args) -: 591:{ -: 592: ImagingDecoderObject* decoder; -: 593: 1: 594: decoder = PyImaging_DecoderNew(0); call 0 returned 100% 1: 595: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 596: return NULL; -: 597: } -: 598: -: 599: /* Unpack from PhotoYCC to RGB */ 1: 600: if (get_unpacker(decoder, "RGB", "YCC;P") < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 601: return NULL; -: 602: } -: 603: 1: 604: decoder->decode = ImagingPcdDecode; -: 605: 1: 606: return (PyObject*) decoder; -: 607:} -: 608: -: 609: -: 610:/* -------------------------------------------------------------------- */ -: 611:/* PCX */ -: 612:/* -------------------------------------------------------------------- */ -: 613: -: 614:PyObject* function PyImaging_PcxDecoderNew called 25 returned 100% blocks executed 100% 25: 615:PyImaging_PcxDecoderNew(PyObject* self, PyObject* args) -: 616:{ -: 617: ImagingDecoderObject* decoder; -: 618: -: 619: char* mode; -: 620: char* rawmode; -: 621: int stride; 25: 622: if (!PyArg_ParseTuple(args, "ssi", &mode, &rawmode, &stride)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 623: return NULL; -: 624: } -: 625: 25: 626: decoder = PyImaging_DecoderNew(0); call 0 returned 100% 25: 627: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 628: return NULL; -: 629: } -: 630: 25: 631: if (get_unpacker(decoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 632: return NULL; -: 633: } -: 634: 25: 635: decoder->state.bytes = stride; -: 636: 25: 637: decoder->decode = ImagingPcxDecode; -: 638: 25: 639: return (PyObject*) decoder; -: 640:} -: 641: -: 642: -: 643:/* -------------------------------------------------------------------- */ -: 644:/* RAW */ -: 645:/* -------------------------------------------------------------------- */ -: 646: -: 647:PyObject* function PyImaging_RawDecoderNew called 14799 returned 100% blocks executed 100% 14799: 648:PyImaging_RawDecoderNew(PyObject* self, PyObject* args) -: 649:{ -: 650: ImagingDecoderObject* decoder; -: 651: -: 652: char* mode; -: 653: char* rawmode; 14799: 654: int stride = 0; 14799: 655: int ystep = 1; 14799: 656: if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &stride, &ystep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 657: return NULL; -: 658: } -: 659: 14799: 660: decoder = PyImaging_DecoderNew(sizeof(RAWSTATE)); call 0 returned 100% 14799: 661: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 662: return NULL; -: 663: } -: 664: 14799: 665: if (get_unpacker(decoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 666: return NULL; -: 667: } -: 668: 14799: 669: decoder->decode = ImagingRawDecode; -: 670: 14799: 671: decoder->state.ystep = ystep; -: 672: 14799: 673: ((RAWSTATE*)decoder->state.context)->stride = stride; -: 674: 14799: 675: return (PyObject*) decoder; -: 676:} -: 677: -: 678: -: 679:/* -------------------------------------------------------------------- */ -: 680:/* SGI RLE */ -: 681:/* -------------------------------------------------------------------- */ -: 682: -: 683:PyObject* function PyImaging_SgiRleDecoderNew called 7 returned 100% blocks executed 100% 7: 684:PyImaging_SgiRleDecoderNew(PyObject* self, PyObject* args) -: 685:{ -: 686: ImagingDecoderObject* decoder; -: 687: -: 688: char* mode; -: 689: char* rawmode; 7: 690: int ystep = 1; 7: 691: int bpc = 1; 7: 692: if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &bpc)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 693: return NULL; -: 694: } -: 695: 7: 696: decoder = PyImaging_DecoderNew(sizeof(SGISTATE)); call 0 returned 100% 7: 697: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 698: return NULL; -: 699: } -: 700: 7: 701: if (get_unpacker(decoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 702: return NULL; -: 703: } -: 704: 7: 705: decoder->pulls_fd = 1; 7: 706: decoder->decode = ImagingSgiRleDecode; 7: 707: decoder->state.ystep = ystep; -: 708: 7: 709: ((SGISTATE*)decoder->state.context)->bpc = bpc; -: 710: 7: 711: return (PyObject*) decoder; -: 712:} -: 713: -: 714: -: 715:/* -------------------------------------------------------------------- */ -: 716:/* SUN RLE */ -: 717:/* -------------------------------------------------------------------- */ -: 718: -: 719:PyObject* function PyImaging_SunRleDecoderNew called 4 returned 100% blocks executed 100% 4: 720:PyImaging_SunRleDecoderNew(PyObject* self, PyObject* args) -: 721:{ -: 722: ImagingDecoderObject* decoder; -: 723: -: 724: char* mode; -: 725: char* rawmode; 4: 726: if (!PyArg_ParseTuple(args, "ss", &mode, &rawmode)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 727: return NULL; -: 728: } -: 729: 4: 730: decoder = PyImaging_DecoderNew(0); call 0 returned 100% 4: 731: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 732: return NULL; -: 733: } -: 734: 4: 735: if (get_unpacker(decoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 736: return NULL; -: 737: } -: 738: 4: 739: decoder->decode = ImagingSunRleDecode; -: 740: 4: 741: return (PyObject*) decoder; -: 742:} -: 743: -: 744: -: 745:/* -------------------------------------------------------------------- */ -: 746:/* TGA RLE */ -: 747:/* -------------------------------------------------------------------- */ -: 748: -: 749:PyObject* function PyImaging_TgaRleDecoderNew called 30 returned 100% blocks executed 100% 30: 750:PyImaging_TgaRleDecoderNew(PyObject* self, PyObject* args) -: 751:{ -: 752: ImagingDecoderObject* decoder; -: 753: -: 754: char* mode; -: 755: char* rawmode; 30: 756: int ystep = 1; 30: 757: int depth = 8; 30: 758: if (!PyArg_ParseTuple(args, "ss|ii", &mode, &rawmode, &ystep, &depth)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 759: return NULL; -: 760: } -: 761: 30: 762: decoder = PyImaging_DecoderNew(0); call 0 returned 100% 30: 763: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 764: return NULL; -: 765: } -: 766: 30: 767: if (get_unpacker(decoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 768: return NULL; -: 769: } -: 770: 30: 771: decoder->decode = ImagingTgaRleDecode; -: 772: 30: 773: decoder->state.ystep = ystep; 30: 774: decoder->state.count = depth / 8; -: 775: 30: 776: return (PyObject*) decoder; -: 777:} -: 778: -: 779: -: 780:/* -------------------------------------------------------------------- */ -: 781:/* XBM */ -: 782:/* -------------------------------------------------------------------- */ -: 783: -: 784:PyObject* function PyImaging_XbmDecoderNew called 3 returned 100% blocks executed 100% 3: 785:PyImaging_XbmDecoderNew(PyObject* self, PyObject* args) -: 786:{ -: 787: ImagingDecoderObject* decoder; -: 788: 3: 789: decoder = PyImaging_DecoderNew(0); call 0 returned 100% 3: 790: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 791: return NULL; -: 792: } -: 793: 3: 794: if (get_unpacker(decoder, "1", "1;R") < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 795: return NULL; -: 796: } -: 797: 3: 798: decoder->decode = ImagingXbmDecode; -: 799: 3: 800: return (PyObject*) decoder; -: 801:} -: 802: -: 803: -: 804:/* -------------------------------------------------------------------- */ -: 805:/* ZIP */ -: 806:/* -------------------------------------------------------------------- */ -: 807: -: 808:#ifdef HAVE_LIBZ -: 809: -: 810:#include "libImaging/ZipCodecs.h" -: 811: -: 812:PyObject* function PyImaging_ZipDecoderNew called 1016 returned 100% blocks executed 100% 1016: 813:PyImaging_ZipDecoderNew(PyObject* self, PyObject* args) -: 814:{ -: 815: ImagingDecoderObject* decoder; -: 816: -: 817: char* mode; -: 818: char* rawmode; 1016: 819: int interlaced = 0; 1016: 820: if (!PyArg_ParseTuple(args, "ss|i", &mode, &rawmode, &interlaced)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 821: return NULL; -: 822: } -: 823: 1016: 824: decoder = PyImaging_DecoderNew(sizeof(ZIPSTATE)); call 0 returned 100% 1016: 825: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 826: return NULL; -: 827: } -: 828: 1016: 829: if (get_unpacker(decoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 830: return NULL; -: 831: } -: 832: 1016: 833: decoder->decode = ImagingZipDecode; 1016: 834: decoder->cleanup = ImagingZipDecodeCleanup; -: 835: 1016: 836: ((ZIPSTATE*)decoder->state.context)->interlaced = interlaced; -: 837: 1016: 838: return (PyObject*) decoder; -: 839:} -: 840:#endif -: 841: -: 842: -: 843:/* -------------------------------------------------------------------- */ -: 844:/* JPEG */ -: 845:/* -------------------------------------------------------------------- */ -: 846: -: 847:#ifdef HAVE_LIBJPEG -: 848: -: 849:/* We better define this decoder last in this file, so the following -: 850: undef's won't mess things up for the Imaging library proper. */ -: 851: -: 852:#undef HAVE_PROTOTYPES -: 853:#undef HAVE_STDDEF_H -: 854:#undef HAVE_STDLIB_H -: 855:#undef UINT8 -: 856:#undef UINT16 -: 857:#undef UINT32 -: 858:#undef INT8 -: 859:#undef INT16 -: 860:#undef INT32 -: 861: -: 862:#include "libImaging/Jpeg.h" -: 863: -: 864:PyObject* function PyImaging_JpegDecoderNew called 191 returned 100% blocks executed 94% 191: 865:PyImaging_JpegDecoderNew(PyObject* self, PyObject* args) -: 866:{ -: 867: ImagingDecoderObject* decoder; -: 868: -: 869: char* mode; -: 870: char* rawmode; /* what we want from the decoder */ -: 871: char* jpegmode; /* what's in the file */ 191: 872: int scale = 1; 191: 873: int draft = 0; -: 874: 191: 875: if (!PyArg_ParseTuple(args, "ssz|ii", &mode, &rawmode, &jpegmode, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 876: &scale, &draft)) { -: 877: return NULL; -: 878: } -: 879: 191: 880: if (!jpegmode) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 881: jpegmode = ""; -: 882: } -: 883: 191: 884: decoder = PyImaging_DecoderNew(sizeof(JPEGSTATE)); call 0 returned 100% 191: 885: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 886: return NULL; -: 887: } -: 888: -: 889: // libjpeg-turbo supports different output formats. -: 890: // We are choosing Pillow's native format (3 color bytes + 1 padding) -: 891: // to avoid extra conversion in Unpack.c. 191: 892: if (ImagingJpegUseJCSExtensions() && strcmp(rawmode, "RGB") == 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 74% (fallthrough) branch 4 taken 26% branch 5 taken 100% (fallthrough) branch 6 taken 0% branch 7 taken 100% (fallthrough) branch 8 taken 0% branch 9 taken 74% (fallthrough) branch 10 taken 26% 142: 893: rawmode = "RGBX"; -: 894: } -: 895: 191: 896: if (get_unpacker(decoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 897: return NULL; -: 898: } -: 899: 191: 900: decoder->decode = ImagingJpegDecode; 191: 901: decoder->cleanup = ImagingJpegDecodeCleanup; -: 902: 382: 903: strncpy(((JPEGSTATE*)decoder->state.context)->rawmode, rawmode, 8); 382: 904: strncpy(((JPEGSTATE*)decoder->state.context)->jpegmode, jpegmode, 8); -: 905: 191: 906: ((JPEGSTATE*)decoder->state.context)->scale = scale; 191: 907: ((JPEGSTATE*)decoder->state.context)->draft = draft; -: 908: 191: 909: return (PyObject*) decoder; -: 910:} -: 911:#endif -: 912: -: 913:/* -------------------------------------------------------------------- */ -: 914:/* JPEG 2000 */ -: 915:/* -------------------------------------------------------------------- */ -: 916: -: 917:#ifdef HAVE_OPENJPEG -: 918: -: 919:#include "libImaging/Jpeg2K.h" -: 920: -: 921:PyObject* function PyImaging_Jpeg2KDecoderNew called 34 returned 100% blocks executed 95% 34: 922:PyImaging_Jpeg2KDecoderNew(PyObject* self, PyObject* args) -: 923:{ -: 924: ImagingDecoderObject* decoder; -: 925: JPEG2KDECODESTATE *context; -: 926: -: 927: char* mode; -: 928: char* format; -: 929: OPJ_CODEC_FORMAT codec_format; 34: 930: int reduce = 0; 34: 931: int layers = 0; 34: 932: int fd = -1; 34: 933: PY_LONG_LONG length = -1; -: 934: 34: 935: if (!PyArg_ParseTuple(args, "ss|iiiL", &mode, &format, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 936: &reduce, &layers, &fd, &length)) { -: 937: return NULL; -: 938: } -: 939: 34: 940: if (strcmp(format, "j2k") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 12% (fallthrough) branch 3 taken 88% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 88% (fallthrough) branch 7 taken 12% -: 941: codec_format = OPJ_CODEC_J2K; 30: 942: } else if (strcmp(format, "jpt") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 943: codec_format = OPJ_CODEC_JPT; 30: 944: } else if (strcmp(format, "jp2") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 945: codec_format = OPJ_CODEC_JP2; -: 946: } else { -: 947: return NULL; -: 948: } -: 949: 34: 950: decoder = PyImaging_DecoderNew(sizeof(JPEG2KDECODESTATE)); call 0 returned 100% 34: 951: if (decoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 952: return NULL; -: 953: } -: 954: 34: 955: decoder->pulls_fd = 1; 34: 956: decoder->decode = ImagingJpeg2KDecode; 34: 957: decoder->cleanup = ImagingJpeg2KDecodeCleanup; -: 958: 34: 959: context = (JPEG2KDECODESTATE *)decoder->state.context; -: 960: 34: 961: context->fd = fd; 34: 962: context->length = (off_t)length; 34: 963: context->format = codec_format; 34: 964: context->reduce = reduce; 34: 965: context->layers = layers; -: 966: 34: 967: return (PyObject*) decoder; -: 968:} -: 969:#endif /* HAVE_OPENJPEG */ -: 970: <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#_imagingft.c.gcov -: 0:Source:src/_imagingft.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imagingft.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imagingft.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * PIL FreeType Driver -: 3: * -: 4: * a FreeType 2.X driver for PIL -: 5: * -: 6: * history: -: 7: * 2001-02-17 fl Created (based on old experimental freetype 1.0 code) -: 8: * 2001-04-18 fl Fixed some egcs compiler nits -: 9: * 2002-11-08 fl Added unicode support; more font metrics, etc -: 10: * 2003-05-20 fl Fixed compilation under 1.5.2 and newer non-unicode builds -: 11: * 2003-09-27 fl Added charmap encoding support -: 12: * 2004-05-15 fl Fixed compilation for FreeType 2.1.8 -: 13: * 2004-09-10 fl Added support for monochrome bitmaps -: 14: * 2006-06-18 fl Fixed glyph bearing calculation -: 15: * 2007-12-23 fl Fixed crash in family/style attribute fetch -: 16: * 2008-01-02 fl Handle Unicode filenames properly -: 17: * -: 18: * Copyright (c) 1998-2007 by Secret Labs AB -: 19: */ -: 20: -: 21:#define PY_SSIZE_T_CLEAN -: 22:#include "Python.h" -: 23:#include "libImaging/Imaging.h" -: 24: -: 25:#include -: 26:#include FT_FREETYPE_H -: 27:#include FT_GLYPH_H -: 28:#include FT_BITMAP_H -: 29:#include FT_STROKER_H -: 30:#include FT_MULTIPLE_MASTERS_H -: 31:#include FT_SFNT_NAMES_H -: 32:#ifdef FT_COLOR_H -: 33:#include FT_COLOR_H -: 34:#endif -: 35: -: 36:#define KEEP_PY_UNICODE -: 37: -: 38:#ifndef _WIN32 -: 39:#include -: 40:#endif -: 41: -: 42:#if !defined(FT_LOAD_TARGET_MONO) -: 43:#define FT_LOAD_TARGET_MONO FT_LOAD_MONOCHROME -: 44:#endif -: 45: -: 46:/* -------------------------------------------------------------------- */ -: 47:/* error table */ -: 48: -: 49:#undef FTERRORS_H -: 50:#undef __FTERRORS_H__ -: 51: -: 52:#define FT_ERRORDEF( e, v, s ) { e, s }, -: 53:#define FT_ERROR_START_LIST { -: 54:#define FT_ERROR_END_LIST { 0, 0 } }; -: 55: -: 56:#include "libImaging/raqm.h" -: 57: -: 58:#define LAYOUT_FALLBACK 0 -: 59:#define LAYOUT_RAQM 1 -: 60: -: 61:typedef struct -: 62:{ -: 63: int index, x_offset, x_advance, y_offset, y_advance; -: 64: unsigned int cluster; -: 65:} GlyphInfo; -: 66: -: 67:struct { -: 68: int code; -: 69: const char* message; -: 70:} ft_errors[] = -: 71: -: 72:#include FT_ERRORS_H -: 73: -: 74:/* -------------------------------------------------------------------- */ -: 75:/* font objects */ -: 76: -: 77:static FT_Library library; -: 78: -: 79:typedef struct { -: 80: PyObject_HEAD -: 81: FT_Face face; -: 82: unsigned char *font_bytes; -: 83: int layout_engine; -: 84:} FontObject; -: 85: -: 86:static PyTypeObject Font_Type; -: 87: -: 88:typedef const char* (*t_raqm_version_string) (void); -: 89:typedef bool (*t_raqm_version_atleast)(unsigned int major, -: 90: unsigned int minor, -: 91: unsigned int micro); -: 92:typedef raqm_t* (*t_raqm_create)(void); -: 93:typedef int (*t_raqm_set_text)(raqm_t *rq, -: 94: const uint32_t *text, -: 95: size_t len); -: 96:typedef bool (*t_raqm_set_text_utf8) (raqm_t *rq, -: 97: const char *text, -: 98: size_t len); -: 99:typedef bool (*t_raqm_set_par_direction) (raqm_t *rq, -: 100: raqm_direction_t dir); -: 101:typedef bool (*t_raqm_set_language) (raqm_t *rq, -: 102: const char *lang, -: 103: size_t start, -: 104: size_t len); -: 105:typedef bool (*t_raqm_add_font_feature) (raqm_t *rq, -: 106: const char *feature, -: 107: int len); -: 108:typedef bool (*t_raqm_set_freetype_face) (raqm_t *rq, -: 109: FT_Face face); -: 110:typedef bool (*t_raqm_layout) (raqm_t *rq); -: 111:typedef raqm_glyph_t* (*t_raqm_get_glyphs) (raqm_t *rq, -: 112: size_t *length); -: 113:typedef raqm_glyph_t_01* (*t_raqm_get_glyphs_01) (raqm_t *rq, -: 114: size_t *length); -: 115:typedef void (*t_raqm_destroy) (raqm_t *rq); -: 116: -: 117:typedef struct { -: 118: void* raqm; -: 119: int version; -: 120: t_raqm_version_string version_string; -: 121: t_raqm_version_atleast version_atleast; -: 122: t_raqm_create create; -: 123: t_raqm_set_text set_text; -: 124: t_raqm_set_text_utf8 set_text_utf8; -: 125: t_raqm_set_par_direction set_par_direction; -: 126: t_raqm_set_language set_language; -: 127: t_raqm_add_font_feature add_font_feature; -: 128: t_raqm_set_freetype_face set_freetype_face; -: 129: t_raqm_layout layout; -: 130: t_raqm_get_glyphs get_glyphs; -: 131: t_raqm_get_glyphs_01 get_glyphs_01; -: 132: t_raqm_destroy destroy; -: 133:} p_raqm_func; -: 134: -: 135:static p_raqm_func p_raqm; -: 136: -: 137: -: 138:/* round a 26.6 pixel coordinate to the nearest integer */ -: 139:#define PIXEL(x) ((((x)+32) & -64)>>6) -: 140: -: 141:static PyObject* function geterror called 20 returned 100% blocks executed 78% 20: 142:geterror(int code) -: 143:{ -: 144: int i; -: 145: 42: 146: for (i = 0; ft_errors[i].message; i++) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 42: 147: if (ft_errors[i].code == code) { branch 0 taken 48% (fallthrough) branch 1 taken 52% 20: 148: PyErr_SetString(PyExc_OSError, ft_errors[i].message); call 0 returned 100% 20: 149: return NULL; -: 150: } -: 151: } -: 152: #####: 153: PyErr_SetString(PyExc_OSError, "unknown freetype error"); call 0 never executed #####: 154: return NULL; -: 155:} -: 156: -: 157:static int function setraqm called 3 returned 100% blocks executed 82% 3: 158:setraqm(void) -: 159:{ -: 160: /* set the static function pointers for dynamic raqm linking */ 3: 161: p_raqm.raqm = NULL; -: 162: -: 163: /* Microsoft needs a totally different system */ -: 164:#ifndef _WIN32 3: 165: p_raqm.raqm = dlopen("libraqm.so.0", RTLD_LAZY); call 0 returned 100% 3: 166: if (!p_raqm.raqm) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 167: p_raqm.raqm = dlopen("libraqm.dylib", RTLD_LAZY); call 0 never executed -: 168: } -: 169:#else -: 170: p_raqm.raqm = LoadLibrary("libraqm"); -: 171: /* MSYS */ -: 172: if (!p_raqm.raqm) { -: 173: p_raqm.raqm = LoadLibrary("libraqm-0"); -: 174: } -: 175:#endif -: 176: 3: 177: if (!p_raqm.raqm) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 178: return 1; -: 179: } -: 180: -: 181:#ifndef _WIN32 3: 182: p_raqm.version_string = (t_raqm_version_string)dlsym(p_raqm.raqm, "raqm_version_string"); call 0 returned 100% 3: 183: p_raqm.version_atleast = (t_raqm_version_atleast)dlsym(p_raqm.raqm, "raqm_version_atleast"); call 0 returned 100% 3: 184: p_raqm.create = (t_raqm_create)dlsym(p_raqm.raqm, "raqm_create"); call 0 returned 100% 3: 185: p_raqm.set_text = (t_raqm_set_text)dlsym(p_raqm.raqm, "raqm_set_text"); call 0 returned 100% 3: 186: p_raqm.set_text_utf8 = (t_raqm_set_text_utf8)dlsym(p_raqm.raqm, "raqm_set_text_utf8"); call 0 returned 100% 3: 187: p_raqm.set_par_direction = (t_raqm_set_par_direction)dlsym(p_raqm.raqm, "raqm_set_par_direction"); call 0 returned 100% 3: 188: p_raqm.set_language = (t_raqm_set_language)dlsym(p_raqm.raqm, "raqm_set_language"); call 0 returned 100% 3: 189: p_raqm.add_font_feature = (t_raqm_add_font_feature)dlsym(p_raqm.raqm, "raqm_add_font_feature"); call 0 returned 100% 3: 190: p_raqm.set_freetype_face = (t_raqm_set_freetype_face)dlsym(p_raqm.raqm, "raqm_set_freetype_face"); call 0 returned 100% 3: 191: p_raqm.layout = (t_raqm_layout)dlsym(p_raqm.raqm, "raqm_layout"); call 0 returned 100% 3: 192: p_raqm.destroy = (t_raqm_destroy)dlsym(p_raqm.raqm, "raqm_destroy"); call 0 returned 100% 3: 193: if(dlsym(p_raqm.raqm, "raqm_index_to_position")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 3: 194: p_raqm.get_glyphs = (t_raqm_get_glyphs)dlsym(p_raqm.raqm, "raqm_get_glyphs"); call 0 returned 100% 3: 195: p_raqm.version = 2; -: 196: } else { #####: 197: p_raqm.version = 1; #####: 198: p_raqm.get_glyphs_01 = (t_raqm_get_glyphs_01)dlsym(p_raqm.raqm, "raqm_get_glyphs"); call 0 never executed -: 199: } 6: 200: if (dlerror() || call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 100% (fallthrough) branch 4 taken 0% 9: 201: !(p_raqm.create && branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% 6: 202: p_raqm.set_text && branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 203: p_raqm.set_text_utf8 && branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 204: p_raqm.set_par_direction && branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 205: p_raqm.set_language && branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 206: p_raqm.add_font_feature && branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 207: p_raqm.set_freetype_face && branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 208: p_raqm.layout && branch 0 taken 0% (fallthrough) branch 1 taken 100% 3: 209: (p_raqm.get_glyphs || p_raqm.get_glyphs_01) && branch 0 never executed branch 1 never executed 3: 210: p_raqm.destroy)) { #####: 211: dlclose(p_raqm.raqm); call 0 never executed #####: 212: p_raqm.raqm = NULL; #####: 213: return 2; -: 214: } -: 215:#else -: 216: p_raqm.version_string = (t_raqm_version_string)GetProcAddress(p_raqm.raqm, "raqm_version_string"); -: 217: p_raqm.version_atleast = (t_raqm_version_atleast)GetProcAddress(p_raqm.raqm, "raqm_version_atleast"); -: 218: p_raqm.create = (t_raqm_create)GetProcAddress(p_raqm.raqm, "raqm_create"); -: 219: p_raqm.set_text = (t_raqm_set_text)GetProcAddress(p_raqm.raqm, "raqm_set_text"); -: 220: p_raqm.set_text_utf8 = (t_raqm_set_text_utf8)GetProcAddress(p_raqm.raqm, "raqm_set_text_utf8"); -: 221: p_raqm.set_par_direction = (t_raqm_set_par_direction)GetProcAddress(p_raqm.raqm, "raqm_set_par_direction"); -: 222: p_raqm.set_language = (t_raqm_set_language)GetProcAddress(p_raqm.raqm, "raqm_set_language"); -: 223: p_raqm.add_font_feature = (t_raqm_add_font_feature)GetProcAddress(p_raqm.raqm, "raqm_add_font_feature"); -: 224: p_raqm.set_freetype_face = (t_raqm_set_freetype_face)GetProcAddress(p_raqm.raqm, "raqm_set_freetype_face"); -: 225: p_raqm.layout = (t_raqm_layout)GetProcAddress(p_raqm.raqm, "raqm_layout"); -: 226: p_raqm.destroy = (t_raqm_destroy)GetProcAddress(p_raqm.raqm, "raqm_destroy"); -: 227: if(GetProcAddress(p_raqm.raqm, "raqm_index_to_position")) { -: 228: p_raqm.get_glyphs = (t_raqm_get_glyphs)GetProcAddress(p_raqm.raqm, "raqm_get_glyphs"); -: 229: p_raqm.version = 2; -: 230: } else { -: 231: p_raqm.version = 1; -: 232: p_raqm.get_glyphs_01 = (t_raqm_get_glyphs_01)GetProcAddress(p_raqm.raqm, "raqm_get_glyphs"); -: 233: } -: 234: if (!(p_raqm.create && -: 235: p_raqm.set_text && -: 236: p_raqm.set_text_utf8 && -: 237: p_raqm.set_par_direction && -: 238: p_raqm.set_language && -: 239: p_raqm.add_font_feature && -: 240: p_raqm.set_freetype_face && -: 241: p_raqm.layout && -: 242: (p_raqm.get_glyphs || p_raqm.get_glyphs_01) && -: 243: p_raqm.destroy)) { -: 244: FreeLibrary(p_raqm.raqm); -: 245: p_raqm.raqm = NULL; -: 246: return 2; -: 247: } -: 248:#endif -: 249: -: 250: return 0; -: 251:} -: 252: -: 253:static PyObject* function getfont called 270 returned 100% blocks executed 82% 270: 254:getfont(PyObject* self_, PyObject* args, PyObject* kw) -: 255:{ -: 256: /* create a font object from a file name and a size (in pixels) */ -: 257: -: 258: FontObject* self; 270: 259: int error = 0; -: 260: 270: 261: char* filename = NULL; -: 262: Py_ssize_t size; 270: 263: Py_ssize_t index = 0; 270: 264: Py_ssize_t layout_engine = 0; -: 265: unsigned char* encoding; -: 266: unsigned char* font_bytes; 270: 267: Py_ssize_t font_bytes_size = 0; -: 268: static char* kwlist[] = { -: 269: "filename", "size", "index", "encoding", "font_bytes", -: 270: "layout_engine", NULL -: 271: }; -: 272: 270: 273: if (!library) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 274: PyErr_SetString( call 0 never executed -: 275: PyExc_OSError, -: 276: "failed to initialize FreeType library" -: 277: ); #####: 278: return NULL; -: 279: } -: 280: 270: 281: if (!PyArg_ParseTupleAndKeywords(args, kw, "etn|nsy#n", kwlist, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 282: Py_FileSystemDefaultEncoding, &filename, -: 283: &size, &index, &encoding, &font_bytes, -: 284: &font_bytes_size, &layout_engine)) { -: 285: return NULL; -: 286: } -: 287: 270: 288: self = PyObject_New(FontObject, &Font_Type); call 0 returned 100% 270: 289: if (!self) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 290: if (filename) { branch 0 never executed branch 1 never executed #####: 291: PyMem_Free(filename); call 0 never executed -: 292: } -: 293: return NULL; -: 294: } -: 295: 270: 296: self->face = NULL; 270: 297: self->layout_engine = layout_engine; -: 298: 270: 299: if (filename && font_bytes_size <= 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 96% (fallthrough) branch 3 taken 4% 260: 300: self->font_bytes = NULL; 260: 301: error = FT_New_Face(library, filename, index, &self->face); call 0 returned 100% -: 302: } else { -: 303: /* need to have allocated storage for font_bytes for the life of the object.*/ -: 304: /* Don't free this before FT_Done_Face */ 10: 305: self->font_bytes = PyMem_Malloc(font_bytes_size); call 0 returned 100% 10: 306: if (!self->font_bytes) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 307: error = 65; // Out of Memory in Freetype. -: 308: } 10: 309: if (!error) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 20: 310: memcpy(self->font_bytes, font_bytes, (size_t)font_bytes_size); 10: 311: error = FT_New_Memory_Face(library, (FT_Byte*)self->font_bytes, call 0 returned 100% -: 312: font_bytes_size, index, &self->face); -: 313: } -: 314: } -: 315: 270: 316: if (!error) { branch 0 taken 93% (fallthrough) branch 1 taken 7% 250: 317: error = FT_Set_Pixel_Sizes(self->face, 0, size); call 0 returned 100% -: 318: } -: 319: 270: 320: if (!error && encoding && strlen((char*) encoding) == 4) { branch 0 taken 93% (fallthrough) branch 1 taken 7% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 321: FT_Encoding encoding_tag = FT_MAKE_TAG( -: 322: encoding[0], encoding[1], encoding[2], encoding[3] -: 323: ); #####: 324: error = FT_Select_Charmap(self->face, encoding_tag); call 0 never executed -: 325: } 270: 326: if (filename) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 270: 327: PyMem_Free(filename); call 0 returned 100% -: 328: } -: 329: 270: 330: if (error) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 20: 331: if (self->font_bytes) { branch 0 taken 10% (fallthrough) branch 1 taken 90% 2: 332: PyMem_Free(self->font_bytes); call 0 returned 100% 2: 333: self->font_bytes = NULL; -: 334: } 20: 335: Py_DECREF(self); branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% 20: 336: return geterror(error); call 0 returned 100% -: 337: } -: 338: -: 339: return (PyObject*) self; -: 340:} -: 341: -: 342:static int function font_getchar called 5524 returned 100% blocks executed 75% 5524: 343:font_getchar(PyObject* string, int index, FT_ULong* char_out) -: 344:{ 5524: 345: if (PyUnicode_Check(string)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 5524: 346: if (index >= PyUnicode_GET_LENGTH(string)) { branch 0 taken 87% (fallthrough) branch 1 taken 13% -: 347: return 0; -: 348: } 4816: 349: *char_out = PyUnicode_READ_CHAR(string, index); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 55% (fallthrough) branch 7 taken 45% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 0% (fallthrough) branch 11 taken 100% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 0% (fallthrough) branch 15 taken 100% 4816: 350: return 1; -: 351: } -: 352: return 0; -: 353:} -: 354: -: 355:static size_t function text_layout_raqm.isra.0 called 669 returned 100% blocks executed 74% 669: 356:text_layout_raqm(PyObject* string, FontObject* self, const char* dir, PyObject *features, -: 357: const char* lang, GlyphInfo **glyph_info, int mask, int color) -: 358:{ 669: 359: size_t i = 0, count = 0, start = 0; -: 360: raqm_t *rq; 669: 361: raqm_glyph_t *glyphs = NULL; 669: 362: raqm_glyph_t_01 *glyphs_01 = NULL; -: 363: raqm_direction_t direction; -: 364: 669: 365: rq = (*p_raqm.create)(); call 0 returned 100% 669: 366: if (rq == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 367: PyErr_SetString(PyExc_ValueError, "raqm_create() failed."); call 0 never executed -: 368: goto failed; -: 369: } -: 370: 669: 371: if (PyUnicode_Check(string)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 669: 372: Py_UCS4 *text = PyUnicode_AsUCS4Copy(string); call 0 returned 100% 669: 373: Py_ssize_t size = PyUnicode_GET_LENGTH(string); 669: 374: if (!text || !size) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 99% (fallthrough) branch 3 taken 1% -: 375: /* return 0 and clean up, no glyphs==no size, -: 376: and raqm fails with empty strings */ -: 377: goto failed; -: 378: } 661: 379: int set_text = (*p_raqm.set_text)(rq, text, size); call 0 returned 100% 661: 380: PyMem_Free(text); call 0 returned 100% 661: 381: if (!set_text) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 382: PyErr_SetString(PyExc_ValueError, "raqm_set_text() failed"); call 0 never executed -: 383: goto failed; -: 384: } 661: 385: if (lang) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2: 386: if (!(*p_raqm.set_language)(rq, lang, start, size)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 387: PyErr_SetString(PyExc_ValueError, "raqm_set_language() failed"); call 0 never executed -: 388: goto failed; -: 389: } -: 390: } -: 391: } -: 392: else { #####: 393: PyErr_SetString(PyExc_TypeError, "expected string"); call 0 never executed -: 394: goto failed; -: 395: } -: 396: 661: 397: direction = RAQM_DIRECTION_DEFAULT; 661: 398: if (dir) { branch 0 taken 15% (fallthrough) branch 1 taken 85% 102: 399: if (strcmp(dir, "rtl") == 0) { branch 0 taken 8% (fallthrough) branch 1 taken 92% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 92% (fallthrough) branch 7 taken 8% -: 400: direction = RAQM_DIRECTION_RTL; 94: 401: } else if (strcmp(dir, "ltr") == 0) { branch 0 taken 23% (fallthrough) branch 1 taken 77% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 77% (fallthrough) branch 7 taken 23% -: 402: direction = RAQM_DIRECTION_LTR; 72: 403: } else if (strcmp(dir, "ttb") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% 72: 404: direction = RAQM_DIRECTION_TTB; 72: 405: if (p_raqm.version_atleast == NULL || !(*p_raqm.version_atleast)(0, 7, 0)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% branch 3 taken 0% (fallthrough) branch 4 taken 100% #####: 406: PyErr_SetString(PyExc_ValueError, "libraqm 0.7 or greater required for 'ttb' direction"); call 0 never executed -: 407: goto failed; -: 408: } -: 409: } else { #####: 410: PyErr_SetString(PyExc_ValueError, "direction must be either 'rtl', 'ltr' or 'ttb'"); call 0 never executed -: 411: goto failed; -: 412: } -: 413: } -: 414: 661: 415: if (!(*p_raqm.set_par_direction)(rq, direction)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 416: PyErr_SetString(PyExc_ValueError, "raqm_set_par_direction() failed"); call 0 never executed -: 417: goto failed; -: 418: } -: 419: 661: 420: if (features != Py_None) { branch 0 taken 2% (fallthrough) branch 1 taken 98% -: 421: int j, len; 13: 422: PyObject *seq = PySequence_Fast(features, "expected a sequence"); call 0 returned 100% 13: 423: if (!seq) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 424: goto failed; -: 425: } -: 426: 13: 427: len = PySequence_Size(seq); call 0 returned 100% 30: 428: for (j = 0; j < len; j++) { branch 0 taken 57% branch 1 taken 43% (fallthrough) 17: 429: PyObject *item = PySequence_Fast_GET_ITEM(seq, j); branch 0 taken 100% (fallthrough) branch 1 taken 0% 17: 430: char *feature = NULL; 17: 431: Py_ssize_t size = 0; -: 432: PyObject *bytes; -: 433: 17: 434: if (!PyUnicode_Check(item)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 435: PyErr_SetString(PyExc_TypeError, "expected a string"); call 0 never executed -: 436: goto failed; -: 437: } -: 438: 17: 439: if (PyUnicode_Check(item)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 17: 440: bytes = PyUnicode_AsUTF8String(item); call 0 returned 100% 17: 441: if (bytes == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 442: goto failed; -: 443: } 17: 444: feature = PyBytes_AS_STRING(bytes); 17: 445: size = PyBytes_GET_SIZE(bytes); -: 446: } 17: 447: if (!(*p_raqm.add_font_feature)(rq, feature, size)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 448: PyErr_SetString(PyExc_ValueError, "raqm_add_font_feature() failed"); call 0 never executed -: 449: goto failed; -: 450: } -: 451: } -: 452: } -: 453: 661: 454: if (!(*p_raqm.set_freetype_face)(rq, self->face)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 455: PyErr_SetString(PyExc_RuntimeError, "raqm_set_freetype_face() failed."); call 0 never executed -: 456: goto failed; -: 457: } -: 458: 661: 459: if (!(*p_raqm.layout)(rq)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 460: PyErr_SetString(PyExc_RuntimeError, "raqm_layout() failed."); call 0 never executed -: 461: goto failed; -: 462: } -: 463: 661: 464: if (p_raqm.version == 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 465: glyphs_01 = (*p_raqm.get_glyphs_01)(rq, &count); call 0 never executed #####: 466: if (glyphs_01 == NULL) { branch 0 never executed branch 1 never executed #####: 467: PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); call 0 never executed #####: 468: count = 0; -: 469: goto failed; -: 470: } -: 471: } else { /* version == 2 */ 661: 472: glyphs = (*p_raqm.get_glyphs)(rq, &count); call 0 returned 100% 661: 473: if (glyphs == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 474: PyErr_SetString(PyExc_ValueError, "raqm_get_glyphs() failed."); call 0 never executed #####: 475: count = 0; -: 476: goto failed; -: 477: } -: 478: } -: 479: 661: 480: (*glyph_info) = PyMem_New(GlyphInfo, count); branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% 661: 481: if ((*glyph_info) == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 482: PyErr_SetString(PyExc_MemoryError, "PyMem_New() failed"); call 0 never executed #####: 483: count = 0; -: 484: goto failed; -: 485: } -: 486: 661: 487: if (p_raqm.version == 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 488: for (i = 0; i < count; i++) { branch 0 never executed branch 1 never executed #####: 489: (*glyph_info)[i].index = glyphs_01[i].index; #####: 490: (*glyph_info)[i].x_offset = glyphs_01[i].x_offset; #####: 491: (*glyph_info)[i].x_advance = glyphs_01[i].x_advance; #####: 492: (*glyph_info)[i].y_offset = glyphs_01[i].y_offset; #####: 493: (*glyph_info)[i].y_advance = glyphs_01[i].y_advance; #####: 494: (*glyph_info)[i].cluster = glyphs_01[i].cluster; -: 495: } -: 496: } else { 208595: 497: for (i = 0; i < count; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 208595: 498: (*glyph_info)[i].index = glyphs[i].index; 208595: 499: (*glyph_info)[i].x_offset = glyphs[i].x_offset; 208595: 500: (*glyph_info)[i].x_advance = glyphs[i].x_advance; 208595: 501: (*glyph_info)[i].y_offset = glyphs[i].y_offset; 208595: 502: (*glyph_info)[i].y_advance = glyphs[i].y_advance; 208595: 503: (*glyph_info)[i].cluster = glyphs[i].cluster; -: 504: } -: 505: } -: 506: -: 507:failed: 669: 508: (*p_raqm.destroy)(rq); call 0 returned 100% 669: 509: return count; -: 510:} -: 511: -: 512:static size_t function text_layout_fallback.isra.1 called 356 returned 100% blocks executed 75% 356: 513:text_layout_fallback(PyObject* string, FontObject* self, const char* dir, PyObject *features, -: 514: const char* lang, GlyphInfo **glyph_info, int mask, int color) -: 515:{ -: 516: int error, load_flags; -: 517: FT_ULong ch; -: 518: Py_ssize_t count; -: 519: FT_GlyphSlot glyph; 356: 520: FT_Bool kerning = FT_HAS_KERNING(self->face); 356: 521: FT_UInt last_index = 0; -: 522: int i; -: 523: 356: 524: if (features != Py_None || dir != NULL || lang != NULL) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 1% (fallthrough) branch 5 taken 99% 3: 525: PyErr_SetString(PyExc_KeyError, "setting text direction, language or font features is not supported without libraqm"); call 0 returned 100% -: 526: } 356: 527: if (!PyUnicode_Check(string)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 528: PyErr_SetString(PyExc_TypeError, "expected string"); call 0 never executed -: 529: return 0; -: 530: } -: 531: -: 532: count = 0; 2764: 533: while (font_getchar(string, count, &ch)) { call 0 returned 100% branch 1 taken 87% branch 2 taken 13% (fallthrough) 2408: 534: count++; -: 535: } 356: 536: if (count == 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 537: return 0; -: 538: } -: 539: 352: 540: (*glyph_info) = PyMem_New(GlyphInfo, count); branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% 352: 541: if ((*glyph_info) == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 542: PyErr_SetString(PyExc_MemoryError, "PyMem_New() failed"); call 0 never executed -: 543: return 0; -: 544: } -: 545: 352: 546: load_flags = FT_LOAD_DEFAULT; 352: 547: if (mask) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 5: 548: load_flags |= FT_LOAD_TARGET_MONO; -: 549: } -: 550:#ifdef FT_LOAD_COLOR 352: 551: if (color) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 4: 552: load_flags |= FT_LOAD_COLOR; -: 553: } -: 554:#endif 2760: 555: for (i = 0; font_getchar(string, i, &ch); i++) { call 0 returned 100% branch 1 taken 87% branch 2 taken 13% (fallthrough) 2408: 556: (*glyph_info)[i].index = FT_Get_Char_Index(self->face, ch); call 0 returned 100% 2408: 557: error = FT_Load_Glyph(self->face, (*glyph_info)[i].index, load_flags); call 0 returned 100% 2408: 558: if (error) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 559: geterror(error); call 0 never executed -: 560: return 0; -: 561: } 2408: 562: glyph = self->face->glyph; 2408: 563: (*glyph_info)[i].x_offset=0; 2408: 564: (*glyph_info)[i].y_offset=0; 2408: 565: if (kerning && last_index && (*glyph_info)[i].index) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed -: 566: FT_Vector delta; #####: 567: if (FT_Get_Kerning(self->face, last_index, (*glyph_info)[i].index, call 0 never executed branch 1 never executed branch 2 never executed -: 568: ft_kerning_default,&delta) == 0) { #####: 569: (*glyph_info)[i-1].x_advance += PIXEL(delta.x); #####: 570: (*glyph_info)[i-1].y_advance += PIXEL(delta.y); -: 571: } -: 572: } -: 573: 2408: 574: (*glyph_info)[i].x_advance = glyph->metrics.horiAdvance; -: 575: // y_advance is only used in ttb, which is not supported by basic layout 2408: 576: (*glyph_info)[i].y_advance = 0; 2408: 577: last_index = (*glyph_info)[i].index; 2408: 578: (*glyph_info)[i].cluster = ch; -: 579: } -: 580: return count; -: 581:} -: 582: -: 583:static size_t function text_layout called 1025 returned 100% blocks executed 100% 1025: 584:text_layout(PyObject* string, FontObject* self, const char* dir, PyObject *features, -: 585: const char* lang, GlyphInfo **glyph_info, int mask, int color) -: 586:{ -: 587: size_t count; -: 588: 1025: 589: if (p_raqm.raqm && self->layout_engine == LAYOUT_RAQM) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 65% (fallthrough) branch 3 taken 35% 669: 590: count = text_layout_raqm(string, self, dir, features, lang, glyph_info, mask, color); call 0 returned 100% -: 591: } else { 356: 592: count = text_layout_fallback(string, self, dir, features, lang, glyph_info, mask, color); call 0 returned 100% -: 593: } 1025: 594: return count; -: 595:} -: 596: -: 597:static PyObject* function font_getlength called 220 returned 100% blocks executed 100% 220: 598:font_getlength(FontObject* self, PyObject* args) -: 599:{ -: 600: int length; /* length along primary axis, in 26.6 precision */ 220: 601: GlyphInfo *glyph_info = NULL; /* computed text layout */ -: 602: size_t i, count; /* glyph_info index and length */ -: 603: int horizontal_dir; /* is primary axis horizontal? */ 220: 604: int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ 220: 605: int color = 0; /* is FT_LOAD_COLOR enabled? */ 220: 606: const char *mode = NULL; 220: 607: const char *dir = NULL; 220: 608: const char *lang = NULL; 220: 609: PyObject *features = Py_None; -: 610: PyObject *string; -: 611: -: 612: /* calculate size and bearing for a given string */ -: 613: 220: 614: if (!PyArg_ParseTuple(args, "O|zzOz:getlength", &string, &mode, &dir, &features, &lang)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 615: return NULL; -: 616: } -: 617: 220: 618: horizontal_dir = dir && strcmp(dir, "ttb") == 0 ? 0 : 1; branch 0 taken 16% (fallthrough) branch 1 taken 84% branch 2 taken 39% (fallthrough) branch 3 taken 61% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 39% (fallthrough) branch 9 taken 61% -: 619: 220: 620: mask = mode && strcmp(mode, "1") == 0; branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 11% (fallthrough) branch 3 taken 89% branch 4 taken 89% (fallthrough) branch 5 taken 11% 220: 621: color = mode && strcmp(mode, "RGBA") == 0; branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 622: 220: 623: count = text_layout(string, self, dir, features, lang, &glyph_info, mask, color); call 0 returned 100% 220: 624: if (PyErr_Occurred()) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 625: return NULL; -: 626: } -: 627: -: 628: length = 0; 1452: 629: for (i = 0; i < count; i++) { branch 0 taken 87% branch 1 taken 13% (fallthrough) 1452: 630: if (horizontal_dir) { branch 0 taken 94% (fallthrough) branch 1 taken 6% 1360: 631: length += glyph_info[i].x_advance; -: 632: } else { 92: 633: length -= glyph_info[i].y_advance; -: 634: } -: 635: } -: 636: 220: 637: if (glyph_info) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 220: 638: PyMem_Free(glyph_info); call 0 returned 100% 220: 639: glyph_info = NULL; -: 640: } -: 641: 220: 642: return PyLong_FromLong(length); call 0 returned 100% -: 643:} -: 644: -: 645:static PyObject* function font_getsize called 602 returned 100% blocks executed 97% 602: 646:font_getsize(FontObject* self, PyObject* args) -: 647:{ -: 648: int position; /* pen position along primary axis, in 26.6 precision */ -: 649: int advanced; /* pen position along primary axis, in pixels */ -: 650: int px, py; /* position of current glyph, in pixels */ -: 651: int x_min, x_max, y_min, y_max; /* text bounding box, in pixels */ -: 652: int x_anchor, y_anchor; /* offset of point drawn at (0, 0), in pixels */ -: 653: int load_flags; /* FreeType load_flags parameter */ -: 654: int error; -: 655: FT_Face face; -: 656: FT_Glyph glyph; -: 657: FT_BBox bbox; /* glyph bounding box */ 602: 658: GlyphInfo *glyph_info = NULL; /* computed text layout */ -: 659: size_t i, count; /* glyph_info index and length */ -: 660: int horizontal_dir; /* is primary axis horizontal? */ 602: 661: int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ 602: 662: int color = 0; /* is FT_LOAD_COLOR enabled? */ 602: 663: const char *mode = NULL; 602: 664: const char *dir = NULL; 602: 665: const char *lang = NULL; 602: 666: const char *anchor = NULL; 602: 667: PyObject *features = Py_None; -: 668: PyObject *string; -: 669: -: 670: /* calculate size and bearing for a given string */ -: 671: 602: 672: if (!PyArg_ParseTuple(args, "O|zzOzz:getsize", &string, &mode, &dir, &features, &lang, &anchor)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 673: return NULL; -: 674: } -: 675: 602: 676: horizontal_dir = dir && strcmp(dir, "ttb") == 0 ? 0 : 1; branch 0 taken 10% (fallthrough) branch 1 taken 90% branch 2 taken 92% (fallthrough) branch 3 taken 8% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 92% (fallthrough) branch 9 taken 8% -: 677: 602: 678: mask = mode && strcmp(mode, "1") == 0; branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 99% (fallthrough) branch 5 taken 1% 602: 679: color = mode && strcmp(mode, "RGBA") == 0; branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% -: 680: 602: 681: if (anchor == NULL) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 302: 682: anchor = horizontal_dir ? "la" : "lt"; branch 0 taken 2% (fallthrough) branch 1 taken 98% -: 683: } 602: 684: if (strlen(anchor) != 2) { branch 0 taken 92% (fallthrough) branch 1 taken 8% -: 685: goto bad_anchor; -: 686: } -: 687: 554: 688: count = text_layout(string, self, dir, features, lang, &glyph_info, mask, color); call 0 returned 100% 554: 689: if (PyErr_Occurred()) { call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 690: return NULL; -: 691: } -: 692: 551: 693: load_flags = FT_LOAD_DEFAULT; 551: 694: if (mask) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 695: load_flags |= FT_LOAD_TARGET_MONO; -: 696: } -: 697:#ifdef FT_LOAD_COLOR 551: 698: if (color) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 4: 699: load_flags |= FT_LOAD_COLOR; -: 700: } -: 701:#endif -: 702: -: 703: /* -: 704: * text bounds are given by: -: 705: * - bounding boxes of individual glyphs -: 706: * - pen line, i.e. 0 to `advanced` along primary axis -: 707: * this means point (0, 0) is part of the text bounding box -: 708: */ 551: 709: face = NULL; 551: 710: position = x_min = x_max = y_min = y_max = 0; 105935: 711: for (i = 0; i < count; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 105384: 712: face = self->face; -: 713: 105384: 714: if (horizontal_dir) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 105178: 715: px = PIXEL(position + glyph_info[i].x_offset); 105178: 716: py = PIXEL(glyph_info[i].y_offset); -: 717: 105178: 718: position += glyph_info[i].x_advance; 105178: 719: advanced = PIXEL(position); 105178: 720: if (advanced > x_max) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 105082: 721: x_max = advanced; -: 722: } -: 723: } else { 206: 724: px = PIXEL(glyph_info[i].x_offset); 206: 725: py = PIXEL(position + glyph_info[i].y_offset); -: 726: 206: 727: position += glyph_info[i].y_advance; 206: 728: advanced = PIXEL(position); 206: 729: if (advanced < y_min) { branch 0 taken 67% (fallthrough) branch 1 taken 33% 138: 730: y_min = advanced; -: 731: } -: 732: } -: 733: 105384: 734: error = FT_Load_Glyph(face, glyph_info[i].index, load_flags); call 0 returned 100% 105384: 735: if (error) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 736: return geterror(error); call 0 never executed -: 737: } -: 738: 105384: 739: error = FT_Get_Glyph(face->glyph, &glyph); call 0 returned 100% 105384: 740: if (error) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 741: return geterror(error); call 0 never executed -: 742: } -: 743: 105384: 744: FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_PIXELS, &bbox); call 0 returned 100% 105384: 745: bbox.xMax += px; 105384: 746: if (bbox.xMax > x_max) { branch 0 taken 10% (fallthrough) branch 1 taken 90% 10427: 747: x_max = bbox.xMax; -: 748: } 105384: 749: bbox.xMin += px; 105384: 750: if (bbox.xMin < x_min) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 107: 751: x_min = bbox.xMin; -: 752: } 105384: 753: bbox.yMax += py; 105384: 754: if (bbox.yMax > y_max) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 712: 755: y_max = bbox.yMax; -: 756: } 105384: 757: bbox.yMin += py; 105384: 758: if (bbox.yMin < y_min) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 234: 759: y_min = bbox.yMin; -: 760: } -: 761: 105384: 762: FT_Done_Glyph(glyph); call 0 returned 100% -: 763: } -: 764: 551: 765: if (glyph_info) { branch 0 taken 98% (fallthrough) branch 1 taken 2% 541: 766: PyMem_Free(glyph_info); call 0 returned 100% 541: 767: glyph_info = NULL; -: 768: } -: 769: 551: 770: x_anchor = y_anchor = 0; 551: 771: if (face) { branch 0 taken 98% (fallthrough) branch 1 taken 2% 541: 772: if (horizontal_dir) { branch 0 taken 93% (fallthrough) branch 1 taken 7% 502: 773: switch (anchor[0]) { branch 0 taken 13% branch 1 taken 7% branch 2 taken 75% branch 3 taken 5% -: 774: case 'l': // left -: 775: x_anchor = 0; -: 776: break; -: 777: case 'm': // middle (left + right) / 2 67: 778: x_anchor = PIXEL(position / 2); 67: 779: break; -: 780: case 'r': // right 36: 781: x_anchor = PIXEL(position); 36: 782: break; -: 783: case 's': // vertical baseline -: 784: default: -: 785: goto bad_anchor; -: 786: } 478: 787: switch (anchor[1]) { branch 0 taken 71% branch 1 taken 1% branch 2 taken 20% branch 3 taken 1% branch 4 taken 2% branch 5 taken 3% branch 6 taken 3% -: 788: case 'a': // ascender 337: 789: y_anchor = PIXEL(self->face->size->metrics.ascender); 337: 790: break; -: 791: case 't': // top 5: 792: y_anchor = y_max; 5: 793: break; -: 794: case 'm': // middle (ascender + descender) / 2 94: 795: y_anchor = PIXEL((self->face->size->metrics.ascender + self->face->size->metrics.descender) / 2); 94: 796: break; -: 797: case 's': // horizontal baseline -: 798: y_anchor = 0; -: 799: break; -: 800: case 'b': // bottom 5: 801: y_anchor = y_min; 5: 802: break; -: 803: case 'd': // descender 11: 804: y_anchor = PIXEL(self->face->size->metrics.descender); 11: 805: break; -: 806: default: -: 807: goto bad_anchor; -: 808: } -: 809: } else { 39: 810: switch (anchor[0]) { branch 0 taken 67% branch 1 taken 8% branch 2 taken 8% branch 3 taken 8% branch 4 taken 10% -: 811: case 'l': // left 26: 812: x_anchor = x_min; 26: 813: break; -: 814: case 'm': // middle (left + right) / 2 3: 815: x_anchor = (x_min + x_max) / 2; 3: 816: break; -: 817: case 'r': // right 3: 818: x_anchor = x_max; 3: 819: break; -: 820: case 's': // vertical baseline -: 821: x_anchor = 0; -: 822: break; -: 823: default: -: 824: goto bad_anchor; -: 825: } 35: 826: switch (anchor[1]) { branch 0 taken 6% branch 1 taken 6% branch 2 taken 43% branch 3 taken 46% -: 827: case 't': // top -: 828: y_anchor = 0; -: 829: break; -: 830: case 'm': // middle (top + bottom) / 2 2: 831: y_anchor = PIXEL(position / 2); 2: 832: break; -: 833: case 'b': // bottom 2: 834: y_anchor = PIXEL(position); 2: 835: break; -: 836: case 'a': // ascender -: 837: case 's': // horizontal baseline -: 838: case 'd': // descender -: 839: default: -: 840: goto bad_anchor; -: 841: } -: 842: } -: 843: } -: 844: 495: 845: return Py_BuildValue( call 0 returned 100% -: 846: "(ii)(ii)", -: 847: (x_max - x_min), (y_max - y_min), -: 848: (-x_anchor + x_min), -(-y_anchor + y_max) -: 849: ); -: 850: -: 851:bad_anchor: 104: 852: PyErr_Format(PyExc_ValueError, "bad anchor specified: %s", anchor); call 0 returned 100% 104: 853: return NULL; -: 854:} -: 855: -: 856:static PyObject* function font_render called 251 returned 100% blocks executed 84% 251: 857:font_render(FontObject* self, PyObject* args) -: 858:{ -: 859: int x, y; /* pen position, in 26.6 precision */ -: 860: int px, py; /* position of current glyph, in pixels */ -: 861: int x_min, y_max; /* text offset in 26.6 precision */ -: 862: int load_flags; /* FreeType load_flags parameter */ -: 863: int error; -: 864: FT_Glyph glyph; -: 865: FT_GlyphSlot glyph_slot; -: 866: FT_Bitmap bitmap; -: 867: FT_Bitmap bitmap_converted; /* initialized lazily, for non-8bpp fonts */ -: 868: FT_BitmapGlyph bitmap_glyph; 251: 869: FT_Stroker stroker = NULL; 251: 870: int bitmap_converted_ready = 0; /* has bitmap_converted been initialized */ 251: 871: GlyphInfo *glyph_info = NULL; /* computed text layout */ -: 872: size_t i, count; /* glyph_info index and length */ -: 873: int xx, yy; /* pixel offset of current glyph bitmap */ -: 874: int x0, x1; /* horizontal bounds of glyph bitmap to copy */ -: 875: unsigned int bitmap_y; /* glyph bitmap y index */ -: 876: unsigned char *source; /* glyph bitmap source buffer */ -: 877: unsigned char convert_scale; /* scale factor for non-8bpp bitmaps */ -: 878: Imaging im; -: 879: Py_ssize_t id; -: 880: int horizontal_dir; /* is primary axis horizontal? */ 251: 881: int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */ 251: 882: int color = 0; /* is FT_LOAD_COLOR enabled? */ 251: 883: int stroke_width = 0; 251: 884: PY_LONG_LONG foreground_ink_long = 0; -: 885: unsigned int foreground_ink; 251: 886: const char *mode = NULL; 251: 887: const char *dir = NULL; 251: 888: const char *lang = NULL; 251: 889: PyObject *features = Py_None; -: 890: PyObject* string; -: 891: -: 892: /* render string into given buffer (the buffer *must* have -: 893: the right size, or this will crash) */ -: 894: 251: 895: if (!PyArg_ParseTuple(args, "On|zzOziL:render", &string, &id, &mode, &dir, &features, &lang, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 896: &stroke_width, &foreground_ink_long)) { -: 897: return NULL; -: 898: } -: 899: 251: 900: horizontal_dir = dir && strcmp(dir, "ttb") == 0 ? 0 : 1; -: 901: 251: 902: mask = mode && strcmp(mode, "1") == 0; branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 99% (fallthrough) branch 5 taken 1% 251: 903: color = mode && strcmp(mode, "RGBA") == 0; branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 98% (fallthrough) branch 3 taken 2% -: 904: 251: 905: foreground_ink = foreground_ink_long; -: 906: -: 907:#ifdef FT_COLOR_H -: 908: if (color) { -: 909: FT_Color foreground_color; -: 910: FT_Byte* ink = (FT_Byte*)&foreground_ink; -: 911: foreground_color.red = ink[0]; -: 912: foreground_color.green = ink[1]; -: 913: foreground_color.blue = ink[2]; -: 914: foreground_color.alpha = (FT_Byte) 255; /* ink alpha is handled in ImageDraw.text */ -: 915: FT_Palette_Set_Foreground_Color(self->face, foreground_color); -: 916: } -: 917:#endif -: 918: 251: 919: count = text_layout(string, self, dir, features, lang, &glyph_info, mask, color); call 0 returned 100% 251: 920: if (PyErr_Occurred()) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 921: return NULL; -: 922: } 251: 923: if (count == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2: 924: Py_RETURN_NONE; -: 925: } -: 926: 249: 927: if (stroke_width) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 6: 928: error = FT_Stroker_New(library, &stroker); call 0 returned 100% 6: 929: if (error) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 930: return geterror(error); call 0 never executed -: 931: } -: 932: 6: 933: FT_Stroker_Set(stroker, (FT_Fixed)stroke_width*64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); call 0 returned 100% -: 934: } -: 935: 249: 936: im = (Imaging) id; 249: 937: load_flags = FT_LOAD_DEFAULT; 249: 938: if (mask) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 939: load_flags |= FT_LOAD_TARGET_MONO; -: 940: } -: 941:#ifdef FT_LOAD_COLOR 249: 942: if (color) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 4: 943: load_flags |= FT_LOAD_COLOR; -: 944: } -: 945:#endif -: 946: -: 947: /* -: 948: * calculate x_min and y_max -: 949: * must match font_getsize or there may be clipping! -: 950: */ 249: 951: x = y = x_min = y_max = 0; 104404: 952: for (i = 0; i < count; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 104155: 953: px = PIXEL(x + glyph_info[i].x_offset); 104155: 954: py = PIXEL(y + glyph_info[i].y_offset); -: 955: 104155: 956: error = FT_Load_Glyph(self->face, glyph_info[i].index, load_flags | FT_LOAD_RENDER); call 0 returned 100% 104155: 957: if (error) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 958: return geterror(error); call 0 never executed -: 959: } -: 960: 104155: 961: glyph_slot = self->face->glyph; 104155: 962: bitmap = glyph_slot->bitmap; -: 963: 104155: 964: if (glyph_slot->bitmap_top + py > y_max) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 382: 965: y_max = glyph_slot->bitmap_top + py; -: 966: } 104155: 967: if (glyph_slot->bitmap_left + px < x_min) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 49: 968: x_min = glyph_slot->bitmap_left + px; -: 969: } -: 970: 104155: 971: x += glyph_info[i].x_advance; 104155: 972: y += glyph_info[i].y_advance; -: 973: } -: 974: -: 975: /* set pen position to text origin */ 249: 976: x = (-x_min + stroke_width) << 6; 249: 977: y = (-y_max + (-stroke_width)) << 6; -: 978: 249: 979: if (stroker == NULL) { branch 0 taken 98% (fallthrough) branch 1 taken 2% 243: 980: load_flags |= FT_LOAD_RENDER; -: 981: } -: 982: 104404: 983: for (i = 0; i < count; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 104155: 984: px = PIXEL(x + glyph_info[i].x_offset); 104155: 985: py = PIXEL(y + glyph_info[i].y_offset); -: 986: 104155: 987: error = FT_Load_Glyph(self->face, glyph_info[i].index, load_flags); call 0 returned 100% 104155: 988: if (error) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 989: return geterror(error); call 0 never executed -: 990: } -: 991: 104155: 992: glyph_slot = self->face->glyph; 104155: 993: if (stroker != NULL) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 7: 994: error = FT_Get_Glyph(glyph_slot, &glyph); call 0 returned 100% 7: 995: if (!error) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 7: 996: error = FT_Glyph_Stroke(&glyph, stroker, 1); call 0 returned 100% -: 997: } 7: 998: if (!error) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 7: 999: FT_Vector origin = {0, 0}; 7: 1000: error = FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, &origin, 1); call 0 returned 100% -: 1001: } 7: 1002: if (error) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1003: return geterror(error); call 0 never executed -: 1004: } -: 1005: 7: 1006: bitmap_glyph = (FT_BitmapGlyph)glyph; -: 1007: 7: 1008: bitmap = bitmap_glyph->bitmap; 7: 1009: xx = px + bitmap_glyph->left; 7: 1010: yy = -(py + bitmap_glyph->top); -: 1011: } else { 104148: 1012: bitmap = glyph_slot->bitmap; 104148: 1013: xx = px + glyph_slot->bitmap_left; 104148: 1014: yy = -(py + glyph_slot->bitmap_top); -: 1015: } -: 1016: -: 1017: /* convert non-8bpp bitmaps */ 104155: 1018: switch (bitmap.pixel_mode) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 1019: case FT_PIXEL_MODE_MONO: -: 1020: convert_scale = 255; -: 1021: break; -: 1022: case FT_PIXEL_MODE_GRAY2: -: 1023: convert_scale = 255 / 3; -: 1024: break; -: 1025: case FT_PIXEL_MODE_GRAY4: -: 1026: convert_scale = 255 / 15; -: 1027: break; -: 1028: default: -: 1029: convert_scale = 1; -: 1030: } 104155: 1031: switch (bitmap.pixel_mode) { branch 0 taken 1% branch 1 taken 1% branch 2 taken 0% branch 3 taken 99% -: 1032: case FT_PIXEL_MODE_MONO: -: 1033: case FT_PIXEL_MODE_GRAY2: -: 1034: case FT_PIXEL_MODE_GRAY4: 76: 1035: if (!bitmap_converted_ready) { branch 0 taken 9% (fallthrough) branch 1 taken 91% -: 1036: -: 1037:#if FREETYPE_MAJOR > 2 ||\ -: 1038: (FREETYPE_MAJOR == 2 && FREETYPE_MINOR > 6) -: 1039: FT_Bitmap_Init(&bitmap_converted); -: 1040:#else 7: 1041: FT_Bitmap_New(&bitmap_converted); -: 1042:#endif 7: 1043: bitmap_converted_ready = 1; call 0 returned 100% -: 1044: } 76: 1045: error = FT_Bitmap_Convert(library, &bitmap, &bitmap_converted, 1); call 0 returned 100% 76: 1046: if (error) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1047: geterror(error); call 0 never executed #####: 1048: goto glyph_error; -: 1049: } 76: 1050: bitmap = bitmap_converted; -: 1051: /* bitmap is now FT_PIXEL_MODE_GRAY, fall through */ -: 1052: case FT_PIXEL_MODE_GRAY: -: 1053: break; -: 1054:#ifdef FT_LOAD_COLOR -: 1055: case FT_PIXEL_MODE_BGRA: 2: 1056: if (color) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 1057: break; -: 1058: } -: 1059: /* we didn't ask for color, fall through to default */ -: 1060:#endif -: 1061: default: #####: 1062: PyErr_SetString(PyExc_IOError, "unsupported bitmap pixel mode"); call 0 never executed #####: 1063: goto glyph_error; -: 1064: } -: 1065: -: 1066: /* clip glyph bitmap width to target image bounds */ 104155: 1067: x0 = 0; 104155: 1068: x1 = bitmap.width; 104155: 1069: if (xx < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1070: x0 = -xx; -: 1071: } 104155: 1072: if (xx + x1 > im->xsize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1073: x1 = im->xsize - xx; -: 1074: } -: 1075: 104155: 1076: source = (unsigned char*) bitmap.buffer; 932035: 1077: for (bitmap_y = 0; bitmap_y < bitmap.rows; bitmap_y++, yy++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) -: 1078: /* clip glyph bitmap height to target image bounds */ 827880: 1079: if (yy >= 0 && yy < im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 1080: /* blend this glyph into the buffer */ -: 1081: int k; -: 1082: unsigned char v; -: 1083: unsigned char* target; 827880: 1084: if (color) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 1085: /* target[RGB] returns the color, target[A] returns the mask */ -: 1086: /* target bands get split again in ImageDraw.text */ 734: 1087: target = im->image[yy] + xx * 4; -: 1088: } else { 827146: 1089: target = im->image8[yy] + xx; -: 1090: } -: 1091:#ifdef FT_LOAD_COLOR 827880: 1092: if (color && bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 35% (fallthrough) branch 3 taken 65% -: 1093: /* paste color glyph */ 34816: 1094: for (k = x0; k < x1; k++) { branch 0 taken 99% branch 1 taken 1% 34816: 1095: if (target[k * 4 + 3] < source[k * 4 + 3]) { branch 0 taken 66% (fallthrough) branch 1 taken 34% -: 1096: /* unpremultiply BGRa to RGBA */ 22876: 1097: target[k * 4 + 0] = CLIP8((255 * (int)source[k * 4 + 2]) / source[k * 4 + 3]); branch 0 taken 100% (fallthrough) branch 1 taken 0% 22876: 1098: target[k * 4 + 1] = CLIP8((255 * (int)source[k * 4 + 1]) / source[k * 4 + 3]); branch 0 taken 100% (fallthrough) branch 1 taken 0% 22876: 1099: target[k * 4 + 2] = CLIP8((255 * (int)source[k * 4 + 0]) / source[k * 4 + 3]); branch 0 taken 99% (fallthrough) branch 1 taken 1% 22876: 1100: target[k * 4 + 3] = source[k * 4 + 3]; -: 1101: } -: 1102: } -: 1103: } else -: 1104:#endif 827624: 1105: if (bitmap.pixel_mode == FT_PIXEL_MODE_GRAY) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 827624: 1106: if (color) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 1107: unsigned char* ink = (unsigned char*)&foreground_ink; 8064: 1108: for (k = x0; k < x1; k++) { branch 0 taken 94% branch 1 taken 6% 8064: 1109: v = source[k] * convert_scale; 8064: 1110: if (target[k * 4 + 3] < v) { branch 0 taken 35% (fallthrough) branch 1 taken 65% 2830: 1111: target[k * 4 + 0] = ink[0]; 2830: 1112: target[k * 4 + 1] = ink[1]; 2830: 1113: target[k * 4 + 2] = ink[2]; 2830: 1114: target[k * 4 + 3] = v; -: 1115: } -: 1116: } -: 1117: } else { 8612726: 1118: for (k = x0; k < x1; k++) { branch 0 taken 91% branch 1 taken 9% 8612726: 1119: v = source[k] * convert_scale; 8612726: 1120: if (target[k] < v) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 4285067: 1121: target[k] = v; -: 1122: } -: 1123: } -: 1124: } -: 1125: } else { #####: 1126: PyErr_SetString(PyExc_IOError, "unsupported bitmap pixel mode"); call 0 never executed #####: 1127: goto glyph_error; -: 1128: } -: 1129: } 827880: 1130: source += bitmap.pitch; -: 1131: } 104155: 1132: x += glyph_info[i].x_advance; 104155: 1133: y += glyph_info[i].y_advance; 104155: 1134: if (stroker != NULL) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 7: 1135: FT_Done_Glyph(glyph); call 0 returned 100% -: 1136: } -: 1137: } -: 1138: 249: 1139: if (bitmap_converted_ready) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 7: 1140: FT_Bitmap_Done(library, &bitmap_converted); call 0 returned 100% -: 1141: } 249: 1142: FT_Stroker_Done(stroker); call 0 returned 100% 249: 1143: PyMem_Del(glyph_info); call 0 returned 100% 249: 1144: Py_RETURN_NONE; -: 1145: -: 1146:glyph_error: #####: 1147: if (stroker != NULL) { branch 0 never executed branch 1 never executed #####: 1148: FT_Done_Glyph(glyph); call 0 never executed -: 1149: } #####: 1150: if (bitmap_converted_ready) { branch 0 never executed branch 1 never executed #####: 1151: FT_Bitmap_Done(library, &bitmap_converted); call 0 never executed -: 1152: } #####: 1153: FT_Stroker_Done(stroker); call 0 never executed #####: 1154: PyMem_Del(glyph_info); call 0 never executed #####: 1155: return NULL; -: 1156:} -: 1157: -: 1158:#if FREETYPE_MAJOR > 2 ||\ -: 1159: (FREETYPE_MAJOR == 2 && FREETYPE_MINOR > 9) ||\ -: 1160: (FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 9 && FREETYPE_PATCH == 1) -: 1161: static PyObject* -: 1162: font_getvarnames(FontObject* self) -: 1163: { -: 1164: int error; -: 1165: FT_UInt i, j, num_namedstyles, name_count; -: 1166: FT_MM_Var *master; -: 1167: FT_SfntName name; -: 1168: PyObject *list_names, *list_name; -: 1169: -: 1170: error = FT_Get_MM_Var(self->face, &master); -: 1171: if (error) { -: 1172: return geterror(error); -: 1173: } -: 1174: -: 1175: num_namedstyles = master->num_namedstyles; -: 1176: list_names = PyList_New(num_namedstyles); -: 1177: -: 1178: name_count = FT_Get_Sfnt_Name_Count(self->face); -: 1179: for (i = 0; i < name_count; i++) { -: 1180: error = FT_Get_Sfnt_Name(self->face, i, &name); -: 1181: if (error) { -: 1182: return geterror(error); -: 1183: } -: 1184: -: 1185: for (j = 0; j < num_namedstyles; j++) { -: 1186: if (PyList_GetItem(list_names, j) != NULL) { -: 1187: continue; -: 1188: } -: 1189: -: 1190: if (master->namedstyle[j].strid == name.name_id) { -: 1191: list_name = Py_BuildValue("y#", name.string, name.string_len); -: 1192: PyList_SetItem(list_names, j, list_name); -: 1193: break; -: 1194: } -: 1195: } -: 1196: } -: 1197: -: 1198: FT_Done_MM_Var(library, master); -: 1199: -: 1200: return list_names; -: 1201: } -: 1202: -: 1203: static PyObject* -: 1204: font_getvaraxes(FontObject* self) -: 1205: { -: 1206: int error; -: 1207: FT_UInt i, j, num_axis, name_count; -: 1208: FT_MM_Var* master; -: 1209: FT_Var_Axis axis; -: 1210: FT_SfntName name; -: 1211: PyObject *list_axes, *list_axis, *axis_name; -: 1212: error = FT_Get_MM_Var(self->face, &master); -: 1213: if (error) { -: 1214: return geterror(error); -: 1215: } -: 1216: -: 1217: num_axis = master->num_axis; -: 1218: name_count = FT_Get_Sfnt_Name_Count(self->face); -: 1219: -: 1220: list_axes = PyList_New(num_axis); -: 1221: for (i = 0; i < num_axis; i++) { -: 1222: axis = master->axis[i]; -: 1223: -: 1224: list_axis = PyDict_New(); -: 1225: PyDict_SetItemString(list_axis, "minimum", -: 1226: PyLong_FromLong(axis.minimum / 65536)); -: 1227: PyDict_SetItemString(list_axis, "default", -: 1228: PyLong_FromLong(axis.def / 65536)); -: 1229: PyDict_SetItemString(list_axis, "maximum", -: 1230: PyLong_FromLong(axis.maximum / 65536)); -: 1231: -: 1232: for (j = 0; j < name_count; j++) { -: 1233: error = FT_Get_Sfnt_Name(self->face, j, &name); -: 1234: if (error) { -: 1235: return geterror(error); -: 1236: } -: 1237: -: 1238: if (name.name_id == axis.strid) { -: 1239: axis_name = Py_BuildValue("y#", name.string, name.string_len); -: 1240: PyDict_SetItemString(list_axis, "name", axis_name); -: 1241: break; -: 1242: } -: 1243: } -: 1244: -: 1245: PyList_SetItem(list_axes, i, list_axis); -: 1246: } -: 1247: -: 1248: FT_Done_MM_Var(library, master); -: 1249: -: 1250: return list_axes; -: 1251: } -: 1252: -: 1253: static PyObject* -: 1254: font_setvarname(FontObject* self, PyObject* args) -: 1255: { -: 1256: int error; -: 1257: -: 1258: int instance_index; -: 1259: if (!PyArg_ParseTuple(args, "i", &instance_index)) { -: 1260: return NULL; -: 1261: } -: 1262: -: 1263: error = FT_Set_Named_Instance(self->face, instance_index); -: 1264: if (error) { -: 1265: return geterror(error); -: 1266: } -: 1267: -: 1268: Py_INCREF(Py_None); -: 1269: return Py_None; -: 1270: } -: 1271: -: 1272: static PyObject* -: 1273: font_setvaraxes(FontObject* self, PyObject* args) -: 1274: { -: 1275: int error; -: 1276: -: 1277: PyObject *axes, *item; -: 1278: Py_ssize_t i, num_coords; -: 1279: FT_Fixed *coords; -: 1280: FT_Fixed coord; -: 1281: if (!PyArg_ParseTuple(args, "O", &axes)) { -: 1282: return NULL; -: 1283: } -: 1284: -: 1285: if (!PyList_Check(axes)) { -: 1286: PyErr_SetString(PyExc_TypeError, "argument must be a list"); -: 1287: return NULL; -: 1288: } -: 1289: -: 1290: num_coords = PyObject_Length(axes); -: 1291: coords = malloc(2 * sizeof(coords)); -: 1292: if (coords == NULL) { -: 1293: return PyErr_NoMemory(); -: 1294: } -: 1295: for (i = 0; i < num_coords; i++) { -: 1296: item = PyList_GET_ITEM(axes, i); -: 1297: if (PyFloat_Check(item)) { -: 1298: coord = PyFloat_AS_DOUBLE(item); -: 1299: } else if (PyLong_Check(item)) { -: 1300: coord = (float) PyLong_AS_LONG(item); -: 1301: } else if (PyNumber_Check(item)) { -: 1302: coord = PyFloat_AsDouble(item); -: 1303: } else { -: 1304: free(coords); -: 1305: PyErr_SetString(PyExc_TypeError, "list must contain numbers"); -: 1306: return NULL; -: 1307: } -: 1308: coords[i] = coord * 65536; -: 1309: } -: 1310: -: 1311: error = FT_Set_Var_Design_Coordinates(self->face, num_coords, coords); -: 1312: free(coords); -: 1313: if (error) { -: 1314: return geterror(error); -: 1315: } -: 1316: -: 1317: Py_INCREF(Py_None); -: 1318: return Py_None; -: 1319: } -: 1320:#endif -: 1321: -: 1322:static void function font_dealloc called 270 returned 100% blocks executed 100% 270: 1323:font_dealloc(FontObject* self) -: 1324:{ 270: 1325: if (self->face) { branch 0 taken 93% (fallthrough) branch 1 taken 7% 250: 1326: FT_Done_Face(self->face); call 0 returned 100% -: 1327: } 270: 1328: if (self->font_bytes) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 8: 1329: PyMem_Free(self->font_bytes); call 0 returned 100% -: 1330: } 270: 1331: PyObject_Del(self); call 0 returned 100% 270: 1332:} -: 1333: -: 1334:static PyMethodDef font_methods[] = { -: 1335: {"render", (PyCFunction) font_render, METH_VARARGS}, -: 1336: {"getsize", (PyCFunction) font_getsize, METH_VARARGS}, -: 1337: {"getlength", (PyCFunction) font_getlength, METH_VARARGS}, -: 1338:#if FREETYPE_MAJOR > 2 ||\ -: 1339: (FREETYPE_MAJOR == 2 && FREETYPE_MINOR > 9) ||\ -: 1340: (FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 9 && FREETYPE_PATCH == 1) -: 1341: {"getvarnames", (PyCFunction) font_getvarnames, METH_NOARGS }, -: 1342: {"getvaraxes", (PyCFunction) font_getvaraxes, METH_NOARGS }, -: 1343: {"setvarname", (PyCFunction) font_setvarname, METH_VARARGS}, -: 1344: {"setvaraxes", (PyCFunction) font_setvaraxes, METH_VARARGS}, -: 1345:#endif -: 1346: {NULL, NULL} -: 1347:}; -: 1348: -: 1349:static PyObject* function font_getattr_family called 18 returned 100% blocks executed 75% 18: 1350:font_getattr_family(FontObject* self, void* closure) -: 1351:{ 18: 1352: if (self->face->family_name) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 18: 1353: return PyUnicode_FromString(self->face->family_name); call 0 returned 100% -: 1354: } #####: 1355: Py_RETURN_NONE; -: 1356:} -: 1357: -: 1358:static PyObject* function font_getattr_style called 18 returned 100% blocks executed 75% 18: 1359:font_getattr_style(FontObject* self, void* closure) -: 1360:{ 18: 1361: if (self->face->style_name) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 18: 1362: return PyUnicode_FromString(self->face->style_name); call 0 returned 100% -: 1363: } #####: 1364: Py_RETURN_NONE; -: 1365:} -: 1366: -: 1367:static PyObject* function font_getattr_ascent called 6 returned 100% blocks executed 100% 6: 1368:font_getattr_ascent(FontObject* self, void* closure) -: 1369:{ 6: 1370: return PyLong_FromLong(PIXEL(self->face->size->metrics.ascender)); call 0 returned 100% -: 1371:} -: 1372: -: 1373:static PyObject* function font_getattr_descent called 6 returned 100% blocks executed 100% 6: 1374:font_getattr_descent(FontObject* self, void* closure) -: 1375:{ 6: 1376: return PyLong_FromLong(-PIXEL(self->face->size->metrics.descender)); call 0 returned 100% -: 1377:} -: 1378: -: 1379:static PyObject* function font_getattr_height called 2 returned 100% blocks executed 100% 2: 1380:font_getattr_height(FontObject* self, void* closure) -: 1381:{ 2: 1382: return PyLong_FromLong(PIXEL(self->face->size->metrics.height)); call 0 returned 100% -: 1383:} -: 1384: -: 1385:static PyObject* function font_getattr_x_ppem called 2 returned 100% blocks executed 100% 2: 1386:font_getattr_x_ppem(FontObject* self, void* closure) -: 1387:{ 2: 1388: return PyLong_FromLong(self->face->size->metrics.x_ppem); call 0 returned 100% -: 1389:} -: 1390: -: 1391:static PyObject* function font_getattr_y_ppem called 2 returned 100% blocks executed 100% 2: 1392:font_getattr_y_ppem(FontObject* self, void* closure) -: 1393:{ 2: 1394: return PyLong_FromLong(self->face->size->metrics.y_ppem); call 0 returned 100% -: 1395:} -: 1396: -: 1397: -: 1398:static PyObject* function font_getattr_glyphs called 2 returned 100% blocks executed 100% 2: 1399:font_getattr_glyphs(FontObject* self, void* closure) -: 1400:{ 2: 1401: return PyLong_FromLong(self->face->num_glyphs); call 0 returned 100% -: 1402:} -: 1403: -: 1404:static struct PyGetSetDef font_getsetters[] = { -: 1405: { "family", (getter) font_getattr_family }, -: 1406: { "style", (getter) font_getattr_style }, -: 1407: { "ascent", (getter) font_getattr_ascent }, -: 1408: { "descent", (getter) font_getattr_descent }, -: 1409: { "height", (getter) font_getattr_height }, -: 1410: { "x_ppem", (getter) font_getattr_x_ppem }, -: 1411: { "y_ppem", (getter) font_getattr_y_ppem }, -: 1412: { "glyphs", (getter) font_getattr_glyphs }, -: 1413: { NULL } -: 1414:}; -: 1415: -: 1416:static PyTypeObject Font_Type = { -: 1417: PyVarObject_HEAD_INIT(NULL, 0) -: 1418: "Font", sizeof(FontObject), 0, -: 1419: /* methods */ -: 1420: (destructor)font_dealloc, /* tp_dealloc */ -: 1421: 0, /* tp_print */ -: 1422: 0, /*tp_getattr*/ -: 1423: 0, /*tp_setattr*/ -: 1424: 0, /*tp_compare*/ -: 1425: 0, /*tp_repr*/ -: 1426: 0, /*tp_as_number */ -: 1427: 0, /*tp_as_sequence */ -: 1428: 0, /*tp_as_mapping */ -: 1429: 0, /*tp_hash*/ -: 1430: 0, /*tp_call*/ -: 1431: 0, /*tp_str*/ -: 1432: 0, /*tp_getattro*/ -: 1433: 0, /*tp_setattro*/ -: 1434: 0, /*tp_as_buffer*/ -: 1435: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 1436: 0, /*tp_doc*/ -: 1437: 0, /*tp_traverse*/ -: 1438: 0, /*tp_clear*/ -: 1439: 0, /*tp_richcompare*/ -: 1440: 0, /*tp_weaklistoffset*/ -: 1441: 0, /*tp_iter*/ -: 1442: 0, /*tp_iternext*/ -: 1443: font_methods, /*tp_methods*/ -: 1444: 0, /*tp_members*/ -: 1445: font_getsetters, /*tp_getset*/ -: 1446:}; -: 1447: -: 1448:static PyMethodDef _functions[] = { -: 1449: {"getfont", (PyCFunction) getfont, METH_VARARGS|METH_KEYWORDS}, -: 1450: {NULL, NULL} -: 1451:}; -: 1452: -: 1453:static int function setup_module called 3 returned 100% blocks executed 100% 3: 1454:setup_module(PyObject* m) { -: 1455: PyObject* d; -: 1456: PyObject* v; -: 1457: int major, minor, patch; -: 1458: 3: 1459: d = PyModule_GetDict(m); call 0 returned 100% -: 1460: -: 1461: /* Ready object type */ 3: 1462: PyType_Ready(&Font_Type); call 0 returned 100% -: 1463: 3: 1464: if (FT_Init_FreeType(&library)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1465: return 0; /* leave it uninitialized */ -: 1466: } -: 1467: 3: 1468: FT_Library_Version(library, &major, &minor, &patch); call 0 returned 100% -: 1469: 3: 1470: v = PyUnicode_FromFormat("%d.%d.%d", major, minor, patch); call 0 returned 100% 3: 1471: PyDict_SetItemString(d, "freetype2_version", v); call 0 returned 100% -: 1472: -: 1473: 3: 1474: setraqm(); call 0 returned 100% 3: 1475: v = PyBool_FromLong(!!p_raqm.raqm); call 0 returned 100% 3: 1476: PyDict_SetItemString(d, "HAVE_RAQM", v); call 0 returned 100% 3: 1477: if (p_raqm.version_string) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 3: 1478: PyDict_SetItemString(d, "raqm_version", PyUnicode_FromString(p_raqm.version_string())); call 0 returned 100% call 1 returned 100% call 2 returned 100% -: 1479: } -: 1480: -: 1481: return 0; -: 1482:} -: 1483: -: 1484:PyMODINIT_FUNC function PyInit__imagingft called 3 returned 100% blocks executed 100% 3: 1485:PyInit__imagingft(void) { -: 1486: PyObject* m; -: 1487: -: 1488: static PyModuleDef module_def = { -: 1489: PyModuleDef_HEAD_INIT, -: 1490: "_imagingft", /* m_name */ -: 1491: NULL, /* m_doc */ -: 1492: -1, /* m_size */ -: 1493: _functions, /* m_methods */ -: 1494: }; -: 1495: 3: 1496: m = PyModule_Create(&module_def); call 0 returned 100% -: 1497: 3: 1498: if (setup_module(m) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1499: return NULL; -: 1500: } -: 1501: 3: 1502: return m; -: 1503:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/#usr#include#powerpc64le-linux-gnu#bits#string3.h.gcov -: 0:Source:/usr/include/powerpc64le-linux-gnu/bits/string3.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/GetBBox.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/GetBBox.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* Copyright (C) 2004-2016 Free Software Foundation, Inc. -: 2: This file is part of the GNU C Library. -: 3: -: 4: The GNU C Library is free software; you can redistribute it and/or -: 5: modify it under the terms of the GNU Lesser General Public -: 6: License as published by the Free Software Foundation; either -: 7: version 2.1 of the License, or (at your option) any later version. -: 8: -: 9: The GNU C Library is distributed in the hope that it will be useful, -: 10: but WITHOUT ANY WARRANTY; without even the implied warranty of -: 11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -: 12: Lesser General Public License for more details. -: 13: -: 14: You should have received a copy of the GNU Lesser General Public -: 15: License along with the GNU C Library; if not, see -: 16: . */ -: 17: -: 18:#ifndef _STRING_H -: 19:# error "Never use directly; include instead." -: 20:#endif -: 21: -: 22:#if !__GNUC_PREREQ (5,0) -: 23:__warndecl (__warn_memset_zero_len, -: 24: "memset used with constant zero length parameter; this could be due to transposed parameters"); -: 25:#endif -: 26: -: 27:#ifndef __cplusplus -: 28:/* XXX This is temporarily. We should not redefine any of the symbols -: 29: and instead integrate the error checking into the original -: 30: definitions. */ -: 31:# undef memcpy -: 32:# undef memmove -: 33:# undef memset -: 34:# undef strcat -: 35:# undef strcpy -: 36:# undef strncat -: 37:# undef strncpy -: 38:# ifdef __USE_GNU -: 39:# undef mempcpy -: 40:# undef stpcpy -: 41:# endif -: 42:# ifdef __USE_MISC -: 43:# undef bcopy -: 44:# undef bzero -: 45:# endif -: 46:#endif -: 47: -: 48: -: 49:__fortify_function void * -: 50:__NTH (memcpy (void *__restrict __dest, const void *__restrict __src, -: 51: size_t __len)) -: 52:{ 22: 53: return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); -: 54:} -: 55: -: 56:__fortify_function void * -: 57:__NTH (memmove (void *__dest, const void *__src, size_t __len)) -: 58:{ -: 59: return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); -: 60:} -: 61: -: 62:#ifdef __USE_GNU -: 63:__fortify_function void * -: 64:__NTH (mempcpy (void *__restrict __dest, const void *__restrict __src, -: 65: size_t __len)) -: 66:{ -: 67: return __builtin___mempcpy_chk (__dest, __src, __len, __bos0 (__dest)); -: 68:} -: 69:#endif -: 70: -: 71: -: 72:/* The first two tests here help to catch a somewhat common problem -: 73: where the second and third parameter are transposed. This is -: 74: especially problematic if the intended fill value is zero. In this -: 75: case no work is done at all. We detect these problems by referring -: 76: non-existing functions. */ -: 77:__fortify_function void * -: 78:__NTH (memset (void *__dest, int __ch, size_t __len)) -: 79:{ -: 80: /* GCC-5.0 and newer implements these checks in the compiler, so we don't -: 81: need them here. */ -: 82:#if !__GNUC_PREREQ (5,0) -: 83: if (__builtin_constant_p (__len) && __len == 0 -: 84: && (!__builtin_constant_p (__ch) || __ch != 0)) -: 85: { -: 86: __warn_memset_zero_len (); -: 87: return __dest; -: 88: } -: 89:#endif 20: 90: return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest)); -: 91:} -: 92: -: 93:#ifdef __USE_MISC -: 94:__fortify_function void -: 95:__NTH (bcopy (const void *__src, void *__dest, size_t __len)) -: 96:{ -: 97: (void) __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); -: 98:} -: 99: -: 100:__fortify_function void -: 101:__NTH (bzero (void *__dest, size_t __len)) -: 102:{ -: 103: (void) __builtin___memset_chk (__dest, '\0', __len, __bos0 (__dest)); -: 104:} -: 105:#endif -: 106: -: 107:__fortify_function char * -: 108:__NTH (strcpy (char *__restrict __dest, const char *__restrict __src)) -: 109:{ -: 110: return __builtin___strcpy_chk (__dest, __src, __bos (__dest)); -: 111:} -: 112: -: 113:#ifdef __USE_GNU -: 114:__fortify_function char * -: 115:__NTH (stpcpy (char *__restrict __dest, const char *__restrict __src)) -: 116:{ -: 117: return __builtin___stpcpy_chk (__dest, __src, __bos (__dest)); -: 118:} -: 119:#endif -: 120: -: 121: -: 122:__fortify_function char * -: 123:__NTH (strncpy (char *__restrict __dest, const char *__restrict __src, -: 124: size_t __len)) -: 125:{ -: 126: return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); -: 127:} -: 128: -: 129:// XXX We have no corresponding builtin yet. -: 130:extern char *__stpncpy_chk (char *__dest, const char *__src, size_t __n, -: 131: size_t __destlen) __THROW; -: 132:extern char *__REDIRECT_NTH (__stpncpy_alias, (char *__dest, const char *__src, -: 133: size_t __n), stpncpy); -: 134: -: 135:__fortify_function char * -: 136:__NTH (stpncpy (char *__dest, const char *__src, size_t __n)) -: 137:{ -: 138: if (__bos (__dest) != (size_t) -1 -: 139: && (!__builtin_constant_p (__n) || __n > __bos (__dest))) -: 140: return __stpncpy_chk (__dest, __src, __n, __bos (__dest)); -: 141: return __stpncpy_alias (__dest, __src, __n); -: 142:} -: 143: -: 144: -: 145:__fortify_function char * -: 146:__NTH (strcat (char *__restrict __dest, const char *__restrict __src)) -: 147:{ -: 148: return __builtin___strcat_chk (__dest, __src, __bos (__dest)); -: 149:} -: 150: -: 151: -: 152:__fortify_function char * -: 153:__NTH (strncat (char *__restrict __dest, const char *__restrict __src, -: 154: size_t __len)) -: 155:{ -: 156: return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest)); -: 157:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Unpack.c.gcov -: 0:Source:src/libImaging/Unpack.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Unpack.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Unpack.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * code to unpack raw data from various file formats -: 6: * -: 7: * history: -: 8: * 1996-03-07 fl Created (from various decoders) -: 9: * 1996-04-19 fl Added band unpackers -: 10: * 1996-05-12 fl Published RGB unpackers -: 11: * 1996-05-27 fl Added nibble unpacker -: 12: * 1996-12-10 fl Added complete set of PNG unpackers -: 13: * 1996-12-29 fl Set alpha byte in RGB unpackers -: 14: * 1997-01-05 fl Added remaining TGA unpackers -: 15: * 1997-01-18 fl Added inverting band unpackers -: 16: * 1997-01-25 fl Added FlashPix unpackers -: 17: * 1997-05-31 fl Added floating point unpackers -: 18: * 1998-02-08 fl Added I unpacker -: 19: * 1998-07-01 fl Added YCbCr unpacker -: 20: * 1998-07-02 fl Added full set of integer unpackers -: 21: * 1998-12-29 fl Added mode field, I;16 unpackers -: 22: * 1998-12-30 fl Added RGBX modes -: 23: * 1999-02-04 fl Fixed I;16 unpackers -: 24: * 2003-05-13 fl Added L/RGB reversed unpackers -: 25: * 2003-09-26 fl Added LA/PA and RGBa->RGB unpackers -: 26: * -: 27: * Copyright (c) 1997-2003 by Secret Labs AB. -: 28: * Copyright (c) 1996-1997 by Fredrik Lundh. -: 29: * -: 30: * See the README file for information on usage and redistribution. -: 31: */ -: 32: -: 33:#include "Imaging.h" -: 34: -: 35:#define R 0 -: 36:#define G 1 -: 37:#define B 2 -: 38:#define X 3 -: 39: -: 40:#define A 3 -: 41: -: 42:#define C 0 -: 43:#define M 1 -: 44:#define Y 2 -: 45:#define K 3 -: 46: -: 47:/* byte-swapping macros */ -: 48: -: 49:#define C16N\ -: 50: (tmp[0]=in[0], tmp[1]=in[1]); -: 51:#define C16S\ -: 52: (tmp[1]=in[0], tmp[0]=in[1]); -: 53:#define C32N\ -: 54: (tmp[0]=in[0], tmp[1]=in[1], tmp[2]=in[2], tmp[3]=in[3]); -: 55:#define C32S\ -: 56: (tmp[3]=in[0], tmp[2]=in[1], tmp[1]=in[2], tmp[0]=in[3]); -: 57:#define C64N\ -: 58: (tmp[0]=in[0], tmp[1]=in[1], tmp[2]=in[2], tmp[3]=in[3],\ -: 59: tmp[4]=in[4], tmp[5]=in[5], tmp[6]=in[6], tmp[7]=in[7]); -: 60:#define C64S\ -: 61: (tmp[7]=in[0], tmp[6]=in[1], tmp[5]=in[2], tmp[4]=in[3],\ -: 62: tmp[3]=in[4], tmp[2]=in[5], tmp[1]=in[6], tmp[0]=in[7]); -: 63: -: 64:#ifdef WORDS_BIGENDIAN -: 65:#define C16B C16N -: 66:#define C16L C16S -: 67:#define C32B C32N -: 68:#define C32L C32S -: 69:#define C64B C64N -: 70:#define C64L C64S -: 71:#else -: 72:#define C16B C16S -: 73:#define C16L C16N -: 74:#define C32B C32S -: 75:#define C32L C32N -: 76:#define C64B C64S -: 77:#define C64L C64N -: 78:#endif -: 79: -: 80:/* bit-swapping */ -: 81: -: 82:static UINT8 BITFLIP[] = { -: 83: 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, -: 84: 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, -: 85: 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, -: 86: 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, -: 87: 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, -: 88: 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, -: 89: 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, -: 90: 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, -: 91: 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, -: 92: 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, -: 93: 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, -: 94: 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, -: 95: 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, -: 96: 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, -: 97: 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, -: 98: 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, -: 99: 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, -: 100: 255 -: 101:}; -: 102: -: 103:/* Unpack to "1" image */ -: 104: -: 105:static void function unpack1 called 282690 returned 100% blocks executed 100% 282690: 106:unpack1(UINT8* out, const UINT8* in, int pixels) -: 107:{ -: 108: /* bits (msb first, white is non-zero) */ 2319258: 109: while (pixels > 0) { branch 0 taken 86% branch 1 taken 14% (fallthrough) 1753878: 110: UINT8 byte = *in++; 1753878: 111: switch (pixels) { branch 0 taken 84% branch 1 taken 1% branch 2 taken 1% branch 3 taken 1% branch 4 taken 1% branch 5 taken 1% branch 6 taken 15% branch 7 taken 1% 1479482: 112: default: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; branch 0 taken 58% (fallthrough) branch 1 taken 42% 1480978: 113: case 7: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; branch 0 taken 55% (fallthrough) branch 1 taken 45% 1481466: 114: case 6: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; branch 0 taken 54% (fallthrough) branch 1 taken 46% 1481819: 115: case 5: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; branch 0 taken 57% (fallthrough) branch 1 taken 43% 1481932: 116: case 4: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; branch 0 taken 55% (fallthrough) branch 1 taken 45% 1484000: 117: case 3: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; branch 0 taken 55% (fallthrough) branch 1 taken 45% 1750581: 118: case 2: *out++ = (byte & 128) ? 255 : 0; byte <<= 1; branch 0 taken 60% (fallthrough) branch 1 taken 40% 1753878: 119: case 1: *out++ = (byte & 128) ? 255 : 0; branch 0 taken 61% (fallthrough) branch 1 taken 39% -: 120: } 1753878: 121: pixels -= 8; -: 122: } 282690: 123:} -: 124: -: 125:static void function unpack1I called 2226 returned 100% blocks executed 100% 2226: 126:unpack1I(UINT8* out, const UINT8* in, int pixels) -: 127:{ -: 128: /* bits (msb first, white is zero) */ 148710: 129: while (pixels > 0) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 144258: 130: UINT8 byte = *in++; 144258: 131: switch (pixels) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% branch 4 taken 0% branch 5 taken 0% branch 6 taken 0% branch 7 taken 0% 144258: 132: default: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; branch 0 taken 75% (fallthrough) branch 1 taken 25% 144258: 133: case 7: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; branch 0 taken 75% (fallthrough) branch 1 taken 25% 144258: 134: case 6: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; branch 0 taken 75% (fallthrough) branch 1 taken 25% 144258: 135: case 5: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; branch 0 taken 75% (fallthrough) branch 1 taken 25% 144258: 136: case 4: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; branch 0 taken 75% (fallthrough) branch 1 taken 25% 144258: 137: case 3: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; branch 0 taken 75% (fallthrough) branch 1 taken 25% 144258: 138: case 2: *out++ = (byte & 128) ? 0 : 255; byte <<= 1; branch 0 taken 75% (fallthrough) branch 1 taken 25% 144258: 139: case 1: *out++ = (byte & 128) ? 0 : 255; branch 0 taken 75% (fallthrough) branch 1 taken 25% -: 140: } 144258: 141: pixels -= 8; -: 142: } 2226: 143:} -: 144: -: 145:static void function unpack1R called 1162 returned 100% blocks executed 100% 1162: 146:unpack1R(UINT8* out, const UINT8* in, int pixels) -: 147:{ -: 148: /* bits (lsb first, white is non-zero) */ 129502: 149: while (pixels > 0) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 127178: 150: UINT8 byte = *in++; 127178: 151: switch (pixels) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% branch 4 taken 0% branch 5 taken 0% branch 6 taken 0% branch 7 taken 0% 127178: 152: default: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; branch 0 taken 67% (fallthrough) branch 1 taken 33% 127178: 153: case 7: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; branch 0 taken 67% (fallthrough) branch 1 taken 33% 127178: 154: case 6: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; branch 0 taken 67% (fallthrough) branch 1 taken 33% 127178: 155: case 5: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; branch 0 taken 67% (fallthrough) branch 1 taken 33% 127178: 156: case 4: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; branch 0 taken 67% (fallthrough) branch 1 taken 33% 127178: 157: case 3: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; branch 0 taken 67% (fallthrough) branch 1 taken 33% 127178: 158: case 2: *out++ = (byte & 1) ? 255 : 0; byte >>= 1; branch 0 taken 67% (fallthrough) branch 1 taken 33% 127178: 159: case 1: *out++ = (byte & 1) ? 255 : 0; branch 0 taken 67% (fallthrough) branch 1 taken 33% -: 160: } 127178: 161: pixels -= 8; -: 162: } 1162: 163:} -: 164: -: 165:static void function unpack1IR called 2 returned 100% blocks executed 100% 2: 166:unpack1IR(UINT8* out, const UINT8* in, int pixels) -: 167:{ -: 168: /* bits (lsb first, white is zero) */ 6: 169: while (pixels > 0) { branch 0 taken 50% branch 1 taken 50% (fallthrough) 2: 170: UINT8 byte = *in++; 2: 171: switch (pixels) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% branch 4 taken 0% branch 5 taken 0% branch 6 taken 0% branch 7 taken 0% 2: 172: default: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; branch 0 taken 50% (fallthrough) branch 1 taken 50% 2: 173: case 7: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; branch 0 taken 50% (fallthrough) branch 1 taken 50% 2: 174: case 6: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; branch 0 taken 100% (fallthrough) branch 1 taken 0% 2: 175: case 5: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; branch 0 taken 50% (fallthrough) branch 1 taken 50% 2: 176: case 4: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; branch 0 taken 100% (fallthrough) branch 1 taken 0% 2: 177: case 3: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; branch 0 taken 50% (fallthrough) branch 1 taken 50% 2: 178: case 2: *out++ = (byte & 1) ? 0 : 255; byte >>= 1; branch 0 taken 100% (fallthrough) branch 1 taken 0% 2: 179: case 1: *out++ = (byte & 1) ? 0 : 255; branch 0 taken 50% (fallthrough) branch 1 taken 50% -: 180: } 2: 181: pixels -= 8; -: 182: } 2: 183:} -: 184: -: 185:static void function unpack18 called 51 returned 100% blocks executed 100% 51: 186:unpack18(UINT8* out, const UINT8* in, int pixels) -: 187:{ -: 188: /* Unpack a '|b1' image, which is a numpy boolean. -: 189: 1 == true, 0==false, in bytes */ -: 190: -: 191: int i; 475: 192: for (i = 0; i < pixels; i++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 424: 193: out[i] = in[i] > 0 ? 255 : 0; branch 0 taken 71% (fallthrough) branch 1 taken 29% -: 194: } 51: 195:} -: 196: -: 197: -: 198: -: 199:/* Unpack to "L" image */ -: 200: -: 201:static void function unpackL2 called 129 returned 100% blocks executed 100% 129: 202:unpackL2(UINT8* out, const UINT8* in, int pixels) -: 203:{ -: 204: /* nibbles (msb first, white is non-zero) */ 4355: 205: while (pixels > 0) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 4097: 206: UINT8 byte = *in++; 4097: 207: switch (pixels) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% 4097: 208: default: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; 4097: 209: case 3: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; 4097: 210: case 2: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; 4097: 211: case 1: *out++ = ((byte >> 6) & 0x03U) * 0x55U; -: 212: } 4097: 213: pixels -= 4; -: 214: } 129: 215:} -: 216: -: 217:static void function unpackL2I called 129 returned 100% blocks executed 100% 129: 218:unpackL2I(UINT8* out, const UINT8* in, int pixels) -: 219:{ -: 220: /* nibbles (msb first, white is zero) */ 4355: 221: while (pixels > 0) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 4097: 222: UINT8 byte = *in++; 4097: 223: switch (pixels) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% 4097: 224: default: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; 4097: 225: case 3: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; 4097: 226: case 2: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; 4097: 227: case 1: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); -: 228: } 4097: 229: pixels -= 4; -: 230: } 129: 231:} -: 232: -: 233:static void function unpackL2R called 129 returned 100% blocks executed 100% 129: 234:unpackL2R(UINT8* out, const UINT8* in, int pixels) -: 235:{ -: 236: /* nibbles (bit order reversed, white is non-zero) */ 4355: 237: while (pixels > 0) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 4097: 238: UINT8 byte = *in++; 4097: 239: byte = BITFLIP[byte]; 4097: 240: switch (pixels) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% 4097: 241: default: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; 4097: 242: case 3: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; 4097: 243: case 2: *out++ = ((byte >> 6) & 0x03U) * 0x55U; byte <<= 2; 4097: 244: case 1: *out++ = ((byte >> 6) & 0x03U) * 0x55U; -: 245: } 4097: 246: pixels -= 4; -: 247: } 129: 248:} -: 249: -: 250:static void function unpackL2IR called 129 returned 100% blocks executed 100% 129: 251:unpackL2IR(UINT8* out, const UINT8* in, int pixels) -: 252:{ -: 253: /* nibbles (bit order reversed, white is zero) */ 4355: 254: while (pixels > 0) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 4097: 255: UINT8 byte = *in++; 4097: 256: byte = BITFLIP[byte]; 4097: 257: switch (pixels) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% 4097: 258: default: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; 4097: 259: case 3: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; 4097: 260: case 2: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); byte <<= 2; 4097: 261: case 1: *out++ = 0xFFU - (UINT8)(((byte >> 6) & 0x03U) * 0x55U); -: 262: } 4097: 263: pixels -= 4; -: 264: } 129: 265:} -: 266: -: 267:static void function unpackL4 called 257 returned 100% blocks executed 100% 257: 268:unpackL4(UINT8* out, const UINT8* in, int pixels) -: 269:{ -: 270: /* nibbles (msb first, white is non-zero) */ 16900: 271: while (pixels > 0) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 16386: 272: UINT8 byte = *in++; 16386: 273: switch (pixels) { branch 0 taken 100% branch 1 taken 0% 16386: 274: default: *out++ = ((byte >> 4) & 0x0FU) * 0x11U; byte <<= 4; 16386: 275: case 1: *out++ = ((byte >> 4) & 0x0FU) * 0x11U; -: 276: } 16386: 277: pixels -= 2; -: 278: } 257: 279:} -: 280: -: 281:static void function unpackL4I called 129 returned 100% blocks executed 100% 129: 282:unpackL4I(UINT8* out, const UINT8* in, int pixels) -: 283:{ -: 284: /* nibbles (msb first, white is zero) */ 8452: 285: while (pixels > 0) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 8194: 286: UINT8 byte = *in++; 8194: 287: switch (pixels) { branch 0 taken 100% branch 1 taken 0% 8194: 288: default: *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); byte <<= 4; 8194: 289: case 1: *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); -: 290: } 8194: 291: pixels -= 2; -: 292: } 129: 293:} -: 294: -: 295:static void function unpackL4R called 129 returned 100% blocks executed 100% 129: 296:unpackL4R(UINT8* out, const UINT8* in, int pixels) -: 297:{ -: 298: /* nibbles (bit order reversed, white is non-zero) */ 8452: 299: while (pixels > 0) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 8194: 300: UINT8 byte = *in++; 8194: 301: byte = BITFLIP[byte]; 8194: 302: switch (pixels) { branch 0 taken 100% branch 1 taken 0% 8194: 303: default: *out++ = ((byte >> 4) & 0x0FU) * 0x11U; byte <<= 4; 8194: 304: case 1: *out++ = ((byte >> 4) & 0x0FU) * 0x11U; -: 305: } 8194: 306: pixels -= 2; -: 307: } 129: 308:} -: 309: -: 310:static void function unpackL4IR called 129 returned 100% blocks executed 100% 129: 311:unpackL4IR(UINT8* out, const UINT8* in, int pixels) -: 312:{ -: 313: /* nibbles (bit order reversed, white is zero) */ 8452: 314: while (pixels > 0) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 8194: 315: UINT8 byte = *in++; 8194: 316: byte = BITFLIP[byte]; 8194: 317: switch (pixels) { branch 0 taken 100% branch 1 taken 0% 8194: 318: default: *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); byte <<= 4; 8194: 319: case 1: *out++ = 0xFFU - (UINT8)(((byte >> 4) & 0x0FU) * 0x11U); -: 320: } 8194: 321: pixels -= 2; -: 322: } 129: 323:} -: 324: -: 325:static void function unpackLA called 2769 returned 100% blocks executed 100% 2769: 326:unpackLA(UINT8* _out, const UINT8* in, int pixels) -: 327:{ -: 328: int i; -: 329: /* LA, pixel interleaved */ 368190: 330: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 365421: 331: UINT32 iv = MAKE_UINT32(in[0], in[0], in[0], in[1]); 365421: 332: memcpy(_out, &iv, sizeof(iv)); 365421: 333: in += 2; _out += 4; -: 334: } 2769: 335:} -: 336: -: 337:static void function unpackLAL called 130 returned 100% blocks executed 100% 130: 338:unpackLAL(UINT8* _out, const UINT8* in, int pixels) -: 339:{ -: 340: int i; -: 341: /* LA, line interleaved */ 16520: 342: for (i = 0; i < pixels; i++, _out+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16390: 343: UINT32 iv = MAKE_UINT32(in[i], in[i], in[i], in[i+pixels]); 16390: 344: memcpy(_out, &iv, sizeof(iv)); -: 345: } 130: 346:} -: 347: -: 348:static void function unpackLI called 1 returned 100% blocks executed 100% 1: 349:unpackLI(UINT8* out, const UINT8* in, int pixels) -: 350:{ -: 351: /* negative */ -: 352: int i; 5: 353: for (i = 0; i < pixels; i++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 4: 354: out[i] = ~in[i]; -: 355: } 1: 356:} -: 357: -: 358:static void function unpackLR called 2 returned 100% blocks executed 100% 2: 359:unpackLR(UINT8* out, const UINT8* in, int pixels) -: 360:{ -: 361: int i; -: 362: /* RGB, bit reversed */ 10: 363: for (i = 0; i < pixels; i++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 8: 364: out[i] = BITFLIP[in[i]]; -: 365: } 2: 366:} -: 367: -: 368:static void function unpackL16 called 2 returned 100% blocks executed 100% 2: 369:unpackL16(UINT8* out, const UINT8* in, int pixels) -: 370:{ -: 371: /* int16 (upper byte, little endian) */ -: 372: int i; 8: 373: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 6: 374: out[i] = in[1]; 6: 375: in += 2; -: 376: } 2: 377:} -: 378: -: 379:static void function unpackL16B called 1154 returned 100% blocks executed 100% 1154: 380:unpackL16B(UINT8* out, const UINT8* in, int pixels) -: 381:{ -: 382: int i; -: 383: /* int16 (upper byte, big endian) */ 148616: 384: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 147462: 385: out[i] = in[0]; 147462: 386: in += 2; -: 387: } 1154: 388:} -: 389: -: 390: -: 391:/* Unpack to "P" image */ -: 392: -: 393:static void function unpackP1 called 891 returned 100% blocks executed 100% 891: 394:unpackP1(UINT8* out, const UINT8* in, int pixels) -: 395:{ -: 396: /* bits */ 12623: 397: while (pixels > 0) { branch 0 taken 92% branch 1 taken 8% (fallthrough) 10841: 398: UINT8 byte = *in++; 10841: 399: switch (pixels) { branch 0 taken 95% branch 1 taken 2% branch 2 taken 0% branch 3 taken 0% branch 4 taken 1% branch 5 taken 0% branch 6 taken 1% branch 7 taken 0% 10335: 400: default: *out++ = (byte >> 7) & 1; byte <<= 1; 10591: 401: case 7: *out++ = (byte >> 7) & 1; byte <<= 1; 10591: 402: case 6: *out++ = (byte >> 7) & 1; byte <<= 1; 10591: 403: case 5: *out++ = (byte >> 7) & 1; byte <<= 1; 10691: 404: case 4: *out++ = (byte >> 7) & 1; byte <<= 1; 10691: 405: case 3: *out++ = (byte >> 7) & 1; byte <<= 1; 10841: 406: case 2: *out++ = (byte >> 7) & 1; byte <<= 1; 10841: 407: case 1: *out++ = (byte >> 7) & 1; -: 408: } 10841: 409: pixels -= 8; -: 410: } 891: 411:} -: 412: -: 413:static void function unpackP2 called 194 returned 100% blocks executed 100% 194: 414:unpackP2(UINT8* out, const UINT8* in, int pixels) -: 415:{ -: 416: /* bit pairs */ 6535: 417: while (pixels > 0) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 6147: 418: UINT8 byte = *in++; 6147: 419: switch (pixels) { branch 0 taken 99% branch 1 taken 0% branch 2 taken 1% branch 3 taken 0% 6146: 420: default: *out++ = (byte >> 6) & 3; byte <<= 2; 6146: 421: case 3: *out++ = (byte >> 6) & 3; byte <<= 2; 6147: 422: case 2: *out++ = (byte >> 6) & 3; byte <<= 2; 6147: 423: case 1: *out++ = (byte >> 6) & 3; -: 424: } 6147: 425: pixels -= 4; -: 426: } 194: 427:} -: 428: -: 429:static void function unpackP4 called 21949 returned 100% blocks executed 100% 21949: 430:unpackP4(UINT8* out, const UINT8* in, int pixels) -: 431:{ -: 432: /* nibbles */ 7867084: 433: while (pixels > 0) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 7823186: 434: UINT8 byte = *in++; 7823186: 435: switch (pixels) { branch 0 taken 99% branch 1 taken 1% 7823058: 436: default: *out++ = (byte >> 4) & 15; byte <<= 4; 7823186: 437: case 1: *out++ = (byte >> 4) & 15; -: 438: } 7823186: 439: pixels -= 2; -: 440: } 21949: 441:} -: 442: -: 443:static void function unpackP2L called 0 returned 0% blocks executed 0% #####: 444:unpackP2L(UINT8* out, const UINT8* in, int pixels) -: 445:{ -: 446: int i, j, m, s; -: 447: /* bit layers */ #####: 448: m = 128; #####: 449: s = (pixels+7)/8; #####: 450: for (i = j = 0; i < pixels; i++) { branch 0 never executed branch 1 never executed #####: 451: out[i] = ((in[j] & m) ? 1 : 0) + ((in[j + s] & m) ? 2 : 0); branch 0 never executed branch 1 never executed #####: 452: if ((m >>= 1) == 0) { branch 0 never executed branch 1 never executed #####: 453: m = 128; #####: 454: j++; -: 455: } -: 456: } #####: 457:} -: 458: -: 459:static void function unpackP4L called 0 returned 0% blocks executed 0% #####: 460:unpackP4L(UINT8* out, const UINT8* in, int pixels) -: 461:{ -: 462: int i, j, m, s; -: 463: /* bit layers (trust the optimizer ;-) */ #####: 464: m = 128; #####: 465: s = (pixels+7)/8; #####: 466: for (i = j = 0; i < pixels; i++) { branch 0 never executed branch 1 never executed #####: 467: out[i] = ((in[j] & m) ? 1 : 0) + ((in[j + s] & m) ? 2 : 0) + branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed #####: 468: ((in[j + 2*s] & m) ? 4 : 0) + ((in[j + 3*s] & m) ? 8 : 0); #####: 469: if ((m >>= 1) == 0) { branch 0 never executed branch 1 never executed #####: 470: m = 128; #####: 471: j++; -: 472: } -: 473: } #####: 474:} -: 475: -: 476: -: 477:/* Unpack to "RGB" image */ -: 478: -: 479:void function ImagingUnpackRGB called 172112 returned 100% blocks executed 100% 172112: 480:ImagingUnpackRGB(UINT8* _out, const UINT8* in, int pixels) -: 481:{ 172112: 482: int i = 0; -: 483: /* RGB triplets */ 152564539: 484: for (; i < pixels-1; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 485: UINT32 iv; 152392427: 486: memcpy(&iv, in, sizeof(iv)); 152392427: 487: iv |= MASK_UINT32_CHANNEL_3; 152392427: 488: memcpy(_out, &iv, sizeof(iv)); 152392427: 489: in += 3; _out += 4; -: 490: } 172112: 491: for (; i < pixels; i++) { branch 0 taken 50% branch 1 taken 50% (fallthrough) 172112: 492: UINT32 iv = MAKE_UINT32(in[0], in[1], in[2], 255); 172112: 493: memcpy(_out, &iv, sizeof(iv)); 172112: 494: in += 3; _out += 4; -: 495: } 172112: 496:} -: 497: -: 498:void function unpackRGB16L called 1 returned 100% blocks executed 100% 1: 499:unpackRGB16L(UINT8* _out, const UINT8* in, int pixels) -: 500:{ -: 501: int i; -: 502: /* 16-bit RGB triplets, little-endian order */ 3: 503: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 504: UINT32 iv = MAKE_UINT32(in[1], in[3], in[5], 255); 2: 505: memcpy(_out, &iv, sizeof(iv)); 2: 506: in += 6; _out += 4; -: 507: } 1: 508:} -: 509: -: 510:void function unpackRGB16B called 764 returned 100% blocks executed 100% 764: 511:unpackRGB16B(UINT8* _out, const UINT8* in, int pixels) -: 512:{ -: 513: int i; -: 514: /* 16-bit RGB triplets, big-endian order */ 488448: 515: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 487684: 516: UINT32 iv = MAKE_UINT32(in[0], in[2], in[4], 255); 487684: 517: memcpy(_out, &iv, sizeof(iv)); 487684: 518: in += 6; _out += 4; -: 519: } 764: 520:} -: 521: -: 522:static void function unpackRGBL called 2092 returned 100% blocks executed 100% 2092: 523:unpackRGBL(UINT8* _out, const UINT8* in, int pixels) -: 524:{ -: 525: int i; -: 526: /* RGB, line interleaved */ 480882: 527: for (i = 0; i < pixels; i++, _out+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 478790: 528: UINT32 iv = MAKE_UINT32(in[i], in[i+pixels], in[i+pixels+pixels], 255); 478790: 529: memcpy(_out, &iv, sizeof(iv)); -: 530: } 2092: 531:} -: 532: -: 533:static void function unpackRGBR called 1 returned 100% blocks executed 100% 1: 534:unpackRGBR(UINT8* _out, const UINT8* in, int pixels) -: 535:{ -: 536: int i; -: 537: /* RGB, bit reversed */ 3: 538: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 539: UINT32 iv = MAKE_UINT32(BITFLIP[in[0]], BITFLIP[in[1]], -: 540: BITFLIP[in[2]], 255); 2: 541: memcpy(_out, &iv, sizeof(iv)); 2: 542: in += 3; _out += 4; -: 543: } 1: 544:} -: 545: -: 546:void function ImagingUnpackBGR called 4369 returned 100% blocks executed 100% 4369: 547:ImagingUnpackBGR(UINT8* _out, const UINT8* in, int pixels) -: 548:{ -: 549: int i; -: 550: /* RGB, reversed bytes */ 2322186: 551: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2317817: 552: UINT32 iv = MAKE_UINT32(in[2], in[1], in[0], 255); 2317817: 553: memcpy(_out, &iv, sizeof(iv)); 2317817: 554: in += 3; _out += 4; -: 555: } 4369: 556:} -: 557: -: 558:void function ImagingUnpackRGB15 called 2 returned 100% blocks executed 100% 2: 559:ImagingUnpackRGB15(UINT8* out, const UINT8* in, int pixels) -: 560:{ -: 561: int i, pixel; -: 562: /* RGB, 5 bits per pixel */ 6: 563: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 4: 564: pixel = in[0] + (in[1] << 8); 4: 565: out[R] = (pixel & 31) * 255 / 31; 4: 566: out[G] = ((pixel>>5) & 31) * 255 / 31; 4: 567: out[B] = ((pixel>>10) & 31) * 255 / 31; 4: 568: out[A] = 255; 4: 569: out += 4; in += 2; -: 570: } 2: 571:} -: 572: -: 573:void function ImagingUnpackRGBA15 called 1 returned 100% blocks executed 100% 1: 574:ImagingUnpackRGBA15(UINT8* out, const UINT8* in, int pixels) -: 575:{ -: 576: int i, pixel; -: 577: /* RGB, 5/5/5/1 bits per pixel */ 3: 578: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 579: pixel = in[0] + (in[1] << 8); 2: 580: out[R] = (pixel & 31) * 255 / 31; 2: 581: out[G] = ((pixel>>5) & 31) * 255 / 31; 2: 582: out[B] = ((pixel>>10) & 31) * 255 / 31; 2: 583: out[A] = (pixel>>15) * 255; 2: 584: out += 4; in += 2; -: 585: } 1: 586:} -: 587: -: 588:void function ImagingUnpackBGR15 called 66 returned 100% blocks executed 100% 66: 589:ImagingUnpackBGR15(UINT8* out, const UINT8* in, int pixels) -: 590:{ -: 591: int i, pixel; -: 592: /* RGB, reversed bytes, 5 bits per pixel */ 8198: 593: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 8132: 594: pixel = in[0] + (in[1] << 8); 8132: 595: out[B] = (pixel & 31) * 255 / 31; 8132: 596: out[G] = ((pixel>>5) & 31) * 255 / 31; 8132: 597: out[R] = ((pixel>>10) & 31) * 255 / 31; 8132: 598: out[A] = 255; 8132: 599: out += 4; in += 2; -: 600: } 66: 601:} -: 602: -: 603:void function ImagingUnpackBGRA15 called 1 returned 100% blocks executed 100% 1: 604:ImagingUnpackBGRA15(UINT8* out, const UINT8* in, int pixels) -: 605:{ -: 606: int i, pixel; -: 607: /* RGB, reversed bytes, 5/5/5/1 bits per pixel */ 3: 608: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 609: pixel = in[0] + (in[1] << 8); 2: 610: out[B] = (pixel & 31) * 255 / 31; 2: 611: out[G] = ((pixel>>5) & 31) * 255 / 31; 2: 612: out[R] = ((pixel>>10) & 31) * 255 / 31; 2: 613: out[A] = (pixel>>15) * 255; 2: 614: out += 4; in += 2; -: 615: } 1: 616:} -: 617: -: 618:void function ImagingUnpackRGB16 called 1 returned 100% blocks executed 100% 1: 619:ImagingUnpackRGB16(UINT8* out, const UINT8* in, int pixels) -: 620:{ -: 621: int i, pixel; -: 622: /* RGB, 5/6/5 bits per pixel */ 3: 623: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 624: pixel = in[0] + (in[1] << 8); 2: 625: out[R] = (pixel & 31) * 255 / 31; 2: 626: out[G] = ((pixel>>5) & 63) * 255 / 63; 2: 627: out[B] = ((pixel>>11) & 31) * 255 / 31; 2: 628: out[A] = 255; 2: 629: out += 4; in += 2; -: 630: } 1: 631:} -: 632: -: 633:void function ImagingUnpackBGR16 called 129 returned 100% blocks executed 100% 129: 634:ImagingUnpackBGR16(UINT8* out, const UINT8* in, int pixels) -: 635:{ -: 636: int i, pixel; -: 637: /* RGB, reversed bytes, 5/6/5 bits per pixel */ 16387: 638: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16258: 639: pixel = in[0] + (in[1] << 8); 16258: 640: out[B] = (pixel & 31) * 255 / 31; 16258: 641: out[G] = ((pixel>>5) & 63) * 255 / 63; 16258: 642: out[R] = ((pixel>>11) & 31) * 255 / 31; 16258: 643: out[A] = 255; 16258: 644: out += 4; in += 2; -: 645: } 129: 646:} -: 647: -: 648:void function ImagingUnpackRGB4B called 2 returned 100% blocks executed 100% 2: 649:ImagingUnpackRGB4B(UINT8* out, const UINT8* in, int pixels) -: 650:{ -: 651: int i, pixel; -: 652: /* RGB, 4 bits per pixel */ 6: 653: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 4: 654: pixel = in[0] + (in[1] << 8); 4: 655: out[R] = (pixel & 15) * 17; 4: 656: out[G] = ((pixel>>4) & 15) * 17; 4: 657: out[B] = ((pixel>>8) & 15) * 17; 4: 658: out[A] = 255; 4: 659: out += 4; in += 2; -: 660: } 2: 661:} -: 662: -: 663:void function ImagingUnpackRGBA4B called 1 returned 100% blocks executed 100% 1: 664:ImagingUnpackRGBA4B(UINT8* out, const UINT8* in, int pixels) -: 665:{ -: 666: int i, pixel; -: 667: /* RGBA, 4 bits per pixel */ 3: 668: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 669: pixel = in[0] + (in[1] << 8); 2: 670: out[R] = (pixel & 15) * 17; 2: 671: out[G] = ((pixel>>4) & 15) * 17; 2: 672: out[B] = ((pixel>>8) & 15) * 17; 2: 673: out[A] = ((pixel>>12) & 15) * 17; 2: 674: out += 4; in += 2; -: 675: } 1: 676:} -: 677: -: 678:static void function ImagingUnpackBGRX called 1417 returned 100% blocks executed 100% 1417: 679:ImagingUnpackBGRX(UINT8* _out, const UINT8* in, int pixels) -: 680:{ -: 681: int i; -: 682: /* RGB, reversed bytes with padding */ 919901: 683: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 918484: 684: UINT32 iv = MAKE_UINT32(in[2], in[1], in[0], 255); 918484: 685: memcpy(_out, &iv, sizeof(iv)); 918484: 686: in += 4; _out += 4; -: 687: } 1417: 688:} -: 689: -: 690:static void function ImagingUnpackXRGB called 2 returned 100% blocks executed 100% 2: 691:ImagingUnpackXRGB(UINT8* _out, const UINT8* in, int pixels) -: 692:{ -: 693: int i; -: 694: /* RGB, leading pad */ 8: 695: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 6: 696: UINT32 iv = MAKE_UINT32(in[1], in[2], in[3], 255); 6: 697: memcpy(_out, &iv, sizeof(iv)); 6: 698: in += 4; _out += 4; -: 699: } 2: 700:} -: 701: -: 702:static void function ImagingUnpackXBGR called 130 returned 100% blocks executed 100% 130: 703:ImagingUnpackXBGR(UINT8* _out, const UINT8* in, int pixels) -: 704:{ -: 705: int i; -: 706: /* RGB, reversed bytes, leading pad */ 16392: 707: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16262: 708: UINT32 iv = MAKE_UINT32(in[3], in[2], in[1], 255); 16262: 709: memcpy(_out, &iv, sizeof(iv)); 16262: 710: in += 4; _out += 4; -: 711: } 130: 712:} -: 713: -: 714:/* Unpack to "RGBA" image */ -: 715: -: 716:static void function unpackRGBALA called 1 returned 100% blocks executed 100% 1: 717:unpackRGBALA(UINT8* _out, const UINT8* in, int pixels) -: 718:{ -: 719: int i; -: 720: /* greyscale with alpha */ 4: 721: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 722: UINT32 iv = MAKE_UINT32(in[0], in[0], in[0], in[1]); 3: 723: memcpy(_out, &iv, sizeof(iv)); 3: 724: in += 2; _out += 4; -: 725: } 1: 726:} -: 727: -: 728:static void function unpackRGBALA16B called 1 returned 100% blocks executed 100% 1: 729:unpackRGBALA16B(UINT8* _out, const UINT8* in, int pixels) -: 730:{ -: 731: int i; -: 732: /* 16-bit greyscale with alpha, big-endian */ 4: 733: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 734: UINT32 iv = MAKE_UINT32(in[0], in[0], in[0], in[2]); 3: 735: memcpy(_out, &iv, sizeof(iv)); 3: 736: in += 4; _out += 4; -: 737: } 1: 738:} -: 739: -: 740:static void function unpackRGBa16L called 2 returned 100% blocks executed 100% 2: 741:unpackRGBa16L(UINT8* _out, const UINT8* in, int pixels) -: 742:{ -: 743: int i; -: 744: /* premultiplied 16-bit RGBA, little-endian */ 7: 745: for (i = 0; i < pixels; i++) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 5: 746: int a = in[7]; -: 747: UINT32 iv; 5: 748: if ( ! a) { branch 0 taken 20% (fallthrough) branch 1 taken 80% 1: 749: iv = 0; 4: 750: } else if (a == 255) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 1: 751: iv = MAKE_UINT32(in[1], in[3], in[5], a); -: 752: } else { 3: 753: iv = MAKE_UINT32(CLIP8(in[1] * 255 / a), branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 754: CLIP8(in[3] * 255 / a), -: 755: CLIP8(in[5] * 255 / a), a); -: 756: } 5: 757: memcpy(_out, &iv, sizeof(iv)); 5: 758: in += 8; _out += 4; -: 759: } 2: 760:} -: 761: -: 762:static void function unpackRGBa16B called 2 returned 100% blocks executed 100% 2: 763:unpackRGBa16B(UINT8* _out, const UINT8* in, int pixels) -: 764:{ -: 765: int i; -: 766: /* premultiplied 16-bit RGBA, big-endian */ 7: 767: for (i = 0; i < pixels; i++) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 5: 768: int a = in[6]; -: 769: UINT32 iv; 5: 770: if ( ! a) { branch 0 taken 20% (fallthrough) branch 1 taken 80% 1: 771: iv = 0; 4: 772: } else if (a == 255) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 1: 773: iv = MAKE_UINT32(in[0], in[2], in[4], a); -: 774: } else { 3: 775: iv = MAKE_UINT32(CLIP8(in[0] * 255 / a), branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 776: CLIP8(in[2] * 255 / a), -: 777: CLIP8(in[4] * 255 / a), a); -: 778: } 5: 779: memcpy(_out, &iv, sizeof(iv)); 5: 780: in += 8; _out += 4; -: 781: } 2: 782:} -: 783: -: 784:static void function unpackRGBa called 45 returned 100% blocks executed 100% 45: 785:unpackRGBa(UINT8* _out, const UINT8* in, int pixels) -: 786:{ -: 787: int i; -: 788: /* premultiplied RGBA */ 2416: 789: for (i = 0; i < pixels; i++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 2371: 790: int a = in[3]; -: 791: UINT32 iv; 2371: 792: if ( ! a) { branch 0 taken 16% (fallthrough) branch 1 taken 84% 377: 793: iv = 0; 1994: 794: } else if (a == 255) { branch 0 taken 91% (fallthrough) branch 1 taken 9% 1814: 795: iv = MAKE_UINT32(in[0], in[1], in[2], a); -: 796: } else { 180: 797: iv = MAKE_UINT32(CLIP8(in[0] * 255 / a), branch 0 taken 23% (fallthrough) branch 1 taken 77% branch 2 taken 2% (fallthrough) branch 3 taken 98% branch 4 taken 28% (fallthrough) branch 5 taken 72% -: 798: CLIP8(in[1] * 255 / a), -: 799: CLIP8(in[2] * 255 / a), a); -: 800: } 2371: 801: memcpy(_out, &iv, sizeof(iv)); 2371: 802: in += 4; _out += 4; -: 803: } 45: 804:} -: 805: -: 806:static void function unpackRGBaskip1 called 1 returned 100% blocks executed 100% 1: 807:unpackRGBaskip1(UINT8* _out, const UINT8* in, int pixels) -: 808:{ -: 809: int i; 1: 810: UINT32* out = (UINT32*) _out; -: 811: /* premultiplied RGBA */ 4: 812: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 813: int a = in[3]; 3: 814: if ( ! a) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 1: 815: out[i] = 0; 2: 816: } else if (a == 255) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 1: 817: out[i] = MAKE_UINT32(in[0], in[1], in[2], a); -: 818: } else { 1: 819: out[i] = MAKE_UINT32(CLIP8(in[0] * 255 / a), branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 820: CLIP8(in[1] * 255 / a), -: 821: CLIP8(in[2] * 255 / a), a); -: 822: } 3: 823: in += 5; -: 824: } 1: 825:} -: 826: -: 827:static void function unpackRGBaskip2 called 1 returned 100% blocks executed 100% 1: 828:unpackRGBaskip2(UINT8* _out, const UINT8* in, int pixels) -: 829:{ -: 830: int i; 1: 831: UINT32* out = (UINT32*) _out; -: 832: /* premultiplied RGBA */ 4: 833: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 834: int a = in[3]; 3: 835: if ( ! a) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 1: 836: out[i] = 0; 2: 837: } else if (a == 255) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 1: 838: out[i] = MAKE_UINT32(in[0], in[1], in[2], a); -: 839: } else { 1: 840: out[i] = MAKE_UINT32(CLIP8(in[0] * 255 / a), branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 841: CLIP8(in[1] * 255 / a), -: 842: CLIP8(in[2] * 255 / a), a); -: 843: } 3: 844: in += 6; -: 845: } 1: 846:} -: 847: -: 848:static void function unpackBGRa called 2 returned 100% blocks executed 100% 2: 849:unpackBGRa(UINT8* _out, const UINT8* in, int pixels) -: 850:{ -: 851: int i; -: 852: /* premultiplied BGRA */ 7: 853: for (i = 0; i < pixels; i++) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 5: 854: int a = in[3]; -: 855: UINT32 iv; 5: 856: if ( ! a) { branch 0 taken 20% (fallthrough) branch 1 taken 80% 1: 857: iv = 0; 4: 858: } else if (a == 255) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 1: 859: iv = MAKE_UINT32(in[2], in[1], in[0], a); -: 860: } else { 3: 861: iv = MAKE_UINT32(CLIP8(in[2] * 255 / a), branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 862: CLIP8(in[1] * 255 / a), -: 863: CLIP8(in[0] * 255 / a), a); -: 864: } 5: 865: memcpy(_out, &iv, sizeof(iv)); 5: 866: in += 4; _out += 4; -: 867: } 2: 868:} -: 869: -: 870:static void function unpackRGBAI called 1 returned 100% blocks executed 100% 1: 871:unpackRGBAI(UINT8* out, const UINT8* in, int pixels) -: 872:{ -: 873: int i; -: 874: /* RGBA, inverted RGB bytes (FlashPix) */ 4: 875: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 876: out[R] = ~in[0]; 3: 877: out[G] = ~in[1]; 3: 878: out[B] = ~in[2]; 3: 879: out[A] = in[3]; 3: 880: out += 4; in += 4; -: 881: } 1: 882:} -: 883: -: 884:static void function unpackRGBAL called 5 returned 100% blocks executed 100% 5: 885:unpackRGBAL(UINT8* _out, const UINT8* in, int pixels) -: 886:{ -: 887: int i; -: 888: /* RGBA, line interleaved */ 209: 889: for (i = 0; i < pixels; i++, _out+=4) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 204: 890: UINT32 iv = MAKE_UINT32(in[i], in[i+pixels], in[i+pixels+pixels], -: 891: in[i+pixels+pixels+pixels]); 204: 892: memcpy(_out, &iv, sizeof(iv)); -: 893: } 5: 894:} -: 895: -: 896:void function unpackRGBA16L called 4 returned 100% blocks executed 100% 4: 897:unpackRGBA16L(UINT8* _out, const UINT8* in, int pixels) -: 898:{ -: 899: int i; -: 900: /* 16-bit RGBA, little-endian order */ 12: 901: for (i = 0; i < pixels; i++, _out+=4) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 8: 902: UINT32 iv = MAKE_UINT32(in[1], in[3], in[5], in[7]); 8: 903: memcpy(_out, &iv, sizeof(iv)); 8: 904: in += 8; -: 905: } 4: 906:} -: 907: -: 908:void function unpackRGBA16B called 195 returned 100% blocks executed 100% 195: 909:unpackRGBA16B(UINT8* _out, const UINT8* in, int pixels) -: 910:{ -: 911: int i; -: 912: /* 16-bit RGBA, big-endian order */ 24777: 913: for (i = 0; i < pixels; i++, _out+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 24582: 914: UINT32 iv = MAKE_UINT32(in[0], in[2], in[4], in[6]); 24582: 915: memcpy(_out, &iv, sizeof(iv)); 24582: 916: in += 8; -: 917: } 195: 918:} -: 919: -: 920:static void function unpackARGB called 602 returned 100% blocks executed 100% 602: 921:unpackARGB(UINT8* _out, const UINT8* in, int pixels) -: 922:{ -: 923: int i; -: 924: /* RGBA, leading pad */ 480608: 925: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 480006: 926: UINT32 iv = MAKE_UINT32(in[1], in[2], in[3], in[0]); 480006: 927: memcpy(_out, &iv, sizeof(iv)); 480006: 928: in += 4; _out += 4; -: 929: } 602: 930:} -: 931: -: 932:static void function unpackABGR called 2 returned 100% blocks executed 100% 2: 933:unpackABGR(UINT8* _out, const UINT8* in, int pixels) -: 934:{ -: 935: int i; -: 936: /* RGBA, reversed bytes */ 8: 937: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 6: 938: UINT32 iv = MAKE_UINT32(in[3], in[2], in[1], in[0]); 6: 939: memcpy(_out, &iv, sizeof(iv)); 6: 940: in += 4; _out += 4; -: 941: } 2: 942:} -: 943: -: 944:static void function unpackBGRA called 887 returned 100% blocks executed 100% 887: 945:unpackBGRA(UINT8* _out, const UINT8* in, int pixels) -: 946:{ -: 947: int i; -: 948: /* RGBA, reversed bytes */ 171920: 949: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 171033: 950: UINT32 iv = MAKE_UINT32(in[2], in[1], in[0], in[3]); 171033: 951: memcpy(_out, &iv, sizeof(iv)); 171033: 952: in += 4; _out += 4; -: 953: } 887: 954:} -: 955: -: 956: -: 957:/* Unpack to "CMYK" image */ -: 958: -: 959:static void function unpackCMYKI called 1757 returned 100% blocks executed 100% 1757: 960:unpackCMYKI(UINT8* _out, const UINT8* in, int pixels) -: 961:{ -: 962: int i; -: 963: /* CMYK, inverted bytes (Photoshop 2.5) */ 168144: 964: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 166387: 965: UINT32 iv = ~MAKE_UINT32(in[0], in[1], in[2], in[3]); 166387: 966: memcpy(_out, &iv, sizeof(iv)); 166387: 967: in += 4; _out += 4; -: 968: } 1757: 969:} -: 970: -: 971:/* Unpack to "LAB" image */ -: 972:/* There are two representations of LAB images for whatever precision: -: 973: L: Uint (in PS, it's 0-100) -: 974: A: Int (in ps, -128 .. 128, or elsewhere 0..255, with 128 as middle. -: 975: Channels in PS display a 0 value as middle grey, -: 976: LCMS appears to use 128 as the 0 value for these channels) -: 977: B: Int (as above) -: 978: -: 979: Since we don't have any signed ints, we're going with the shifted versions -: 980: internally, and we'll unshift for saving and whatnot. -: 981:*/ -: 982:void function ImagingUnpackLAB called 415 returned 100% blocks executed 100% 415: 983:ImagingUnpackLAB(UINT8* out, const UINT8* in, int pixels) -: 984:{ -: 985: int i; -: 986: /* LAB triplets */ 49870: 987: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 49455: 988: out[0] = in[0]; 49455: 989: out[1] = in[1] ^ 128; /* signed in outside world */ 49455: 990: out[2] = in[2] ^ 128; 49455: 991: out[3] = 255; 49455: 992: out += 4; in += 3; -: 993: } 415: 994:} -: 995: -: 996:static void function unpackI16N_I16B called 1 returned 100% blocks executed 100% 1: 997:unpackI16N_I16B(UINT8* out, const UINT8* in, int pixels){ -: 998: int i; 1: 999: UINT8* tmp = (UINT8*) out; 4: 1000: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 1001: C16B; 3: 1002: in += 2; tmp += 2; -: 1003: } -: 1004: 1: 1005:} -: 1006:static void function unpackI16N_I16 called 2 returned 100% blocks executed 100% 2: 1007:unpackI16N_I16(UINT8* out, const UINT8* in, int pixels){ -: 1008: int i; 2: 1009: UINT8* tmp = (UINT8*) out; 8: 1010: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 6: 1011: C16L; 6: 1012: in += 2; tmp += 2; -: 1013: } 2: 1014:} -: 1015: -: 1016:static void function unpackI12_I16 called 101 returned 100% blocks executed 100% 101: 1017:unpackI12_I16(UINT8* out, const UINT8* in, int pixels){ -: 1018: /* Fillorder 1/MSB -> LittleEndian, for 12bit integer greyscale tiffs. -: 1019: -: 1020: According to the TIFF spec: -: 1021: -: 1022: FillOrder = 2 should be used only when BitsPerSample = 1 and -: 1023: the data is either uncompressed or compressed using CCITT 1D -: 1024: or 2D compression, to avoid potentially ambiguous situations. -: 1025: -: 1026: Yeah. I thought so. We'll see how well people read the spec. -: 1027: We've got several fillorder=2 modes in TiffImagePlugin.py -: 1028: -: 1029: There's no spec I can find. It appears that the in storage -: 1030: layout is: 00 80 00 ... -> (128 , 0 ...). The samples are -: 1031: stored in a single big bitian 12bit block, but need to be -: 1032: pulled out to little endian format to be stored in a 2 byte -: 1033: int. -: 1034: */ -: 1035: -: 1036: int i; -: 1037: UINT16 pixel; -: 1038:#ifdef WORDS_BIGENDIAN -: 1039: UINT8* tmp = (UINT8 *)&pixel; -: 1040:#endif 5102: 1041: for (i = 0; i < pixels-1; i+=2) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 5001: 1042: pixel = (((UINT16) in[0]) << 4 ) + (in[1] >>4); -: 1043:#ifdef WORDS_BIGENDIAN -: 1044: out[0] = tmp[1]; out[1] = tmp[0]; -: 1045:#else 5001: 1046: memcpy(out, &pixel, sizeof(pixel)); -: 1047:#endif -: 1048: 5001: 1049: out+=2; 5001: 1050: pixel = (((UINT16) (in[1] & 0x0F)) << 8) + in[2]; -: 1051:#ifdef WORDS_BIGENDIAN -: 1052: out[0] = tmp[1]; out[1] = tmp[0]; -: 1053:#else 5001: 1054: memcpy(out, &pixel, sizeof(pixel)); -: 1055:#endif -: 1056: 5001: 1057: in += 3; out+=2; -: 1058: } 101: 1059: if (i == pixels-1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 1060: pixel = (((UINT16) in[0]) << 4 ) + (in[1] >>4); -: 1061:#ifdef WORDS_BIGENDIAN -: 1062: out[0] = tmp[1]; out[1] = tmp[0]; -: 1063:#else -: 1064: memcpy(out, &pixel, sizeof(pixel)); -: 1065:#endif -: 1066: } 101: 1067:} -: 1068: -: 1069: -: 1070:static void function copy1 called 366649 returned 100% blocks executed 100% 366649: 1071:copy1(UINT8* out, const UINT8* in, int pixels) -: 1072:{ -: 1073: /* L, P */ 733298: 1074: memcpy(out, in, pixels); 366649: 1075:} -: 1076: -: 1077:static void function copy2 called 145 returned 100% blocks executed 100% 145: 1078:copy2(UINT8* out, const UINT8* in, int pixels) -: 1079:{ -: 1080: /* I;16 */ 290: 1081: memcpy(out, in, pixels*2); 145: 1082:} -: 1083: -: 1084:static void function copy4 called 121933 returned 100% blocks executed 100% 121933: 1085:copy4(UINT8* out, const UINT8* in, int pixels) -: 1086:{ -: 1087: /* RGBA, CMYK quadruples */ 243866: 1088: memcpy(out, in, 4 * pixels); 121933: 1089:} -: 1090: -: 1091:static void function copy4skip1 called 3 returned 100% blocks executed 100% 3: 1092:copy4skip1(UINT8* _out, const UINT8* in, int pixels) -: 1093:{ -: 1094: int i; 12: 1095: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 9: 1096: memcpy(_out, in, 4); 9: 1097: in += 5; _out += 4; -: 1098: } 3: 1099:} -: 1100: -: 1101:static void function copy4skip2 called 3 returned 100% blocks executed 100% 3: 1102:copy4skip2(UINT8* _out, const UINT8* in, int pixels) -: 1103:{ -: 1104: int i; 12: 1105: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 9: 1106: memcpy(_out, in, 4); 9: 1107: in += 6; _out += 4; -: 1108: } 3: 1109:} -: 1110: -: 1111: -: 1112:/* Unpack to "I" and "F" images */ -: 1113: -: 1114:#define UNPACK_RAW(NAME, GET, INTYPE, OUTTYPE)\ -: 1115:static void NAME(UINT8* out_, const UINT8* in, int pixels)\ -: 1116:{\ -: 1117: int i;\ -: 1118: OUTTYPE* out = (OUTTYPE*) out_;\ -: 1119: for (i = 0; i < pixels; i++, in += sizeof(INTYPE)) {\ -: 1120: out[i] = (OUTTYPE) ((INTYPE) GET);\ -: 1121: }\ -: 1122:} -: 1123: -: 1124:#define UNPACK(NAME, COPY, INTYPE, OUTTYPE)\ -: 1125:static void NAME(UINT8* out_, const UINT8* in, int pixels)\ -: 1126:{\ -: 1127: int i;\ -: 1128: OUTTYPE* out = (OUTTYPE*) out_;\ -: 1129: INTYPE tmp_;\ -: 1130: UINT8* tmp = (UINT8*) &tmp_;\ -: 1131: for (i = 0; i < pixels; i++, in += sizeof(INTYPE)) {\ -: 1132: COPY;\ -: 1133: out[i] = (OUTTYPE) tmp_;\ -: 1134: }\ -: 1135:} -: 1136: function unpackI8 called 21 returned 100% blocks executed 100% 21: 1137:UNPACK_RAW(unpackI8, in[0], UINT8, INT32) branch 0 taken 91% branch 1 taken 9% (fallthrough) function unpackI8S called 1 returned 100% blocks executed 100% 1: 1138:UNPACK_RAW(unpackI8S, in[0], INT8, INT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackI16 called 1 returned 100% blocks executed 100% 1: 1139:UNPACK(unpackI16, C16L, UINT16, INT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackI16S called 31 returned 100% blocks executed 100% 31: 1140:UNPACK(unpackI16S, C16L, INT16, INT32) branch 0 taken 91% branch 1 taken 9% (fallthrough) function unpackI16B called 1685 returned 100% blocks executed 100% 1685: 1141:UNPACK(unpackI16B, C16B, UINT16, INT32) branch 0 taken 99% branch 1 taken 1% (fallthrough) function unpackI16BS called 1 returned 100% blocks executed 100% 1: 1142:UNPACK(unpackI16BS, C16B, INT16, INT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackI16N called 1 returned 100% blocks executed 100% 1: 1143:UNPACK(unpackI16N, C16N, UINT16, INT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackI16NS called 1 returned 100% blocks executed 100% 1: 1144:UNPACK(unpackI16NS, C16N, INT16, INT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackI32 called 21 returned 100% blocks executed 100% 21: 1145:UNPACK(unpackI32, C32L, UINT32, INT32) branch 0 taken 91% branch 1 taken 9% (fallthrough) function unpackI32S called 33 returned 100% blocks executed 100% 33: 1146:UNPACK(unpackI32S, C32L, INT32, INT32) branch 0 taken 97% branch 1 taken 3% (fallthrough) function unpackI32B called 1 returned 100% blocks executed 100% 1: 1147:UNPACK(unpackI32B, C32B, UINT32, INT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackI32BS called 1 returned 100% blocks executed 100% 1: 1148:UNPACK(unpackI32BS, C32B, INT32, INT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackI32N called 1 returned 100% blocks executed 100% 1: 1149:UNPACK(unpackI32N, C32N, UINT32, INT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackI32NS called 1 returned 100% blocks executed 100% 1: 1150:UNPACK(unpackI32NS, C32N, INT32, INT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) -: 1151: function unpackF8 called 1 returned 100% blocks executed 100% 1: 1152:UNPACK_RAW(unpackF8, in[0], UINT8, FLOAT32) branch 0 taken 80% branch 1 taken 20% (fallthrough) function unpackF8S called 1 returned 100% blocks executed 100% 1: 1153:UNPACK_RAW(unpackF8S, in[0], INT8, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF16 called 1 returned 100% blocks executed 100% 1: 1154:UNPACK(unpackF16, C16L, UINT16, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF16S called 1 returned 100% blocks executed 100% 1: 1155:UNPACK(unpackF16S, C16L, INT16, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF16B called 1 returned 100% blocks executed 100% 1: 1156:UNPACK(unpackF16B, C16B, UINT16, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF16BS called 1 returned 100% blocks executed 100% 1: 1157:UNPACK(unpackF16BS, C16B, INT16, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF16N called 1 returned 100% blocks executed 100% 1: 1158:UNPACK(unpackF16N, C16N, UINT16, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF16NS called 1 returned 100% blocks executed 100% 1: 1159:UNPACK(unpackF16NS, C16N, INT16, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF32 called 1 returned 100% blocks executed 100% 1: 1160:UNPACK(unpackF32, C32L, UINT32, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF32S called 1 returned 100% blocks executed 100% 1: 1161:UNPACK(unpackF32S, C32L, INT32, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF32B called 1 returned 100% blocks executed 100% 1: 1162:UNPACK(unpackF32B, C32B, UINT32, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF32BS called 1 returned 100% blocks executed 100% 1: 1163:UNPACK(unpackF32BS, C32B, INT32, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF32N called 1 returned 100% blocks executed 100% 1: 1164:UNPACK(unpackF32N, C32N, UINT32, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF32NS called 1 returned 100% blocks executed 100% 1: 1165:UNPACK(unpackF32NS, C32N, INT32, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF32F called 961 returned 100% blocks executed 100% 961: 1166:UNPACK(unpackF32F, C32L, FLOAT32, FLOAT32) branch 0 taken 99% branch 1 taken 1% (fallthrough) function unpackF32BF called 1 returned 100% blocks executed 100% 1: 1167:UNPACK(unpackF32BF, C32B, FLOAT32, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF32NF called 1 returned 100% blocks executed 100% 1: 1168:UNPACK(unpackF32NF, C32N, FLOAT32, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) -: 1169:#ifdef FLOAT64 function unpackF64F called 41 returned 100% blocks executed 100% 41: 1170:UNPACK(unpackF64F, C64L, FLOAT64, FLOAT32) branch 0 taken 91% branch 1 taken 9% (fallthrough) function unpackF64BF called 1 returned 100% blocks executed 100% 1: 1171:UNPACK(unpackF64BF, C64B, FLOAT64, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) function unpackF64NF called 1 returned 100% blocks executed 100% 1: 1172:UNPACK(unpackF64NF, C64N, FLOAT64, FLOAT32) branch 0 taken 67% branch 1 taken 33% (fallthrough) -: 1173:#endif -: 1174: -: 1175: -: 1176:/* Misc. unpackers */ -: 1177: -: 1178:static void function band0 called 6158 returned 100% blocks executed 100% 6158: 1179:band0(UINT8* out, const UINT8* in, int pixels) -: 1180:{ -: 1181: int i; -: 1182: /* band 0 only */ 835516: 1183: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 829358: 1184: out[0] = in[i]; 829358: 1185: out += 4; -: 1186: } 6158: 1187:} -: 1188: -: 1189:static void function band1 called 6158 returned 100% blocks executed 100% 6158: 1190:band1(UINT8* out, const UINT8* in, int pixels) -: 1191:{ -: 1192: int i; -: 1193: /* band 1 only */ 835516: 1194: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 829358: 1195: out[1] = in[i]; 829358: 1196: out += 4; -: 1197: } 6158: 1198:} -: 1199: -: 1200:static void function band2 called 6158 returned 100% blocks executed 100% 6158: 1201:band2(UINT8* out, const UINT8* in, int pixels) -: 1202:{ -: 1203: int i; -: 1204: /* band 2 only */ 835516: 1205: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 829358: 1206: out[2] = in[i]; 829358: 1207: out += 4; -: 1208: } 6158: 1209:} -: 1210: -: 1211:static void function band3 called 409 returned 100% blocks executed 100% 409: 1212:band3(UINT8* out, const UINT8* in, int pixels) -: 1213:{ -: 1214: /* band 3 only */ -: 1215: int i; 63186: 1216: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 62777: 1217: out[3] = in[i]; 62777: 1218: out += 4; -: 1219: } 409: 1220:} -: 1221: -: 1222:static void function band0I called 1 returned 100% blocks executed 100% 1: 1223:band0I(UINT8* out, const UINT8* in, int pixels) -: 1224:{ -: 1225: int i; -: 1226: /* band 0 only */ 4: 1227: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 1228: out[0] = ~in[i]; 3: 1229: out += 4; -: 1230: } 1: 1231:} -: 1232: -: 1233:static void function band1I called 1 returned 100% blocks executed 100% 1: 1234:band1I(UINT8* out, const UINT8* in, int pixels) -: 1235:{ -: 1236: int i; -: 1237: /* band 1 only */ 4: 1238: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 1239: out[1] = ~in[i]; 3: 1240: out += 4; -: 1241: } 1: 1242:} -: 1243: -: 1244:static void function band2I called 1 returned 100% blocks executed 100% 1: 1245:band2I(UINT8* out, const UINT8* in, int pixels) -: 1246:{ -: 1247: int i; -: 1248: /* band 2 only */ 4: 1249: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 1250: out[2] = ~in[i]; 3: 1251: out += 4; -: 1252: } 1: 1253:} -: 1254: -: 1255:static void function band3I called 1 returned 100% blocks executed 100% 1: 1256:band3I(UINT8* out, const UINT8* in, int pixels) -: 1257:{ -: 1258: /* band 3 only */ -: 1259: int i; 4: 1260: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 1261: out[3] = ~in[i]; 3: 1262: out += 4; -: 1263: } 1: 1264:} -: 1265: -: 1266:static struct { -: 1267: const char* mode; -: 1268: const char* rawmode; -: 1269: int bits; -: 1270: ImagingShuffler unpack; -: 1271:} unpackers[] = { -: 1272: -: 1273: /* raw mode syntax is ";" where "bits" defaults -: 1274: depending on mode (1 for "1", 8 for "P" and "L", etc), and -: 1275: "flags" should be given in alphabetical order. if both bits -: 1276: and flags have their default values, the ; should be left out */ -: 1277: -: 1278: /* flags: "I" inverted data; "R" reversed bit order; "B" big -: 1279: endian byte order (default is little endian); "L" line -: 1280: interleave, "S" signed, "F" floating point */ -: 1281: -: 1282: /* exception: rawmodes "I" and "F" are always native endian byte order */ -: 1283: -: 1284: /* bilevel */ -: 1285: {"1", "1", 1, unpack1}, -: 1286: {"1", "1;I", 1, unpack1I}, -: 1287: {"1", "1;R", 1, unpack1R}, -: 1288: {"1", "1;IR", 1, unpack1IR}, -: 1289: {"1", "1;8", 8, unpack18}, -: 1290: -: 1291: /* greyscale */ -: 1292: {"L", "L;2", 2, unpackL2}, -: 1293: {"L", "L;2I", 2, unpackL2I}, -: 1294: {"L", "L;2R", 2, unpackL2R}, -: 1295: {"L", "L;2IR", 2, unpackL2IR}, -: 1296: -: 1297: {"L", "L;4", 4, unpackL4}, -: 1298: {"L", "L;4I", 4, unpackL4I}, -: 1299: {"L", "L;4R", 4, unpackL4R}, -: 1300: {"L", "L;4IR", 4, unpackL4IR}, -: 1301: -: 1302: {"L", "L", 8, copy1}, -: 1303: {"L", "L;I", 8, unpackLI}, -: 1304: {"L", "L;R", 8, unpackLR}, -: 1305: {"L", "L;16", 16, unpackL16}, -: 1306: {"L", "L;16B", 16, unpackL16B}, -: 1307: -: 1308: /* greyscale w. alpha */ -: 1309: {"LA", "LA", 16, unpackLA}, -: 1310: {"LA", "LA;L", 16, unpackLAL}, -: 1311: -: 1312: /* greyscale w. alpha premultiplied */ -: 1313: {"La", "La", 16, unpackLA}, -: 1314: -: 1315: /* palette */ -: 1316: {"P", "P;1", 1, unpackP1}, -: 1317: {"P", "P;2", 2, unpackP2}, -: 1318: {"P", "P;2L", 2, unpackP2L}, -: 1319: {"P", "P;4", 4, unpackP4}, -: 1320: {"P", "P;4L", 4, unpackP4L}, -: 1321: {"P", "P", 8, copy1}, -: 1322: {"P", "P;R", 8, unpackLR}, -: 1323: -: 1324: /* palette w. alpha */ -: 1325: {"PA", "PA", 16, unpackLA}, -: 1326: {"PA", "PA;L", 16, unpackLAL}, -: 1327: -: 1328: /* true colour */ -: 1329: {"RGB", "RGB", 24, ImagingUnpackRGB}, -: 1330: {"RGB", "RGB;L", 24, unpackRGBL}, -: 1331: {"RGB", "RGB;R", 24, unpackRGBR}, -: 1332: {"RGB", "RGB;16L", 48, unpackRGB16L}, -: 1333: {"RGB", "RGB;16B", 48, unpackRGB16B}, -: 1334: {"RGB", "BGR", 24, ImagingUnpackBGR}, -: 1335: {"RGB", "RGB;15", 16, ImagingUnpackRGB15}, -: 1336: {"RGB", "BGR;15", 16, ImagingUnpackBGR15}, -: 1337: {"RGB", "RGB;16", 16, ImagingUnpackRGB16}, -: 1338: {"RGB", "BGR;16", 16, ImagingUnpackBGR16}, -: 1339: {"RGB", "RGB;4B", 16, ImagingUnpackRGB4B}, -: 1340: {"RGB", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */ -: 1341: {"RGB", "RGBX", 32, copy4}, -: 1342: {"RGB", "RGBX;L", 32, unpackRGBAL}, -: 1343: {"RGB", "RGBA;L", 32, unpackRGBAL}, -: 1344: {"RGB", "BGRX", 32, ImagingUnpackBGRX}, -: 1345: {"RGB", "XRGB", 32, ImagingUnpackXRGB}, -: 1346: {"RGB", "XBGR", 32, ImagingUnpackXBGR}, -: 1347: {"RGB", "YCC;P", 24, ImagingUnpackYCC}, -: 1348: {"RGB", "R", 8, band0}, -: 1349: {"RGB", "G", 8, band1}, -: 1350: {"RGB", "B", 8, band2}, -: 1351: -: 1352: /* true colour w. alpha */ -: 1353: {"RGBA", "LA", 16, unpackRGBALA}, -: 1354: {"RGBA", "LA;16B", 32, unpackRGBALA16B}, -: 1355: {"RGBA", "RGBA", 32, copy4}, -: 1356: {"RGBA", "RGBAX", 40, copy4skip1}, -: 1357: {"RGBA", "RGBAXX", 48, copy4skip2}, -: 1358: {"RGBA", "RGBa", 32, unpackRGBa}, -: 1359: {"RGBA", "RGBaX", 40, unpackRGBaskip1}, -: 1360: {"RGBA", "RGBaXX", 48, unpackRGBaskip2}, -: 1361: {"RGBA", "RGBa;16L", 64, unpackRGBa16L}, -: 1362: {"RGBA", "RGBa;16B", 64, unpackRGBa16B}, -: 1363: {"RGBA", "BGRa", 32, unpackBGRa}, -: 1364: {"RGBA", "RGBA;I", 32, unpackRGBAI}, -: 1365: {"RGBA", "RGBA;L", 32, unpackRGBAL}, -: 1366: {"RGBA", "RGBA;15", 16, ImagingUnpackRGBA15}, -: 1367: {"RGBA", "BGRA;15", 16, ImagingUnpackBGRA15}, -: 1368: {"RGBA", "RGBA;4B", 16, ImagingUnpackRGBA4B}, -: 1369: {"RGBA", "RGBA;16L", 64, unpackRGBA16L}, -: 1370: {"RGBA", "RGBA;16B", 64, unpackRGBA16B}, -: 1371: {"RGBA", "BGRA", 32, unpackBGRA}, -: 1372: {"RGBA", "ARGB", 32, unpackARGB}, -: 1373: {"RGBA", "ABGR", 32, unpackABGR}, -: 1374: {"RGBA", "YCCA;P", 32, ImagingUnpackYCCA}, -: 1375: {"RGBA", "R", 8, band0}, -: 1376: {"RGBA", "G", 8, band1}, -: 1377: {"RGBA", "B", 8, band2}, -: 1378: {"RGBA", "A", 8, band3}, -: 1379: -: 1380:#ifdef WORDS_BIGENDIAN -: 1381: {"RGB", "RGB;16N", 48, unpackRGB16B}, -: 1382: {"RGBA", "RGBa;16N", 64, unpackRGBa16B}, -: 1383: {"RGBA", "RGBA;16N", 64, unpackRGBA16B}, -: 1384: {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, -: 1385:#else -: 1386: {"RGB", "RGB;16N", 48, unpackRGB16L}, -: 1387: {"RGBA", "RGBa;16N", 64, unpackRGBa16L}, -: 1388: {"RGBA", "RGBA;16N", 64, unpackRGBA16L}, -: 1389: {"RGBX", "RGBX;16N", 64, unpackRGBA16B}, -: 1390:#endif -: 1391: -: 1392: /* true colour w. alpha premultiplied */ -: 1393: {"RGBa", "RGBa", 32, copy4}, -: 1394: {"RGBa", "BGRa", 32, unpackBGRA}, -: 1395: {"RGBa", "aRGB", 32, unpackARGB}, -: 1396: {"RGBa", "aBGR", 32, unpackABGR}, -: 1397: -: 1398: /* true colour w. padding */ -: 1399: {"RGBX", "RGB", 24, ImagingUnpackRGB}, -: 1400: {"RGBX", "RGB;L", 24, unpackRGBL}, -: 1401: {"RGBX", "RGB;16B", 48, unpackRGB16B}, -: 1402: {"RGBX", "BGR", 24, ImagingUnpackBGR}, -: 1403: {"RGBX", "RGB;15", 16, ImagingUnpackRGB15}, -: 1404: {"RGBX", "BGR;15", 16, ImagingUnpackBGR15}, -: 1405: {"RGBX", "RGB;4B", 16, ImagingUnpackRGB4B}, -: 1406: {"RGBX", "BGR;5", 16, ImagingUnpackBGR15}, /* compat */ -: 1407: {"RGBX", "RGBX", 32, copy4}, -: 1408: {"RGBX", "RGBXX", 40, copy4skip1}, -: 1409: {"RGBX", "RGBXXX", 48, copy4skip2}, -: 1410: {"RGBX", "RGBX;L", 32, unpackRGBAL}, -: 1411: {"RGBX", "RGBX;16L", 64, unpackRGBA16L}, -: 1412: {"RGBX", "RGBX;16B", 64, unpackRGBA16B}, -: 1413: {"RGBX", "BGRX", 32, ImagingUnpackBGRX}, -: 1414: {"RGBX", "XRGB", 32, ImagingUnpackXRGB}, -: 1415: {"RGBX", "XBGR", 32, ImagingUnpackXBGR}, -: 1416: {"RGBX", "YCC;P", 24, ImagingUnpackYCC}, -: 1417: {"RGBX", "R", 8, band0}, -: 1418: {"RGBX", "G", 8, band1}, -: 1419: {"RGBX", "B", 8, band2}, -: 1420: {"RGBX", "X", 8, band3}, -: 1421: -: 1422: /* colour separation */ -: 1423: {"CMYK", "CMYK", 32, copy4}, -: 1424: {"CMYK", "CMYKX", 40, copy4skip1}, -: 1425: {"CMYK", "CMYKXX", 48, copy4skip2}, -: 1426: {"CMYK", "CMYK;I", 32, unpackCMYKI}, -: 1427: {"CMYK", "CMYK;L", 32, unpackRGBAL}, -: 1428: {"CMYK", "CMYK;16L", 64, unpackRGBA16L}, -: 1429: {"CMYK", "CMYK;16B", 64, unpackRGBA16B}, -: 1430: {"CMYK", "C", 8, band0}, -: 1431: {"CMYK", "M", 8, band1}, -: 1432: {"CMYK", "Y", 8, band2}, -: 1433: {"CMYK", "K", 8, band3}, -: 1434: {"CMYK", "C;I", 8, band0I}, -: 1435: {"CMYK", "M;I", 8, band1I}, -: 1436: {"CMYK", "Y;I", 8, band2I}, -: 1437: {"CMYK", "K;I", 8, band3I}, -: 1438: -: 1439:#ifdef WORDS_BIGENDIAN -: 1440: {"CMYK", "CMYK;16N", 64, unpackRGBA16B}, -: 1441:#else -: 1442: {"CMYK", "CMYK;16N", 64, unpackRGBA16L}, -: 1443:#endif -: 1444: -: 1445: /* video (YCbCr) */ -: 1446: {"YCbCr", "YCbCr", 24, ImagingUnpackRGB}, -: 1447: {"YCbCr", "YCbCr;L", 24, unpackRGBL}, -: 1448: {"YCbCr", "YCbCrX", 32, copy4}, -: 1449: {"YCbCr", "YCbCrK", 32, copy4}, -: 1450: -: 1451: /* LAB Color */ -: 1452: {"LAB", "LAB", 24, ImagingUnpackLAB}, -: 1453: {"LAB", "L", 8, band0}, -: 1454: {"LAB", "A", 8, band1}, -: 1455: {"LAB", "B", 8, band2}, -: 1456: -: 1457: /* HSV Color */ -: 1458: {"HSV", "HSV", 24, ImagingUnpackRGB}, -: 1459: {"HSV", "H", 8, band0}, -: 1460: {"HSV", "S", 8, band1}, -: 1461: {"HSV", "V", 8, band2}, -: 1462: -: 1463: /* integer variations */ -: 1464: {"I", "I", 32, copy4}, -: 1465: {"I", "I;8", 8, unpackI8}, -: 1466: {"I", "I;8S", 8, unpackI8S}, -: 1467: {"I", "I;16", 16, unpackI16}, -: 1468: {"I", "I;16S", 16, unpackI16S}, -: 1469: {"I", "I;16B", 16, unpackI16B}, -: 1470: {"I", "I;16BS", 16, unpackI16BS}, -: 1471: {"I", "I;16N", 16, unpackI16N}, -: 1472: {"I", "I;16NS", 16, unpackI16NS}, -: 1473: {"I", "I;32", 32, unpackI32}, -: 1474: {"I", "I;32S", 32, unpackI32S}, -: 1475: {"I", "I;32B", 32, unpackI32B}, -: 1476: {"I", "I;32BS", 32, unpackI32BS}, -: 1477: {"I", "I;32N", 32, unpackI32N}, -: 1478: {"I", "I;32NS", 32, unpackI32NS}, -: 1479: -: 1480: /* floating point variations */ -: 1481: {"F", "F", 32, copy4}, -: 1482: {"F", "F;8", 8, unpackF8}, -: 1483: {"F", "F;8S", 8, unpackF8S}, -: 1484: {"F", "F;16", 16, unpackF16}, -: 1485: {"F", "F;16S", 16, unpackF16S}, -: 1486: {"F", "F;16B", 16, unpackF16B}, -: 1487: {"F", "F;16BS", 16, unpackF16BS}, -: 1488: {"F", "F;16N", 16, unpackF16N}, -: 1489: {"F", "F;16NS", 16, unpackF16NS}, -: 1490: {"F", "F;32", 32, unpackF32}, -: 1491: {"F", "F;32S", 32, unpackF32S}, -: 1492: {"F", "F;32B", 32, unpackF32B}, -: 1493: {"F", "F;32BS", 32, unpackF32BS}, -: 1494: {"F", "F;32N", 32, unpackF32N}, -: 1495: {"F", "F;32NS", 32, unpackF32NS}, -: 1496: {"F", "F;32F", 32, unpackF32F}, -: 1497: {"F", "F;32BF", 32, unpackF32BF}, -: 1498: {"F", "F;32NF", 32, unpackF32NF}, -: 1499:#ifdef FLOAT64 -: 1500: {"F", "F;64F", 64, unpackF64F}, -: 1501: {"F", "F;64BF", 64, unpackF64BF}, -: 1502: {"F", "F;64NF", 64, unpackF64NF}, -: 1503:#endif -: 1504: -: 1505: /* storage modes */ -: 1506: {"I;16", "I;16", 16, copy2}, -: 1507: {"I;16B", "I;16B", 16, copy2}, -: 1508: {"I;16L", "I;16L", 16, copy2}, -: 1509: -: 1510: {"I;16", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian. -: 1511: {"I;16L", "I;16N", 16, unpackI16N_I16}, // LibTiff native->image endian. -: 1512: {"I;16B", "I;16N", 16, unpackI16N_I16B}, -: 1513: -: 1514: {"I;16", "I;12", 12, unpackI12_I16}, // 12 bit Tiffs stored in 16bits. -: 1515: -: 1516: {NULL} /* sentinel */ -: 1517:}; -: 1518: -: 1519: -: 1520:ImagingShuffler function ImagingFindUnpacker called 17246 returned 100% blocks executed 100% 17246: 1521:ImagingFindUnpacker(const char* mode, const char* rawmode, int* bits_out) -: 1522:{ -: 1523: int i; -: 1524: -: 1525: /* find a suitable pixel unpacker */ 164517: 1526: for (i = 0; unpackers[i].rawmode; i++) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 199732: 1527: if (strcmp(unpackers[i].mode, mode) == 0 && branch 0 taken 21% (fallthrough) branch 1 taken 79% branch 2 taken 49% (fallthrough) branch 3 taken 51% 35215: 1528: strcmp(unpackers[i].rawmode, rawmode) == 0) { 17246: 1529: if (bits_out) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 17246: 1530: *bits_out = unpackers[i].bits; -: 1531: } 17246: 1532: return unpackers[i].unpack; -: 1533: } -: 1534: } -: 1535: -: 1536: /* FIXME: configure a general unpacker based on the type codes... */ -: 1537: -: 1538: return NULL; -: 1539:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Reduce.c.gcov -: 0:Source:src/libImaging/Reduce.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Reduce.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Reduce.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:#include "Imaging.h" -: 2: -: 3:#include -: 4: -: 5:#define ROUND_UP(f) ((int) ((f) >= 0.0 ? (f) + 0.5F : (f) - 0.5F)) -: 6: -: 7: -: 8:UINT32 function division_UINT32 called 882 returned 100% blocks executed 100% 882: 9:division_UINT32(int divider, int result_bits) -: 10:{ 882: 11: UINT32 max_dividend = (1 << result_bits) * divider; 882: 12: float max_int = (1 << 30) * 4.0; 882: 13: return (UINT32) (max_int / max_dividend); -: 14:} -: 15: -: 16: -: 17:void function ImagingReduceNxN called 129 returned 100% blocks executed 100% 129: 18:ImagingReduceNxN(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) -: 19:{ -: 20: /* The most general implementation for any xscale and yscale -: 21: */ -: 22: int x, y, xx, yy; 129: 23: UINT32 multiplier = division_UINT32(yscale * xscale, 8); call 0 returned 100% 129: 24: UINT32 amend = yscale * xscale / 2; -: 25: 129: 26: if (imIn->image8) { branch 0 taken 79% (fallthrough) branch 1 taken 21% 1235: 27: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 98% branch 1 taken 2% 1235: 28: int yy_from = box[1] + y*yscale; 120321: 29: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 119086: 30: int xx_from = box[0] + x*xscale; 119086: 31: UINT32 ss = amend; 459494: 32: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 74% branch 1 taken 26% (fallthrough) 340408: 33: UINT8 *line0 = (UINT8 *)imIn->image8[yy]; 340408: 34: UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; 1101928: 35: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 69% branch 1 taken 31% (fallthrough) 2284560: 36: ss += line0[xx + 0] + line0[xx + 1] + 1523040: 37: line1[xx + 0] + line1[xx + 1]; -: 38: } 340408: 39: if (xscale & 0x01) { branch 0 taken 55% (fallthrough) branch 1 taken 45% 187924: 40: ss += line0[xx + 0] + line1[xx + 0]; -: 41: } -: 42: } 119086: 43: if (yscale & 0x01) { branch 0 taken 54% (fallthrough) branch 1 taken 46% 64750: 44: UINT8 *line = (UINT8 *)imIn->image8[yy]; 190180: 45: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 66% branch 1 taken 34% (fallthrough) 125430: 46: ss += line[xx + 0] + line[xx + 1]; -: 47: } 64750: 48: if (xscale & 0x01) { branch 0 taken 51% (fallthrough) branch 1 taken 49% 32772: 49: ss += line[xx + 0]; -: 50: } -: 51: } 119086: 52: imOut->image8[y][x] = (ss * multiplier) >> 24; -: 53: } -: 54: } -: 55: } else { 4225: 56: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 4225: 57: int yy_from = box[1] + y*yscale; 4225: 58: if (imIn->bands == 2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 144786: 59: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 144786: 60: int xx_from = box[0] + x*xscale; -: 61: UINT32 v; 144786: 62: UINT32 ss0 = amend, ss3 = amend; 591574: 63: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 446788: 64: UINT8 *line0 = (UINT8 *)imIn->image[yy]; 446788: 65: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 1550440: 66: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 3310956: 67: ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + 2207304: 68: line1[xx*4 + 0] + line1[xx*4 + 4]; 3310956: 69: ss3 += line0[xx*4 + 3] + line0[xx*4 + 7] + 2207304: 70: line1[xx*4 + 3] + line1[xx*4 + 7]; -: 71: } 446788: 72: if (xscale & 0x01) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 178000: 73: ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; 178000: 74: ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; -: 75: } -: 76: } 144786: 77: if (yscale & 0x01) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 57206: 78: UINT8 *line = (UINT8 *)imIn->image[yy]; 189020: 79: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 131814: 80: ss0 += line[xx*4 + 0] + line[xx*4 + 4]; 131814: 81: ss3 += line[xx*4 + 3] + line[xx*4 + 7]; -: 82: } 57206: 83: if (xscale & 0x01) { branch 0 taken 47% (fallthrough) branch 1 taken 53% 26786: 84: ss0 += line[xx*4 + 0]; 26786: 85: ss3 += line[xx*4 + 3]; -: 86: } -: 87: } 144786: 88: v = MAKE_UINT32( -: 89: (ss0 * multiplier) >> 24, 0, -: 90: 0, (ss3 * multiplier) >> 24); 289572: 91: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 92: } 2450: 93: } else if (imIn->bands == 3) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 50506: 94: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 50506: 95: int xx_from = box[0] + x*xscale; -: 96: UINT32 v; 50506: 97: UINT32 ss0 = amend, ss1 = amend, ss2 = amend; 206354: 98: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 155848: 99: UINT8 *line0 = (UINT8 *)imIn->image[yy]; 155848: 100: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 540760: 101: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 1154736: 102: ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + 769824: 103: line1[xx*4 + 0] + line1[xx*4 + 4]; 1154736: 104: ss1 += line0[xx*4 + 1] + line0[xx*4 + 5] + 769824: 105: line1[xx*4 + 1] + line1[xx*4 + 5]; 1154736: 106: ss2 += line0[xx*4 + 2] + line0[xx*4 + 6] + 769824: 107: line1[xx*4 + 2] + line1[xx*4 + 6]; -: 108: } 155848: 109: if (xscale & 0x01) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 62116: 110: ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; 62116: 111: ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; 62116: 112: ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; -: 113: } -: 114: } 50506: 115: if (yscale & 0x01) { branch 0 taken 39% (fallthrough) branch 1 taken 61% 19946: 116: UINT8 *line = (UINT8 *)imIn->image[yy]; 65900: 117: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 45954: 118: ss0 += line[xx*4 + 0] + line[xx*4 + 4]; 45954: 119: ss1 += line[xx*4 + 1] + line[xx*4 + 5]; 45954: 120: ss2 += line[xx*4 + 2] + line[xx*4 + 6]; -: 121: } 19946: 122: if (xscale & 0x01) { branch 0 taken 47% (fallthrough) branch 1 taken 53% 9344: 123: ss0 += line[xx*4 + 0]; 9344: 124: ss1 += line[xx*4 + 1]; 9344: 125: ss2 += line[xx*4 + 2]; -: 126: } -: 127: } 50506: 128: v = MAKE_UINT32( -: 129: (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, -: 130: (ss2 * multiplier) >> 24, 0); 101012: 131: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 132: } -: 133: } else { // bands == 4 144786: 134: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 144786: 135: int xx_from = box[0] + x*xscale; -: 136: UINT32 v; 144786: 137: UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; 591574: 138: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 446788: 139: UINT8 *line0 = (UINT8 *)imIn->image[yy]; 446788: 140: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 1550440: 141: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 3310956: 142: ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + 2207304: 143: line1[xx*4 + 0] + line1[xx*4 + 4]; 3310956: 144: ss1 += line0[xx*4 + 1] + line0[xx*4 + 5] + 2207304: 145: line1[xx*4 + 1] + line1[xx*4 + 5]; 3310956: 146: ss2 += line0[xx*4 + 2] + line0[xx*4 + 6] + 2207304: 147: line1[xx*4 + 2] + line1[xx*4 + 6]; 3310956: 148: ss3 += line0[xx*4 + 3] + line0[xx*4 + 7] + 2207304: 149: line1[xx*4 + 3] + line1[xx*4 + 7]; -: 150: } 446788: 151: if (xscale & 0x01) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 178000: 152: ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; 178000: 153: ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; 178000: 154: ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; 178000: 155: ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; -: 156: } -: 157: } 144786: 158: if (yscale & 0x01) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 57206: 159: UINT8 *line = (UINT8 *)imIn->image[yy]; 189020: 160: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 131814: 161: ss0 += line[xx*4 + 0] + line[xx*4 + 4]; 131814: 162: ss1 += line[xx*4 + 1] + line[xx*4 + 5]; 131814: 163: ss2 += line[xx*4 + 2] + line[xx*4 + 6]; 131814: 164: ss3 += line[xx*4 + 3] + line[xx*4 + 7]; -: 165: } 57206: 166: if (xscale & 0x01) { branch 0 taken 47% (fallthrough) branch 1 taken 53% 26786: 167: ss0 += line[xx*4 + 0]; 26786: 168: ss1 += line[xx*4 + 1]; 26786: 169: ss2 += line[xx*4 + 2]; 26786: 170: ss3 += line[xx*4 + 3]; -: 171: } -: 172: } 144786: 173: v = MAKE_UINT32( -: 174: (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, -: 175: (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); 289572: 176: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 177: } -: 178: } -: 179: } -: 180: } 129: 181:} -: 182: -: 183: -: 184:void function ImagingReduce1xN called 40 returned 100% blocks executed 100% 40: 185:ImagingReduce1xN(Imaging imOut, Imaging imIn, int box[4], int yscale) -: 186:{ -: 187: /* Optimized implementation for xscale = 1. -: 188: */ -: 189: int x, y, yy; 40: 190: int xscale = 1; 40: 191: UINT32 multiplier = division_UINT32(yscale * xscale, 8); call 0 returned 100% 40: 192: UINT32 amend = yscale * xscale / 2; -: 193: 40: 194: if (imIn->image8) { branch 0 taken 85% (fallthrough) branch 1 taken 15% 314: 195: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 98% branch 1 taken 2% 314: 196: int yy_from = box[1] + y*yscale; 117350: 197: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 117036: 198: int xx = box[0] + x*xscale; 117036: 199: UINT32 ss = amend; 393642: 200: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 276606: 201: UINT8 *line0 = (UINT8 *)imIn->image8[yy]; 276606: 202: UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; 276606: 203: ss += line0[xx + 0] + line1[xx + 0]; -: 204: } 117036: 205: if (yscale & 0x01) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 42534: 206: UINT8 *line = (UINT8 *)imIn->image8[yy]; 42534: 207: ss += line[xx + 0]; -: 208: } 117036: 209: imOut->image8[y][x] = (ss * multiplier) >> 24; -: 210: } -: 211: } -: 212: } else { 1966: 213: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 1966: 214: int yy_from = box[1] + y*yscale; 1966: 215: if (imIn->bands == 2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 335448: 216: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 335448: 217: int xx = box[0] + x*xscale; -: 218: UINT32 v; 335448: 219: UINT32 ss0 = amend, ss3 = amend; 1128276: 220: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 792828: 221: UINT8 *line0 = (UINT8 *)imIn->image[yy]; 792828: 222: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 792828: 223: ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; 792828: 224: ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; -: 225: } 335448: 226: if (yscale & 0x01) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 121932: 227: UINT8 *line = (UINT8 *)imIn->image[yy]; 121932: 228: ss0 += line[xx*4 + 0]; 121932: 229: ss3 += line[xx*4 + 3]; -: 230: } 335448: 231: v = MAKE_UINT32( -: 232: (ss0 * multiplier) >> 24, 0, -: 233: 0, (ss3 * multiplier) >> 24); 670896: 234: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 235: } 1140: 236: } else if (imIn->bands == 3) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 117036: 237: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 117036: 238: int xx = box[0] + x*xscale; -: 239: UINT32 v; 117036: 240: UINT32 ss0 = amend, ss1 = amend, ss2 = amend; 393642: 241: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 276606: 242: UINT8 *line0 = (UINT8 *)imIn->image[yy]; 276606: 243: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 276606: 244: ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; 276606: 245: ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; 276606: 246: ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; -: 247: } 117036: 248: if (yscale & 0x01) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 42534: 249: UINT8 *line = (UINT8 *)imIn->image[yy]; 42534: 250: ss0 += line[xx*4 + 0]; 42534: 251: ss1 += line[xx*4 + 1]; 42534: 252: ss2 += line[xx*4 + 2]; -: 253: } 117036: 254: v = MAKE_UINT32( -: 255: (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, -: 256: (ss2 * multiplier) >> 24, 0); 234072: 257: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 258: } -: 259: } else { // bands == 4 335448: 260: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 335448: 261: int xx = box[0] + x*xscale; -: 262: UINT32 v; 335448: 263: UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; 1128276: 264: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 792828: 265: UINT8 *line0 = (UINT8 *)imIn->image[yy]; 792828: 266: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 792828: 267: ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; 792828: 268: ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; 792828: 269: ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; 792828: 270: ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; -: 271: } 335448: 272: if (yscale & 0x01) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 121932: 273: UINT8 *line = (UINT8 *)imIn->image[yy]; 121932: 274: ss0 += line[xx*4 + 0]; 121932: 275: ss1 += line[xx*4 + 1]; 121932: 276: ss2 += line[xx*4 + 2]; 121932: 277: ss3 += line[xx*4 + 3]; -: 278: } 335448: 279: v = MAKE_UINT32( -: 280: (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, -: 281: (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); 670896: 282: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 283: } -: 284: } -: 285: } -: 286: } 40: 287:} -: 288: -: 289: -: 290:void function ImagingReduceNx1 called 40 returned 100% blocks executed 100% 40: 291:ImagingReduceNx1(Imaging imOut, Imaging imIn, int box[4], int xscale) -: 292:{ -: 293: /* Optimized implementation for yscale = 1. -: 294: */ -: 295: int x, y, xx; 40: 296: int yscale = 1; 40: 297: UINT32 multiplier = division_UINT32(yscale * xscale, 8); call 0 returned 100% 40: 298: UINT32 amend = yscale * xscale / 2; -: 299: 40: 300: if (imIn->image8) { branch 0 taken 85% (fallthrough) branch 1 taken 15% 1618: 301: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% 1618: 302: int yy = box[1] + y*yscale; 1618: 303: UINT8 *line = (UINT8 *)imIn->image8[yy]; 119229: 304: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 117611: 305: int xx_from = box[0] + x*xscale; 117611: 306: UINT32 ss = amend; 395582: 307: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 277971: 308: ss += line[xx + 0] + line[xx + 1]; -: 309: } 117611: 310: if (xscale & 0x01) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 42749: 311: ss += line[xx + 0]; -: 312: } 117611: 313: imOut->image8[y][x] = (ss * multiplier) >> 24; -: 314: } -: 315: } -: 316: } else { 10118: 317: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 10118: 318: int yy = box[1] + y*yscale; 10118: 319: UINT8 *line = (UINT8 *)imIn->image[yy]; 10118: 320: if (imIn->bands == 2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 337129: 321: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 337129: 322: int xx_from = box[0] + x*xscale; -: 323: UINT32 v; 337129: 324: UINT32 ss0 = amend, ss3 = amend; 1133896: 325: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 796767: 326: ss0 += line[xx*4 + 0] + line[xx*4 + 4]; 796767: 327: ss3 += line[xx*4 + 3] + line[xx*4 + 7]; -: 328: } 337129: 329: if (xscale & 0x01) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 122509: 330: ss0 += line[xx*4 + 0]; 122509: 331: ss3 += line[xx*4 + 3]; -: 332: } 337129: 333: v = MAKE_UINT32( -: 334: (ss0 * multiplier) >> 24, 0, -: 335: 0, (ss3 * multiplier) >> 24); 674258: 336: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 337: } 5868: 338: } else if (imIn->bands == 3) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 117611: 339: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 117611: 340: int xx_from = box[0] + x*xscale; -: 341: UINT32 v; 117611: 342: UINT32 ss0 = amend, ss1 = amend, ss2 = amend; 395582: 343: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 277971: 344: ss0 += line[xx*4 + 0] + line[xx*4 + 4]; 277971: 345: ss1 += line[xx*4 + 1] + line[xx*4 + 5]; 277971: 346: ss2 += line[xx*4 + 2] + line[xx*4 + 6]; -: 347: } 117611: 348: if (xscale & 0x01) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 42749: 349: ss0 += line[xx*4 + 0]; 42749: 350: ss1 += line[xx*4 + 1]; 42749: 351: ss2 += line[xx*4 + 2]; -: 352: } 117611: 353: v = MAKE_UINT32( -: 354: (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, -: 355: (ss2 * multiplier) >> 24, 0); 235222: 356: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 357: } -: 358: } else { // bands == 4 337129: 359: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 337129: 360: int xx_from = box[0] + x*xscale; -: 361: UINT32 v; 337129: 362: UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; 1133896: 363: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 796767: 364: ss0 += line[xx*4 + 0] + line[xx*4 + 4]; 796767: 365: ss1 += line[xx*4 + 1] + line[xx*4 + 5]; 796767: 366: ss2 += line[xx*4 + 2] + line[xx*4 + 6]; 796767: 367: ss3 += line[xx*4 + 3] + line[xx*4 + 7]; -: 368: } 337129: 369: if (xscale & 0x01) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 122509: 370: ss0 += line[xx*4 + 0]; 122509: 371: ss1 += line[xx*4 + 1]; 122509: 372: ss2 += line[xx*4 + 2]; 122509: 373: ss3 += line[xx*4 + 3]; -: 374: } 337129: 375: v = MAKE_UINT32( -: 376: (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, -: 377: (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); 674258: 378: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 379: } -: 380: } -: 381: } -: 382: } 40: 383:} -: 384: -: 385:void function ImagingReduce1x2 called 20 returned 100% blocks executed 100% 20: 386:ImagingReduce1x2(Imaging imOut, Imaging imIn, int box[4]) -: 387:{ -: 388: /* Optimized implementation for xscale = 1 and yscale = 2. -: 389: */ 20: 390: int xscale = 1, yscale = 2; -: 391: int x, y; -: 392: UINT32 ss0, ss1, ss2, ss3; 20: 393: UINT32 amend = yscale * xscale / 2; -: 394: 20: 395: if (imIn->image8) { branch 0 taken 85% (fallthrough) branch 1 taken 15% 403: 396: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% 403: 397: int yy = box[1] + y*yscale; 403: 398: UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; 403: 399: UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; 150189: 400: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 149786: 401: int xx = box[0] + x*xscale; 299572: 402: ss0 = line0[xx + 0] + 149786: 403: line1[xx + 0]; 149786: 404: imOut->image8[y][x] = (ss0 + amend) >> 1; -: 405: } -: 406: } -: 407: } else { 2521: 408: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2521: 409: int yy = box[1] + y*yscale; 2521: 410: UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; 2521: 411: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 2521: 412: if (imIn->bands == 2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 429108: 413: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 429108: 414: int xx = box[0] + x*xscale; -: 415: UINT32 v; 858216: 416: ss0 = line0[xx*4 + 0] + 429108: 417: line1[xx*4 + 0]; 858216: 418: ss3 = line0[xx*4 + 3] + 429108: 419: line1[xx*4 + 3]; 429108: 420: v = MAKE_UINT32((ss0 + amend) >> 1, 0, -: 421: 0, (ss3 + amend) >> 1); 858216: 422: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 423: } 1462: 424: } else if (imIn->bands == 3) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 149786: 425: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 149786: 426: int xx = box[0] + x*xscale; -: 427: UINT32 v; 299572: 428: ss0 = line0[xx*4 + 0] + 149786: 429: line1[xx*4 + 0]; 299572: 430: ss1 = line0[xx*4 + 1] + 149786: 431: line1[xx*4 + 1]; 299572: 432: ss2 = line0[xx*4 + 2] + 149786: 433: line1[xx*4 + 2]; 149786: 434: v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, -: 435: (ss2 + amend) >> 1, 0); 299572: 436: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 437: } -: 438: } else { // bands == 4 429108: 439: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 429108: 440: int xx = box[0] + x*xscale; -: 441: UINT32 v; 858216: 442: ss0 = line0[xx*4 + 0] + 429108: 443: line1[xx*4 + 0]; 858216: 444: ss1 = line0[xx*4 + 1] + 429108: 445: line1[xx*4 + 1]; 858216: 446: ss2 = line0[xx*4 + 2] + 429108: 447: line1[xx*4 + 2]; 858216: 448: ss3 = line0[xx*4 + 3] + 429108: 449: line1[xx*4 + 3]; 429108: 450: v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, -: 451: (ss2 + amend) >> 1, (ss3 + amend) >> 1); 858216: 452: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 453: } -: 454: } -: 455: } -: 456: } 20: 457:} -: 458: -: 459: -: 460:void function ImagingReduce2x1 called 20 returned 100% blocks executed 100% 20: 461:ImagingReduce2x1(Imaging imOut, Imaging imIn, int box[4]) -: 462:{ -: 463: /* Optimized implementation for xscale = 2 and yscale = 1. -: 464: */ 20: 465: int xscale = 2, yscale = 1; -: 466: int x, y; -: 467: UINT32 ss0, ss1, ss2, ss3; 20: 468: UINT32 amend = yscale * xscale / 2; -: 469: 20: 470: if (imIn->image8) { branch 0 taken 85% (fallthrough) branch 1 taken 15% 809: 471: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% 809: 472: int yy = box[1] + y*yscale; 809: 473: UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; 150835: 474: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 150026: 475: int xx = box[0] + x*xscale; 150026: 476: ss0 = line0[xx + 0] + line0[xx + 1]; 150026: 477: imOut->image8[y][x] = (ss0 + amend) >> 1; -: 478: } -: 479: } -: 480: } else { 5059: 481: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5059: 482: int yy = box[1] + y*yscale; 5059: 483: UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; 5059: 484: if (imIn->bands == 2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 429844: 485: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 429844: 486: int xx = box[0] + x*xscale; -: 487: UINT32 v; 429844: 488: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4]; 429844: 489: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7]; 429844: 490: v = MAKE_UINT32((ss0 + amend) >> 1, 0, -: 491: 0, (ss3 + amend) >> 1); 859688: 492: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 493: } 2934: 494: } else if (imIn->bands == 3) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 150026: 495: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 150026: 496: int xx = box[0] + x*xscale; -: 497: UINT32 v; 150026: 498: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4]; 150026: 499: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5]; 150026: 500: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6]; 150026: 501: v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, -: 502: (ss2 + amend) >> 1, 0); 300052: 503: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 504: } -: 505: } else { // bands == 4 429844: 506: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 429844: 507: int xx = box[0] + x*xscale; -: 508: UINT32 v; 429844: 509: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4]; 429844: 510: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5]; 429844: 511: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6]; 429844: 512: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7]; 429844: 513: v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, -: 514: (ss2 + amend) >> 1, (ss3 + amend) >> 1); 859688: 515: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 516: } -: 517: } -: 518: } -: 519: } 20: 520:} -: 521: -: 522: -: 523:void function ImagingReduce2x2 called 27 returned 100% blocks executed 100% 27: 524:ImagingReduce2x2(Imaging imOut, Imaging imIn, int box[4]) -: 525:{ -: 526: /* Optimized implementation for xscale = 2 and yscale = 2. -: 527: */ 27: 528: int xscale = 2, yscale = 2; -: 529: int x, y; -: 530: UINT32 ss0, ss1, ss2, ss3; 27: 531: UINT32 amend = yscale * xscale / 2; -: 532: 27: 533: if (imIn->image8) { branch 0 taken 78% (fallthrough) branch 1 taken 22% 541: 534: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% 541: 535: int yy = box[1] + y*yscale; 541: 536: UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; 541: 537: UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; 103447: 538: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 102906: 539: int xx = box[0] + x*xscale; 308718: 540: ss0 = line0[xx + 0] + line0[xx + 1] + 205812: 541: line1[xx + 0] + line1[xx + 1]; 102906: 542: imOut->image8[y][x] = (ss0 + amend) >> 2; -: 543: } -: 544: } -: 545: } else { 3173: 546: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3173: 547: int yy = box[1] + y*yscale; 3173: 548: UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; 3173: 549: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 3173: 550: if (imIn->bands == 2) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 214404: 551: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 214404: 552: int xx = box[0] + x*xscale; -: 553: UINT32 v; 643212: 554: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + 428808: 555: line1[xx*4 + 0] + line1[xx*4 + 4]; 643212: 556: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + 428808: 557: line1[xx*4 + 3] + line1[xx*4 + 7]; 214404: 558: v = MAKE_UINT32((ss0 + amend) >> 2, 0, -: 559: 0, (ss3 + amend) >> 2); 428808: 560: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 561: } 2114: 562: } else if (imIn->bands == 3) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 237378: 563: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 237378: 564: int xx = box[0] + x*xscale; -: 565: UINT32 v; 712134: 566: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + 474756: 567: line1[xx*4 + 0] + line1[xx*4 + 4]; 712134: 568: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + 474756: 569: line1[xx*4 + 1] + line1[xx*4 + 5]; 712134: 570: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + 474756: 571: line1[xx*4 + 2] + line1[xx*4 + 6]; 237378: 572: v = MAKE_UINT32((ss0 + amend) >> 2, (ss1 + amend) >> 2, -: 573: (ss2 + amend) >> 2, 0); 474756: 574: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 575: } -: 576: } else { // bands == 4 214404: 577: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 214404: 578: int xx = box[0] + x*xscale; -: 579: UINT32 v; 643212: 580: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + 428808: 581: line1[xx*4 + 0] + line1[xx*4 + 4]; 643212: 582: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + 428808: 583: line1[xx*4 + 1] + line1[xx*4 + 5]; 643212: 584: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + 428808: 585: line1[xx*4 + 2] + line1[xx*4 + 6]; 643212: 586: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + 428808: 587: line1[xx*4 + 3] + line1[xx*4 + 7]; 214404: 588: v = MAKE_UINT32((ss0 + amend) >> 2, (ss1 + amend) >> 2, -: 589: (ss2 + amend) >> 2, (ss3 + amend) >> 2); 428808: 590: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 591: } -: 592: } -: 593: } -: 594: } 27: 595:} -: 596: -: 597: -: 598:void function ImagingReduce1x3 called 21 returned 100% blocks executed 100% 21: 599:ImagingReduce1x3(Imaging imOut, Imaging imIn, int box[4]) -: 600:{ -: 601: /* Optimized implementation for xscale = 1 and yscale = 3. -: 602: */ 21: 603: int xscale = 1, yscale = 3; -: 604: int x, y; -: 605: UINT32 ss0, ss1, ss2, ss3; 21: 606: UINT32 multiplier = division_UINT32(yscale * xscale, 8); call 0 returned 100% 21: 607: UINT32 amend = yscale * xscale / 2; -: 608: 21: 609: if (imIn->image8) { branch 0 taken 81% (fallthrough) branch 1 taken 19% 272: 610: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% 272: 611: int yy = box[1] + y*yscale; 272: 612: UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; 272: 613: UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; 272: 614: UINT8 *line2 = (UINT8 *)imIn->image8[yy + 2]; 100330: 615: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 100058: 616: int xx = box[0] + x*xscale; 300174: 617: ss0 = line0[xx + 0] + 200116: 618: line1[xx + 0] + 100058: 619: line2[xx + 0]; 100058: 620: imOut->image8[y][x] = ((ss0 + amend) * multiplier) >> 24; -: 621: } -: 622: } -: 623: } else { 1683: 624: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1683: 625: int yy = box[1] + y*yscale; 1683: 626: UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; 1683: 627: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 1683: 628: UINT8 *line2 = (UINT8 *)imIn->image[yy + 2]; 1683: 629: if (imIn->bands == 2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 286584: 630: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 286584: 631: int xx = box[0] + x*xscale; -: 632: UINT32 v; 859752: 633: ss0 = line0[xx*4 + 0] + 573168: 634: line1[xx*4 + 0] + 286584: 635: line2[xx*4 + 0]; 859752: 636: ss3 = line0[xx*4 + 3] + 573168: 637: line1[xx*4 + 3] + 286584: 638: line2[xx*4 + 3]; 286584: 639: v = MAKE_UINT32( -: 640: ((ss0 + amend) * multiplier) >> 24, 0, -: 641: 0, ((ss3 + amend) * multiplier) >> 24); 573168: 642: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 643: } 976: 644: } else if (imIn->bands == 3) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 100028: 645: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 100028: 646: int xx = box[0] + x*xscale; -: 647: UINT32 v; 300084: 648: ss0 = line0[xx*4 + 0] + 200056: 649: line1[xx*4 + 0] + 100028: 650: line2[xx*4 + 0]; 300084: 651: ss1 = line0[xx*4 + 1] + 200056: 652: line1[xx*4 + 1] + 100028: 653: line2[xx*4 + 1]; 300084: 654: ss2 = line0[xx*4 + 2] + 200056: 655: line1[xx*4 + 2] + 100028: 656: line2[xx*4 + 2]; 100028: 657: v = MAKE_UINT32( -: 658: ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, -: 659: ((ss2 + amend) * multiplier) >> 24, 0); 200056: 660: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 661: } -: 662: } else { // bands == 4 286584: 663: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 286584: 664: int xx = box[0] + x*xscale; -: 665: UINT32 v; 859752: 666: ss0 = line0[xx*4 + 0] + 573168: 667: line1[xx*4 + 0] + 286584: 668: line2[xx*4 + 0]; 859752: 669: ss1 = line0[xx*4 + 1] + 573168: 670: line1[xx*4 + 1] + 286584: 671: line2[xx*4 + 1]; 859752: 672: ss2 = line0[xx*4 + 2] + 573168: 673: line1[xx*4 + 2] + 286584: 674: line2[xx*4 + 2]; 859752: 675: ss3 = line0[xx*4 + 3] + 573168: 676: line1[xx*4 + 3] + 286584: 677: line2[xx*4 + 3]; 286584: 678: v = MAKE_UINT32( -: 679: ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, -: 680: ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); 573168: 681: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 682: } -: 683: } -: 684: } -: 685: } 21: 686:} -: 687: -: 688: -: 689:void function ImagingReduce3x1 called 21 returned 100% blocks executed 100% 21: 690:ImagingReduce3x1(Imaging imOut, Imaging imIn, int box[4]) -: 691:{ -: 692: /* Optimized implementation for xscale = 3 and yscale = 1. -: 693: */ 21: 694: int xscale = 3, yscale = 1; -: 695: int x, y; -: 696: UINT32 ss0, ss1, ss2, ss3; 21: 697: UINT32 multiplier = division_UINT32(yscale * xscale, 8); call 0 returned 100% 21: 698: UINT32 amend = yscale * xscale / 2; -: 699: 21: 700: if (imIn->image8) { branch 0 taken 81% (fallthrough) branch 1 taken 19% 819: 701: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% 819: 702: int yy = box[1] + y*yscale; 819: 703: UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; 100629: 704: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 99810: 705: int xx = box[0] + x*xscale; 99810: 706: ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2]; 99810: 707: imOut->image8[y][x] = ((ss0 + amend) * multiplier) >> 24; -: 708: } -: 709: } -: 710: } else { 5059: 711: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5059: 712: int yy = box[1] + y*yscale; 5059: 713: UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; 5059: 714: if (imIn->bands == 2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 285750: 715: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 285750: 716: int xx = box[0] + x*xscale; -: 717: UINT32 v; 285750: 718: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8]; 285750: 719: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11]; 285750: 720: v = MAKE_UINT32( -: 721: ((ss0 + amend) * multiplier) >> 24, 0, -: 722: 0, ((ss3 + amend) * multiplier) >> 24); 571500: 723: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 724: } 2934: 725: } else if (imIn->bands == 3) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 99780: 726: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 99780: 727: int xx = box[0] + x*xscale; -: 728: UINT32 v; 99780: 729: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8]; 99780: 730: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9]; 99780: 731: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10]; 99780: 732: v = MAKE_UINT32( -: 733: ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, -: 734: ((ss2 + amend) * multiplier) >> 24, 0); 199560: 735: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 736: } -: 737: } else { // bands == 4 285750: 738: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 285750: 739: int xx = box[0] + x*xscale; -: 740: UINT32 v; 285750: 741: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8]; 285750: 742: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9]; 285750: 743: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10]; 285750: 744: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11]; 285750: 745: v = MAKE_UINT32( -: 746: ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, -: 747: ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); 571500: 748: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 749: } -: 750: } -: 751: } -: 752: } 21: 753:} -: 754: -: 755: -: 756:void function ImagingReduce3x3 called 26 returned 100% blocks executed 100% 26: 757:ImagingReduce3x3(Imaging imOut, Imaging imIn, int box[4]) -: 758:{ -: 759: /* Optimized implementation for xscale = 3 and yscale = 3. -: 760: */ 26: 761: int xscale = 3, yscale = 3; -: 762: int x, y; -: 763: UINT32 ss0, ss1, ss2, ss3; 26: 764: UINT32 multiplier = division_UINT32(yscale * xscale, 8); call 0 returned 100% 26: 765: UINT32 amend = yscale * xscale / 2; -: 766: 26: 767: if (imIn->image8) { branch 0 taken 73% (fallthrough) branch 1 taken 27% 500: 768: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% 500: 769: int yy = box[1] + y*yscale; 500: 770: UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; 500: 771: UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; 500: 772: UINT8 *line2 = (UINT8 *)imIn->image8[yy + 2]; 55379: 773: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 54879: 774: int xx = box[0] + x*xscale; 164637: 775: ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2] + 164637: 776: line1[xx + 0] + line1[xx + 1] + line1[xx + 2] + 109758: 777: line2[xx + 0] + line2[xx + 1] + line2[xx + 2]; 54879: 778: imOut->image8[y][x] = ((ss0 + amend) * multiplier) >> 24; -: 779: } -: 780: } -: 781: } else { 1767: 782: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1767: 783: int yy = box[1] + y*yscale; 1767: 784: UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; 1767: 785: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 1767: 786: UINT8 *line2 = (UINT8 *)imIn->image[yy + 2]; 1767: 787: if (imIn->bands == 2) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 95190: 788: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 95190: 789: int xx = box[0] + x*xscale; -: 790: UINT32 v; 285570: 791: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + 285570: 792: line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + 190380: 793: line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8]; 285570: 794: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + 285570: 795: line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + 190380: 796: line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11]; 95190: 797: v = MAKE_UINT32( -: 798: ((ss0 + amend) * multiplier) >> 24, 0, -: 799: 0, ((ss3 + amend) * multiplier) >> 24); 190380: 800: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 801: } 1060: 802: } else if (imIn->bands == 3) { branch 0 taken 67% (fallthrough) branch 1 taken 33% 36758: 803: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 36758: 804: int xx = box[0] + x*xscale; -: 805: UINT32 v; 110274: 806: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + 110274: 807: line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + 73516: 808: line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8]; 110274: 809: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + 110274: 810: line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + 73516: 811: line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9]; 110274: 812: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + 110274: 813: line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + 73516: 814: line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10]; 36758: 815: v = MAKE_UINT32( -: 816: ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, -: 817: ((ss2 + amend) * multiplier) >> 24, 0); 73516: 818: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 819: } -: 820: } else { // bands == 4 95190: 821: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 95190: 822: int xx = box[0] + x*xscale; -: 823: UINT32 v; 285570: 824: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + 285570: 825: line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + 190380: 826: line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8]; 285570: 827: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + 285570: 828: line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + 190380: 829: line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9]; 285570: 830: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + 285570: 831: line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + 190380: 832: line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10]; 285570: 833: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + 285570: 834: line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + 190380: 835: line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11]; 95190: 836: v = MAKE_UINT32( -: 837: ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, -: 838: ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); 190380: 839: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 840: } -: 841: } -: 842: } -: 843: } 26: 844:} -: 845: -: 846:void function ImagingReduce4x4 called 20 returned 100% blocks executed 100% 20: 847:ImagingReduce4x4(Imaging imOut, Imaging imIn, int box[4]) -: 848:{ -: 849: /* Optimized implementation for xscale = 4 and yscale = 4. -: 850: */ 20: 851: int xscale = 4, yscale = 4; -: 852: int x, y; -: 853: UINT32 ss0, ss1, ss2, ss3; 20: 854: UINT32 amend = yscale * xscale / 2; -: 855: 20: 856: if (imIn->image8) { branch 0 taken 85% (fallthrough) branch 1 taken 15% 200: 857: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% 200: 858: int yy = box[1] + y*yscale; 200: 859: UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; 200: 860: UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; 200: 861: UINT8 *line2 = (UINT8 *)imIn->image8[yy + 2]; 200: 862: UINT8 *line3 = (UINT8 *)imIn->image8[yy + 3]; 18770: 863: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 18570: 864: int xx = box[0] + x*xscale; 55710: 865: ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2] + line0[xx + 3] + 55710: 866: line1[xx + 0] + line1[xx + 1] + line1[xx + 2] + line1[xx + 3] + 55710: 867: line2[xx + 0] + line2[xx + 1] + line2[xx + 2] + line2[xx + 3] + 37140: 868: line3[xx + 0] + line3[xx + 1] + line3[xx + 2] + line3[xx + 3]; 18570: 869: imOut->image8[y][x] = (ss0 + amend) >> 4; -: 870: } -: 871: } -: 872: } else { 1252: 873: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1252: 874: int yy = box[1] + y*yscale; 1252: 875: UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; 1252: 876: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 1252: 877: UINT8 *line2 = (UINT8 *)imIn->image[yy + 2]; 1252: 878: UINT8 *line3 = (UINT8 *)imIn->image[yy + 3]; 1252: 879: if (imIn->bands == 2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 53268: 880: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 53268: 881: int xx = box[0] + x*xscale; -: 882: UINT32 v; 159804: 883: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + 159804: 884: line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + 159804: 885: line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + 106536: 886: line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12]; 159804: 887: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + line0[xx*4 + 15] + 159804: 888: line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + line1[xx*4 + 15] + 159804: 889: line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11] + line2[xx*4 + 15] + 106536: 890: line3[xx*4 + 3] + line3[xx*4 + 7] + line3[xx*4 + 11] + line3[xx*4 + 15]; 53268: 891: v = MAKE_UINT32((ss0 + amend) >> 4, 0, -: 892: 0, (ss3 + amend) >> 4); 106536: 893: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 894: } 726: 895: } else if (imIn->bands == 3) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 18570: 896: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 18570: 897: int xx = box[0] + x*xscale; -: 898: UINT32 v; 55710: 899: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + 55710: 900: line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + 55710: 901: line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + 37140: 902: line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12]; 55710: 903: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + line0[xx*4 + 13] + 55710: 904: line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + line1[xx*4 + 13] + 55710: 905: line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9] + line2[xx*4 + 13] + 37140: 906: line3[xx*4 + 1] + line3[xx*4 + 5] + line3[xx*4 + 9] + line3[xx*4 + 13]; 55710: 907: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + line0[xx*4 + 14] + 55710: 908: line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + line1[xx*4 + 14] + 55710: 909: line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10] + line2[xx*4 + 14] + 37140: 910: line3[xx*4 + 2] + line3[xx*4 + 6] + line3[xx*4 + 10] + line3[xx*4 + 14]; 18570: 911: v = MAKE_UINT32((ss0 + amend) >> 4, (ss1 + amend) >> 4, -: 912: (ss2 + amend) >> 4, 0); 37140: 913: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 914: } -: 915: } else { // bands == 4 53268: 916: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 53268: 917: int xx = box[0] + x*xscale; -: 918: UINT32 v; 159804: 919: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + 159804: 920: line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + 159804: 921: line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + 106536: 922: line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12]; 159804: 923: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + line0[xx*4 + 13] + 159804: 924: line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + line1[xx*4 + 13] + 159804: 925: line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9] + line2[xx*4 + 13] + 106536: 926: line3[xx*4 + 1] + line3[xx*4 + 5] + line3[xx*4 + 9] + line3[xx*4 + 13]; 159804: 927: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + line0[xx*4 + 14] + 159804: 928: line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + line1[xx*4 + 14] + 159804: 929: line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10] + line2[xx*4 + 14] + 106536: 930: line3[xx*4 + 2] + line3[xx*4 + 6] + line3[xx*4 + 10] + line3[xx*4 + 14]; 159804: 931: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + line0[xx*4 + 15] + 159804: 932: line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + line1[xx*4 + 15] + 159804: 933: line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11] + line2[xx*4 + 15] + 106536: 934: line3[xx*4 + 3] + line3[xx*4 + 7] + line3[xx*4 + 11] + line3[xx*4 + 15]; 53268: 935: v = MAKE_UINT32((ss0 + amend) >> 4, (ss1 + amend) >> 4, -: 936: (ss2 + amend) >> 4, (ss3 + amend) >> 4); 106536: 937: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 938: } -: 939: } -: 940: } -: 941: } 20: 942:} -: 943: -: 944: -: 945:void function ImagingReduce5x5 called 20 returned 100% blocks executed 100% 20: 946:ImagingReduce5x5(Imaging imOut, Imaging imIn, int box[4]) -: 947:{ -: 948: /* Fast special case for xscale = 5 and yscale = 5. -: 949: */ 20: 950: int xscale = 5, yscale = 5; -: 951: int x, y; -: 952: UINT32 ss0, ss1, ss2, ss3; 20: 953: UINT32 multiplier = division_UINT32(yscale * xscale, 8); call 0 returned 100% 20: 954: UINT32 amend = yscale * xscale / 2; -: 955: 20: 956: if (imIn->image8) { branch 0 taken 85% (fallthrough) branch 1 taken 15% 161: 957: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 98% branch 1 taken 2% 161: 958: int yy = box[1] + y*yscale; 161: 959: UINT8 *line0 = (UINT8 *)imIn->image8[yy + 0]; 161: 960: UINT8 *line1 = (UINT8 *)imIn->image8[yy + 1]; 161: 961: UINT8 *line2 = (UINT8 *)imIn->image8[yy + 2]; 161: 962: UINT8 *line3 = (UINT8 *)imIn->image8[yy + 3]; 161: 963: UINT8 *line4 = (UINT8 *)imIn->image8[yy + 4]; 12083: 964: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 11922: 965: int xx = box[0] + x*xscale; 35766: 966: ss0 = line0[xx + 0] + line0[xx + 1] + line0[xx + 2] + line0[xx + 3] + line0[xx + 4] + 35766: 967: line1[xx + 0] + line1[xx + 1] + line1[xx + 2] + line1[xx + 3] + line1[xx + 4] + 35766: 968: line2[xx + 0] + line2[xx + 1] + line2[xx + 2] + line2[xx + 3] + line2[xx + 4] + 35766: 969: line3[xx + 0] + line3[xx + 1] + line3[xx + 2] + line3[xx + 3] + line3[xx + 4] + 23844: 970: line4[xx + 0] + line4[xx + 1] + line4[xx + 2] + line4[xx + 3] + line4[xx + 4]; 11922: 971: imOut->image8[y][x] = ((ss0 + amend) * multiplier) >> 24; -: 972: } -: 973: } -: 974: } else { 1007: 975: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 1007: 976: int yy = box[1] + y*yscale; 1007: 977: UINT8 *line0 = (UINT8 *)imIn->image[yy + 0]; 1007: 978: UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; 1007: 979: UINT8 *line2 = (UINT8 *)imIn->image[yy + 2]; 1007: 980: UINT8 *line3 = (UINT8 *)imIn->image[yy + 3]; 1007: 981: UINT8 *line4 = (UINT8 *)imIn->image[yy + 4]; 1007: 982: if (imIn->bands == 2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 34146: 983: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 34146: 984: int xx = box[0] + x*xscale; -: 985: UINT32 v; 102438: 986: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + line0[xx*4 + 16] + 102438: 987: line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + line1[xx*4 + 16] + 102438: 988: line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + line2[xx*4 + 16] + 102438: 989: line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12] + line3[xx*4 + 16] + 68292: 990: line4[xx*4 + 0] + line4[xx*4 + 4] + line4[xx*4 + 8] + line4[xx*4 + 12] + line4[xx*4 + 16]; 102438: 991: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + line0[xx*4 + 15] + line0[xx*4 + 19] + 102438: 992: line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + line1[xx*4 + 15] + line1[xx*4 + 19] + 102438: 993: line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11] + line2[xx*4 + 15] + line2[xx*4 + 19] + 102438: 994: line3[xx*4 + 3] + line3[xx*4 + 7] + line3[xx*4 + 11] + line3[xx*4 + 15] + line3[xx*4 + 19] + 68292: 995: line4[xx*4 + 3] + line4[xx*4 + 7] + line4[xx*4 + 11] + line4[xx*4 + 15] + line4[xx*4 + 19]; 34146: 996: v = MAKE_UINT32( -: 997: ((ss0 + amend) * multiplier) >> 24, 0, -: 998: 0, ((ss3 + amend) * multiplier) >> 24); 68292: 999: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 1000: } 584: 1001: } else if (imIn->bands == 3) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 11922: 1002: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% 11922: 1003: int xx = box[0] + x*xscale; -: 1004: UINT32 v; 35766: 1005: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + line0[xx*4 + 16] + 35766: 1006: line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + line1[xx*4 + 16] + 35766: 1007: line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + line2[xx*4 + 16] + 35766: 1008: line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12] + line3[xx*4 + 16] + 23844: 1009: line4[xx*4 + 0] + line4[xx*4 + 4] + line4[xx*4 + 8] + line4[xx*4 + 12] + line4[xx*4 + 16]; 35766: 1010: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + line0[xx*4 + 13] + line0[xx*4 + 17] + 35766: 1011: line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + line1[xx*4 + 13] + line1[xx*4 + 17] + 35766: 1012: line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9] + line2[xx*4 + 13] + line2[xx*4 + 17] + 35766: 1013: line3[xx*4 + 1] + line3[xx*4 + 5] + line3[xx*4 + 9] + line3[xx*4 + 13] + line3[xx*4 + 17] + 23844: 1014: line4[xx*4 + 1] + line4[xx*4 + 5] + line4[xx*4 + 9] + line4[xx*4 + 13] + line4[xx*4 + 17]; 35766: 1015: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + line0[xx*4 + 14] + line0[xx*4 + 18] + 35766: 1016: line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + line1[xx*4 + 14] + line1[xx*4 + 18] + 35766: 1017: line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10] + line2[xx*4 + 14] + line2[xx*4 + 18] + 35766: 1018: line3[xx*4 + 2] + line3[xx*4 + 6] + line3[xx*4 + 10] + line3[xx*4 + 14] + line3[xx*4 + 18] + 23844: 1019: line4[xx*4 + 2] + line4[xx*4 + 6] + line4[xx*4 + 10] + line4[xx*4 + 14] + line4[xx*4 + 18]; 11922: 1020: v = MAKE_UINT32( -: 1021: ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, -: 1022: ((ss2 + amend) * multiplier) >> 24, 0); 23844: 1023: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 1024: } -: 1025: } else { // bands == 4 34146: 1026: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 34146: 1027: int xx = box[0] + x*xscale; -: 1028: UINT32 v; 102438: 1029: ss0 = line0[xx*4 + 0] + line0[xx*4 + 4] + line0[xx*4 + 8] + line0[xx*4 + 12] + line0[xx*4 + 16] + 102438: 1030: line1[xx*4 + 0] + line1[xx*4 + 4] + line1[xx*4 + 8] + line1[xx*4 + 12] + line1[xx*4 + 16] + 102438: 1031: line2[xx*4 + 0] + line2[xx*4 + 4] + line2[xx*4 + 8] + line2[xx*4 + 12] + line2[xx*4 + 16] + 102438: 1032: line3[xx*4 + 0] + line3[xx*4 + 4] + line3[xx*4 + 8] + line3[xx*4 + 12] + line3[xx*4 + 16] + 68292: 1033: line4[xx*4 + 0] + line4[xx*4 + 4] + line4[xx*4 + 8] + line4[xx*4 + 12] + line4[xx*4 + 16]; 102438: 1034: ss1 = line0[xx*4 + 1] + line0[xx*4 + 5] + line0[xx*4 + 9] + line0[xx*4 + 13] + line0[xx*4 + 17] + 102438: 1035: line1[xx*4 + 1] + line1[xx*4 + 5] + line1[xx*4 + 9] + line1[xx*4 + 13] + line1[xx*4 + 17] + 102438: 1036: line2[xx*4 + 1] + line2[xx*4 + 5] + line2[xx*4 + 9] + line2[xx*4 + 13] + line2[xx*4 + 17] + 102438: 1037: line3[xx*4 + 1] + line3[xx*4 + 5] + line3[xx*4 + 9] + line3[xx*4 + 13] + line3[xx*4 + 17] + 68292: 1038: line4[xx*4 + 1] + line4[xx*4 + 5] + line4[xx*4 + 9] + line4[xx*4 + 13] + line4[xx*4 + 17]; 102438: 1039: ss2 = line0[xx*4 + 2] + line0[xx*4 + 6] + line0[xx*4 + 10] + line0[xx*4 + 14] + line0[xx*4 + 18] + 102438: 1040: line1[xx*4 + 2] + line1[xx*4 + 6] + line1[xx*4 + 10] + line1[xx*4 + 14] + line1[xx*4 + 18] + 102438: 1041: line2[xx*4 + 2] + line2[xx*4 + 6] + line2[xx*4 + 10] + line2[xx*4 + 14] + line2[xx*4 + 18] + 102438: 1042: line3[xx*4 + 2] + line3[xx*4 + 6] + line3[xx*4 + 10] + line3[xx*4 + 14] + line3[xx*4 + 18] + 68292: 1043: line4[xx*4 + 2] + line4[xx*4 + 6] + line4[xx*4 + 10] + line4[xx*4 + 14] + line4[xx*4 + 18]; 102438: 1044: ss3 = line0[xx*4 + 3] + line0[xx*4 + 7] + line0[xx*4 + 11] + line0[xx*4 + 15] + line0[xx*4 + 19] + 102438: 1045: line1[xx*4 + 3] + line1[xx*4 + 7] + line1[xx*4 + 11] + line1[xx*4 + 15] + line1[xx*4 + 19] + 102438: 1046: line2[xx*4 + 3] + line2[xx*4 + 7] + line2[xx*4 + 11] + line2[xx*4 + 15] + line2[xx*4 + 19] + 102438: 1047: line3[xx*4 + 3] + line3[xx*4 + 7] + line3[xx*4 + 11] + line3[xx*4 + 15] + line3[xx*4 + 19] + 68292: 1048: line4[xx*4 + 3] + line4[xx*4 + 7] + line4[xx*4 + 11] + line4[xx*4 + 15] + line4[xx*4 + 19]; 34146: 1049: v = MAKE_UINT32( -: 1050: ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, -: 1051: ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); 68292: 1052: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 1053: } -: 1054: } -: 1055: } -: 1056: } 20: 1057:} -: 1058: -: 1059: -: 1060:void function ImagingReduceCorners called 384 returned 100% blocks executed 100% 384: 1061:ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) -: 1062:{ -: 1063: /* Fill the last row and the last column for any xscale and yscale. -: 1064: */ -: 1065: int x, y, xx, yy; -: 1066: 384: 1067: if (imIn->image8) { branch 0 taken 19% (fallthrough) branch 1 taken 81% 72: 1068: if (box[2] % xscale) { branch 0 taken 51% (fallthrough) branch 1 taken 49% 37: 1069: int scale = (box[2] % xscale) * yscale; 37: 1070: UINT32 multiplier = division_UINT32(scale, 8); call 0 returned 100% 37: 1071: UINT32 amend = scale / 2; 3406: 1072: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3369: 1073: int yy_from = box[1] + y*yscale; 3369: 1074: UINT32 ss = amend; 3369: 1075: x = box[2] / xscale; -: 1076: 13328: 1077: for (yy = yy_from; yy < yy_from + yscale; yy++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 9959: 1078: UINT8 *line = (UINT8 *)imIn->image8[yy]; 47111: 1079: for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { branch 0 taken 79% branch 1 taken 21% (fallthrough) 37152: 1080: ss += line[xx + 0]; -: 1081: } -: 1082: } 3369: 1083: imOut->image8[y][x] = (ss * multiplier) >> 24; -: 1084: } -: 1085: } 72: 1086: if (box[3] % yscale) { branch 0 taken 74% (fallthrough) branch 1 taken 26% 53: 1087: int scale = xscale * (box[3] % yscale); 53: 1088: UINT32 multiplier = division_UINT32(scale, 8); call 0 returned 100% 53: 1089: UINT32 amend = scale / 2; 53: 1090: y = box[3] / yscale; 5364: 1091: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5311: 1092: int xx_from = box[0] + x*xscale; 5311: 1093: UINT32 ss = amend; 17168: 1094: for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { branch 0 taken 69% branch 1 taken 31% (fallthrough) 11857: 1095: UINT8 *line = (UINT8 *)imIn->image8[yy]; 53284: 1096: for (xx = xx_from; xx < xx_from + xscale; xx++) { branch 0 taken 78% branch 1 taken 22% (fallthrough) 41427: 1097: ss += line[xx + 0]; -: 1098: } -: 1099: } 5311: 1100: imOut->image8[y][x] = (ss * multiplier) >> 24; -: 1101: } -: 1102: } 72: 1103: if (box[2] % xscale && box[3] % yscale) { branch 0 taken 51% (fallthrough) branch 1 taken 49% branch 2 taken 65% (fallthrough) branch 3 taken 35% 24: 1104: int scale = (box[2] % xscale) * (box[3] % yscale); 24: 1105: UINT32 multiplier = division_UINT32(scale, 8); call 0 returned 100% 24: 1106: UINT32 amend = scale / 2; 24: 1107: UINT32 ss = amend; 24: 1108: x = box[2] / xscale; 24: 1109: y = box[3] / yscale; 116: 1110: for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { branch 0 taken 79% branch 1 taken 21% (fallthrough) 92: 1111: UINT8 *line = (UINT8 *)imIn->image8[yy]; 586: 1112: for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { branch 0 taken 84% branch 1 taken 16% (fallthrough) 494: 1113: ss += line[xx + 0]; -: 1114: } -: 1115: } 24: 1116: imOut->image8[y][x] = (ss * multiplier) >> 24; -: 1117: } -: 1118: } else { 312: 1119: if (box[2] % xscale) { branch 0 taken 47% (fallthrough) branch 1 taken 53% 148: 1120: int scale = (box[2] % xscale) * yscale; 148: 1121: UINT32 multiplier = division_UINT32(scale, 8); call 0 returned 100% 148: 1122: UINT32 amend = scale / 2; 17543: 1123: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 17395: 1124: int yy_from = box[1] + y*yscale; -: 1125: UINT32 v; 17395: 1126: UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; 17395: 1127: x = box[2] / xscale; -: 1128: 59204: 1129: for (yy = yy_from; yy < yy_from + yscale; yy++) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 41809: 1130: UINT8 *line = (UINT8 *)imIn->image[yy]; 181544: 1131: for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 139735: 1132: ss0 += line[xx*4 + 0]; 139735: 1133: ss1 += line[xx*4 + 1]; 139735: 1134: ss2 += line[xx*4 + 2]; 139735: 1135: ss3 += line[xx*4 + 3]; -: 1136: } -: 1137: } 17395: 1138: v = MAKE_UINT32( -: 1139: (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, -: 1140: (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); 34790: 1141: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 1142: } -: 1143: } 312: 1144: if (box[3] % yscale) { branch 0 taken 72% (fallthrough) branch 1 taken 28% 226: 1145: int scale = xscale * (box[3] % yscale); 226: 1146: UINT32 multiplier = division_UINT32(scale, 8); call 0 returned 100% 226: 1147: UINT32 amend = scale / 2; 226: 1148: y = box[3] / yscale; 27071: 1149: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 26845: 1150: int xx_from = box[0] + x*xscale; -: 1151: UINT32 v; 26845: 1152: UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; 90802: 1153: for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 63957: 1154: UINT8 *line = (UINT8 *)imIn->image[yy]; 267841: 1155: for (xx = xx_from; xx < xx_from + xscale; xx++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 203884: 1156: ss0 += line[xx*4 + 0]; 203884: 1157: ss1 += line[xx*4 + 1]; 203884: 1158: ss2 += line[xx*4 + 2]; 203884: 1159: ss3 += line[xx*4 + 3]; -: 1160: } -: 1161: } 26845: 1162: v = MAKE_UINT32( -: 1163: (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, -: 1164: (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); 53690: 1165: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 1166: } -: 1167: } 312: 1168: if (box[2] % xscale && box[3] % yscale) { branch 0 taken 47% (fallthrough) branch 1 taken 53% branch 2 taken 66% (fallthrough) branch 3 taken 34% 97: 1169: int scale = (box[2] % xscale) * (box[3] % yscale); 97: 1170: UINT32 multiplier = division_UINT32(scale, 8); call 0 returned 100% 97: 1171: UINT32 amend = scale / 2; -: 1172: UINT32 v; 97: 1173: UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; 97: 1174: x = box[2] / xscale; 97: 1175: y = box[3] / yscale; 526: 1176: for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { branch 0 taken 82% branch 1 taken 18% (fallthrough) 429: 1177: UINT8 *line = (UINT8 *)imIn->image[yy]; 2935: 1178: for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { branch 0 taken 85% branch 1 taken 15% (fallthrough) 2506: 1179: ss0 += line[xx*4 + 0]; 2506: 1180: ss1 += line[xx*4 + 1]; 2506: 1181: ss2 += line[xx*4 + 2]; 2506: 1182: ss3 += line[xx*4 + 3]; -: 1183: } -: 1184: } 97: 1185: v = MAKE_UINT32( -: 1186: (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, -: 1187: (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); 194: 1188: memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); -: 1189: } -: 1190: } 384: 1191:} -: 1192: -: 1193: -: 1194:void function ImagingReduceNxN_32bpc called 108 returned 100% blocks executed 98% 108: 1195:ImagingReduceNxN_32bpc(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) -: 1196:{ -: 1197: /* The most general implementation for any xscale and yscale -: 1198: */ -: 1199: int x, y, xx, yy; 108: 1200: double multiplier = 1.0 / (yscale * xscale); -: 1201: 108: 1202: switch(imIn->type) { branch 0 taken 50% branch 1 taken 50% branch 2 taken 0% -: 1203: case IMAGING_TYPE_INT32: 5930: 1204: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% 5930: 1205: int yy_from = box[1] + y*yscale; 929243: 1206: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 923313: 1207: int xx_from = box[0] + x*xscale; 923313: 1208: double ss = 0; 1774613: 1209: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 48% branch 1 taken 52% (fallthrough) 851300: 1210: INT32 *line0 = (INT32 *)imIn->image32[yy]; 851300: 1211: INT32 *line1 = (INT32 *)imIn->image32[yy + 1]; 1466228: 1212: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 42% branch 1 taken 58% (fallthrough) 1844784: 1213: ss += line0[xx + 0] + line0[xx + 1] + 1229856: 1214: line1[xx + 0] + line1[xx + 1]; -: 1215: } 851300: 1216: if (xscale & 0x01) { branch 0 taken 76% (fallthrough) branch 1 taken 24% 645610: 1217: ss += line0[xx + 0] + line1[xx + 0]; -: 1218: } -: 1219: } 923313: 1220: if (yscale & 0x01) { branch 0 taken 62% (fallthrough) branch 1 taken 38% 575077: 1221: INT32 *line = (INT32 *)imIn->image32[yy]; 1205882: 1222: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 52% branch 1 taken 48% (fallthrough) 630805: 1223: ss += line[xx + 0] + line[xx + 1]; -: 1224: } 575077: 1225: if (xscale & 0x01) { branch 0 taken 59% (fallthrough) branch 1 taken 41% 339587: 1226: ss += line[xx + 0]; -: 1227: } -: 1228: } 923313: 1229: IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1230: } -: 1231: } -: 1232: break; -: 1233: -: 1234: case IMAGING_TYPE_FLOAT32: 5930: 1235: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5930: 1236: int yy_from = box[1] + y*yscale; 929243: 1237: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 923313: 1238: int xx_from = box[0] + x*xscale; 923313: 1239: double ss = 0; 1774613: 1240: for (yy = yy_from; yy < yy_from + yscale - 1; yy += 2) { branch 0 taken 48% branch 1 taken 52% (fallthrough) 851300: 1241: FLOAT32 *line0 = (FLOAT32 *)imIn->image32[yy]; 851300: 1242: FLOAT32 *line1 = (FLOAT32 *)imIn->image32[yy + 1]; 1466228: 1243: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 42% branch 1 taken 58% (fallthrough) 1844784: 1244: ss += line0[xx + 0] + line0[xx + 1] + 1229856: 1245: line1[xx + 0] + line1[xx + 1]; -: 1246: } 851300: 1247: if (xscale & 0x01) { branch 0 taken 76% (fallthrough) branch 1 taken 24% 645610: 1248: ss += line0[xx + 0] + line1[xx + 0]; -: 1249: } -: 1250: } 923313: 1251: if (yscale & 0x01) { branch 0 taken 62% (fallthrough) branch 1 taken 38% 575077: 1252: FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; 1205882: 1253: for (xx = xx_from; xx < xx_from + xscale - 1; xx += 2) { branch 0 taken 52% branch 1 taken 48% (fallthrough) 630805: 1254: ss += line[xx + 0] + line[xx + 1]; -: 1255: } 575077: 1256: if (xscale & 0x01) { branch 0 taken 59% (fallthrough) branch 1 taken 41% 339587: 1257: ss += line[xx + 0]; -: 1258: } -: 1259: } 923313: 1260: IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; -: 1261: } -: 1262: } -: 1263: break; -: 1264: } 108: 1265:} -: 1266: -: 1267: -: 1268:void function ImagingReduceCorners_32bpc called 108 returned 100% blocks executed 96% 108: 1269:ImagingReduceCorners_32bpc(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) -: 1270:{ -: 1271: /* Fill the last row and the last column for any xscale and yscale. -: 1272: */ -: 1273: int x, y, xx, yy; -: 1274: 108: 1275: switch(imIn->type) { branch 0 taken 50% branch 1 taken 50% branch 2 taken 0% -: 1276: case IMAGING_TYPE_INT32: 54: 1277: if (box[2] % xscale) { branch 0 taken 48% (fallthrough) branch 1 taken 52% 26: 1278: double multiplier = 1.0 / ((box[2] % xscale) * yscale); 2867: 1279: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2841: 1280: int yy_from = box[1] + y*yscale; 2841: 1281: double ss = 0; 2841: 1282: x = box[2] / xscale; 9540: 1283: for (yy = yy_from; yy < yy_from + yscale; yy++) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 6699: 1284: INT32 *line = (INT32 *)imIn->image32[yy]; 28368: 1285: for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 21669: 1286: ss += line[xx + 0]; -: 1287: } -: 1288: } 2841: 1289: IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1290: } -: 1291: } 54: 1292: if (box[3] % yscale) { branch 0 taken 74% (fallthrough) branch 1 taken 26% 40: 1293: double multiplier = 1.0 / (xscale * (box[3] % yscale)); 40: 1294: y = box[3] / yscale; 4355: 1295: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 4315: 1296: int xx_from = box[0] + x*xscale; 4315: 1297: double ss = 0; 14502: 1298: for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 10187: 1299: INT32 *line = (INT32 *)imIn->image32[yy]; 42371: 1300: for (xx = xx_from; xx < xx_from + xscale; xx++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 32184: 1301: ss += line[xx + 0]; -: 1302: } -: 1303: } 4315: 1304: IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1305: } -: 1306: } 54: 1307: if (box[2] % xscale && box[3] % yscale) { branch 0 taken 48% (fallthrough) branch 1 taken 52% branch 2 taken 65% (fallthrough) branch 3 taken 35% 17: 1308: double multiplier = 1.0 / ((box[2] % xscale) * (box[3] % yscale)); 17: 1309: double ss = 0; 17: 1310: x = box[2] / xscale; 17: 1311: y = box[3] / yscale; 92: 1312: for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { branch 0 taken 82% branch 1 taken 18% (fallthrough) 75: 1313: INT32 *line = (INT32 *)imIn->image32[yy]; 465: 1314: for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { branch 0 taken 84% branch 1 taken 16% (fallthrough) 390: 1315: ss += line[xx + 0]; -: 1316: } -: 1317: } 17: 1318: IMAGING_PIXEL_I(imOut, x, y) = ROUND_UP(ss * multiplier); branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1319: } -: 1320: break; -: 1321: -: 1322: case IMAGING_TYPE_FLOAT32: 54: 1323: if (box[2] % xscale) { branch 0 taken 48% (fallthrough) branch 1 taken 52% 26: 1324: double multiplier = 1.0 / ((box[2] % xscale) * yscale); 2867: 1325: for (y = 0; y < box[3] / yscale; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2841: 1326: int yy_from = box[1] + y*yscale; 2841: 1327: double ss = 0; 2841: 1328: x = box[2] / xscale; 9540: 1329: for (yy = yy_from; yy < yy_from + yscale; yy++) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 6699: 1330: FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; 28368: 1331: for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 21669: 1332: ss += line[xx + 0]; -: 1333: } -: 1334: } 2841: 1335: IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; -: 1336: } -: 1337: } 54: 1338: if (box[3] % yscale) { branch 0 taken 74% (fallthrough) branch 1 taken 26% 40: 1339: double multiplier = 1.0 / (xscale * (box[3] % yscale)); 40: 1340: y = box[3] / yscale; 4355: 1341: for (x = 0; x < box[2] / xscale; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 4315: 1342: int xx_from = box[0] + x*xscale; 4315: 1343: double ss = 0; 14502: 1344: for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 10187: 1345: FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; 42371: 1346: for (xx = xx_from; xx < xx_from + xscale; xx++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 32184: 1347: ss += line[xx + 0]; -: 1348: } -: 1349: } 4315: 1350: IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; -: 1351: } -: 1352: } 54: 1353: if (box[2] % xscale && box[3] % yscale) { branch 0 taken 48% (fallthrough) branch 1 taken 52% branch 2 taken 65% (fallthrough) branch 3 taken 35% 17: 1354: double multiplier = 1.0 / ((box[2] % xscale) * (box[3] % yscale)); 17: 1355: double ss = 0; 17: 1356: x = box[2] / xscale; 17: 1357: y = box[3] / yscale; 92: 1358: for (yy = box[1] + y*yscale; yy < box[1] + box[3]; yy++) { branch 0 taken 82% branch 1 taken 18% (fallthrough) 75: 1359: FLOAT32 *line = (FLOAT32 *)imIn->image32[yy]; 465: 1360: for (xx = box[0] + x*xscale; xx < box[0] + box[2]; xx++) { branch 0 taken 84% branch 1 taken 16% (fallthrough) 390: 1361: ss += line[xx + 0]; -: 1362: } -: 1363: } 17: 1364: IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; -: 1365: } -: 1366: break; -: 1367: } 108: 1368:} -: 1369: -: 1370: -: 1371:Imaging function ImagingReduce called 495 returned 100% blocks executed 100% 495: 1372:ImagingReduce(Imaging imIn, int xscale, int yscale, int box[4]) -: 1373:{ -: 1374: ImagingSectionCookie cookie; 495: 1375: Imaging imOut = NULL; -: 1376: 495: 1377: if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 1% (fallthrough) branch 7 taken 99% 2: 1378: return (Imaging) ImagingError_ModeError(); call 0 returned 100% -: 1379: } -: 1380: 493: 1381: if (imIn->type == IMAGING_TYPE_SPECIAL) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 1382: return (Imaging) ImagingError_ModeError(); call 0 returned 100% -: 1383: } -: 1384: 1476: 1385: imOut = ImagingNewDirty(imIn->mode, call 0 returned 100% 492: 1386: (box[2] + xscale - 1) / xscale, 492: 1387: (box[3] + yscale - 1) / yscale); 492: 1388: if ( ! imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1389: return NULL; -: 1390: } -: 1391: 492: 1392: ImagingSectionEnter(&cookie); call 0 returned 100% -: 1393: 492: 1394: switch(imIn->type) { branch 0 taken 78% branch 1 taken 22% branch 2 taken 0% -: 1395: case IMAGING_TYPE_UINT8: 384: 1396: if (xscale == 1) { branch 0 taken 21% (fallthrough) branch 1 taken 79% 81: 1397: if (yscale == 2) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 20: 1398: ImagingReduce1x2(imOut, imIn, box); call 0 returned 100% 61: 1399: } else if (yscale == 3) { branch 0 taken 34% (fallthrough) branch 1 taken 66% 21: 1400: ImagingReduce1x3(imOut, imIn, box); call 0 returned 100% -: 1401: } else { 40: 1402: ImagingReduce1xN(imOut, imIn, box, yscale); call 0 returned 100% -: 1403: } 303: 1404: } else if (yscale == 1) { branch 0 taken 27% (fallthrough) branch 1 taken 73% 81: 1405: if (xscale == 2) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 20: 1406: ImagingReduce2x1(imOut, imIn, box); call 0 returned 100% 61: 1407: } else if (xscale == 3) { branch 0 taken 34% (fallthrough) branch 1 taken 66% 21: 1408: ImagingReduce3x1(imOut, imIn, box); call 0 returned 100% -: 1409: } else { 40: 1410: ImagingReduceNx1(imOut, imIn, box, xscale); call 0 returned 100% -: 1411: } 222: 1412: } else if (xscale == yscale && xscale <= 5) { branch 0 taken 51% (fallthrough) branch 1 taken 49% branch 2 taken 82% (fallthrough) branch 3 taken 18% 93: 1413: if (xscale == 2) { branch 0 taken 29% (fallthrough) branch 1 taken 71% 27: 1414: ImagingReduce2x2(imOut, imIn, box); call 0 returned 100% 66: 1415: } else if (xscale == 3) { branch 0 taken 39% (fallthrough) branch 1 taken 61% 26: 1416: ImagingReduce3x3(imOut, imIn, box); call 0 returned 100% 40: 1417: } else if (xscale == 4) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 20: 1418: ImagingReduce4x4(imOut, imIn, box); call 0 returned 100% -: 1419: } else { 20: 1420: ImagingReduce5x5(imOut, imIn, box); call 0 returned 100% -: 1421: } -: 1422: } else { 129: 1423: ImagingReduceNxN(imOut, imIn, box, xscale, yscale); call 0 returned 100% -: 1424: } -: 1425: 384: 1426: ImagingReduceCorners(imOut, imIn, box, xscale, yscale); call 0 returned 100% 384: 1427: break; -: 1428: -: 1429: case IMAGING_TYPE_INT32: -: 1430: case IMAGING_TYPE_FLOAT32: 108: 1431: ImagingReduceNxN_32bpc(imOut, imIn, box, xscale, yscale); call 0 returned 100% -: 1432: 108: 1433: ImagingReduceCorners_32bpc(imOut, imIn, box, xscale, yscale); call 0 returned 100% 108: 1434: break; -: 1435: } -: 1436: 492: 1437: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1438: 492: 1439: return imOut; -: 1440:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ImagingUtils.h.gcov -: 0:Source:src/libImaging/ImagingUtils.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Filter.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Filter.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:#ifdef WORDS_BIGENDIAN -: 2: #define MAKE_UINT32(u0, u1, u2, u3) ((UINT32)(u3) | ((UINT32)(u2)<<8) | ((UINT32)(u1)<<16) | ((UINT32)(u0)<<24)) -: 3: #define MASK_UINT32_CHANNEL_0 0xff000000 -: 4: #define MASK_UINT32_CHANNEL_1 0x00ff0000 -: 5: #define MASK_UINT32_CHANNEL_2 0x0000ff00 -: 6: #define MASK_UINT32_CHANNEL_3 0x000000ff -: 7:#else -: 8: #define MAKE_UINT32(u0, u1, u2, u3) ((UINT32)(u0) | ((UINT32)(u1)<<8) | ((UINT32)(u2)<<16) | ((UINT32)(u3)<<24)) -: 9: #define MASK_UINT32_CHANNEL_0 0x000000ff -: 10: #define MASK_UINT32_CHANNEL_1 0x0000ff00 -: 11: #define MASK_UINT32_CHANNEL_2 0x00ff0000 -: 12: #define MASK_UINT32_CHANNEL_3 0xff000000 -: 13:#endif -: 14: -: 15: -: 16:#define SHIFTFORDIV255(a)\ -: 17: ((((a) >> 8) + a) >> 8) -: 18: -: 19:/* like (a * b + 127) / 255), but much faster on most platforms */ -: 20:#define MULDIV255(a, b, tmp)\ -: 21: (tmp = (a) * (b) + 128, SHIFTFORDIV255(tmp)) -: 22: -: 23:#define DIV255(a, tmp)\ -: 24: (tmp = (a) + 128, SHIFTFORDIV255(tmp)) -: 25: -: 26:#define BLEND(mask, in1, in2, tmp1)\ -: 27: DIV255(in1 * (255 - mask) + in2 * mask, tmp1) -: 28: -: 29:#define PREBLEND(mask, in1, in2, tmp1)\ -: 30: (MULDIV255(in1, (255 - mask), tmp1) + in2) -: 31: -: 32: -: 33:#define CLIP8(v) ((v) <= 0 ? 0 : (v) < 256 ? (v) : 255) -: 34: -: 35:/* This is to work around a bug in GCC prior 4.9 in 64 bit mode. -: 36: GCC generates code with partial dependency which is 3 times slower. -: 37: See: http://stackoverflow.com/a/26588074/253146 */ -: 38:#if defined(__x86_64__) && defined(__SSE__) && ! defined(__NO_INLINE__) && \ -: 39: ! defined(__clang__) && defined(GCC_VERSION) && (GCC_VERSION < 40900) -: 40:static float __attribute__((always_inline)) inline _i2f(int v) { -: 41: float x; -: 42: __asm__("xorps %0, %0; cvtsi2ss %1, %0" : "=x"(x) : "r"(v) ); -: 43: return x; -: 44:} -: 45:#else 23864303: 46:static float inline _i2f(int v) { return (float) v; } -: 47:#endif <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Jpeg2KDecode.c.gcov -: 0:Source:src/libImaging/Jpeg2KDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Jpeg2KDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Jpeg2KDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for JPEG2000 image data. -: 6: * -: 7: * history: -: 8: * 2014-03-12 ajh Created -: 9: * -: 10: * Copyright (c) 2014 Coriolis Systems Limited -: 11: * Copyright (c) 2014 Alastair Houghton -: 12: * -: 13: * See the README file for details on usage and redistribution. -: 14: */ -: 15: -: 16:#include "Imaging.h" -: 17: -: 18:#ifdef HAVE_OPENJPEG -: 19: -: 20:#include -: 21:#include "Jpeg2K.h" -: 22: -: 23:typedef struct { -: 24: OPJ_UINT32 tile_index; -: 25: OPJ_UINT32 data_size; -: 26: OPJ_INT32 x0, y0, x1, y1; -: 27: OPJ_UINT32 nb_comps; -: 28:} JPEG2KTILEINFO; -: 29: -: 30:/* -------------------------------------------------------------------- */ -: 31:/* Error handler */ -: 32:/* -------------------------------------------------------------------- */ -: 33: -: 34:static void function j2k_error called 0 returned 0% blocks executed 0% #####: 35:j2k_error(const char *msg, void *client_data) -: 36:{ #####: 37: JPEG2KDECODESTATE *state = (JPEG2KDECODESTATE *) client_data; #####: 38: free((void *)state->error_msg); #####: 39: state->error_msg = strdup(msg); call 0 never executed #####: 40:} -: 41: -: 42:/* -------------------------------------------------------------------- */ -: 43:/* Buffer input stream */ -: 44:/* -------------------------------------------------------------------- */ -: 45: -: 46:static OPJ_SIZE_T function j2k_read called 62 returned 100% blocks executed 100% 62: 47:j2k_read(void *p_buffer, OPJ_SIZE_T p_nb_bytes, void *p_user_data) -: 48:{ 62: 49: ImagingCodecState state = (ImagingCodecState)p_user_data; -: 50: 62: 51: size_t len = _imaging_read_pyFd(state->fd, p_buffer, p_nb_bytes); call 0 returned 100% -: 52: 62: 53: return len ? len : (OPJ_SIZE_T)-1; branch 0 taken 53% (fallthrough) branch 1 taken 47% -: 54:} -: 55: -: 56:static OPJ_OFF_T function j2k_skip called 0 returned 0% blocks executed 0% #####: 57:j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) -: 58:{ -: 59: off_t pos; #####: 60: ImagingCodecState state = (ImagingCodecState)p_user_data; -: 61: #####: 62: _imaging_seek_pyFd(state->fd, p_nb_bytes, SEEK_CUR); call 0 never executed #####: 63: pos = _imaging_tell_pyFd(state->fd); call 0 never executed -: 64: #####: 65: return pos ? pos : (OPJ_OFF_T)-1; branch 0 never executed branch 1 never executed -: 66:} -: 67: -: 68:/* -------------------------------------------------------------------- */ -: 69:/* Unpackers */ -: 70:/* -------------------------------------------------------------------- */ -: 71: -: 72:typedef void (*j2k_unpacker_t)(opj_image_t *in, -: 73: const JPEG2KTILEINFO *tileInfo, -: 74: const UINT8 *data, -: 75: Imaging im); -: 76: -: 77:struct j2k_decode_unpacker { -: 78: const char *mode; -: 79: OPJ_COLOR_SPACE color_space; -: 80: unsigned components; -: 81: j2k_unpacker_t unpacker; -: 82:}; -: 83: -: 84:static inline -: 85:unsigned j2ku_shift(unsigned x, int n) -: 86:{ 19927296: 87: if (n < 0) { branch 0 never executed branch 1 never executed branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 never executed branch 5 never executed branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 taken 0% (fallthrough) branch 21 taken 100% branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed #####: 88: return x >> -n; -: 89: } else { 19927296: 90: return x << n; -: 91: } -: 92:} -: 93: -: 94:static void function j2ku_gray_l called 0 returned 0% blocks executed 0% #####: 95:j2ku_gray_l(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 96: const UINT8 *tiledata, Imaging im) -: 97:{ #####: 98: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 99: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 100: unsigned h = tileinfo->y1 - tileinfo->y0; -: 101: #####: 102: int shift = 8 - in->comps[0].prec; #####: 103: int offset = in->comps[0].sgnd ? 1 << (in->comps[0].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 104: int csiz = (in->comps[0].prec + 7) >> 3; -: 105: -: 106: unsigned x, y; -: 107: #####: 108: if (csiz == 3) { branch 0 never executed branch 1 never executed #####: 109: csiz = 4; -: 110: } -: 111: #####: 112: if (shift < 0) { branch 0 never executed branch 1 never executed #####: 113: offset += 1 << (-shift - 1); -: 114: } -: 115: -: 116: /* csiz*h*w + offset = tileinfo.datasize */ #####: 117: switch (csiz) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 118: case 1: #####: 119: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 120: const UINT8 *data = &tiledata[y * w]; #####: 121: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 122: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 123: *row++ = j2ku_shift(offset + *data++, shift); -: 124: } -: 125: } -: 126: break; -: 127: case 2: #####: 128: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 129: const UINT16 *data = (const UINT16 *)&tiledata[2 * y * w]; #####: 130: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 131: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 132: *row++ = j2ku_shift(offset + *data++, shift); -: 133: } -: 134: } -: 135: break; -: 136: case 4: #####: 137: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 138: const UINT32 *data = (const UINT32 *)&tiledata[4 * y * w]; #####: 139: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 140: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 141: *row++ = j2ku_shift(offset + *data++, shift); -: 142: } -: 143: } -: 144: break; -: 145: } #####: 146:} -: 147: -: 148: -: 149:static void function j2ku_gray_i called 8 returned 100% blocks executed 37% 8: 150:j2ku_gray_i(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 151: const UINT8 *tiledata, Imaging im) -: 152:{ 8: 153: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; 8: 154: unsigned w = tileinfo->x1 - tileinfo->x0; 8: 155: unsigned h = tileinfo->y1 - tileinfo->y0; -: 156: 8: 157: int shift = 16 - in->comps[0].prec; 8: 158: int offset = in->comps[0].sgnd ? 1 << (in->comps[0].prec - 1) : 0; branch 0 taken 0% (fallthrough) branch 1 taken 100% 8: 159: int csiz = (in->comps[0].prec + 7) >> 3; -: 160: -: 161: unsigned x, y; -: 162: 8: 163: if (csiz == 3) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 164: csiz = 4; -: 165: } -: 166: 8: 167: if (shift < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 168: offset += 1 << (-shift - 1); -: 169: } -: 170: 8: 171: switch (csiz) { branch 0 taken 0% branch 1 taken 100% branch 2 taken 0% branch 3 taken 0% -: 172: case 1: #####: 173: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 174: const UINT8 *data = &tiledata[y * w]; #####: 175: UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; #####: 176: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 177: *row++ = j2ku_shift(offset + *data++, shift); -: 178: } -: 179: } -: 180: break; -: 181: case 2: 512: 182: for (y = 0; y < h; ++y) { branch 0 taken 98% branch 1 taken 2% 512: 183: const UINT16 *data = (const UINT16 *)&tiledata[2 * y * w]; 512: 184: UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; 33280: 185: for (x = 0; x < w; ++x) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 65536: 186: *row++ = j2ku_shift(offset + *data++, shift); -: 187: } -: 188: } -: 189: break; -: 190: case 4: #####: 191: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 192: const UINT32 *data = (const UINT32 *)&tiledata[4 * y * w]; #####: 193: UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; #####: 194: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 195: *row++ = j2ku_shift(offset + *data++, shift); -: 196: } -: 197: } -: 198: break; -: 199: } 8: 200:} -: 201: -: 202: -: 203:static void function j2ku_gray_rgb called 0 returned 0% blocks executed 0% #####: 204:j2ku_gray_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 205: const UINT8 *tiledata, Imaging im) -: 206:{ #####: 207: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 208: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 209: unsigned h = tileinfo->y1 - tileinfo->y0; -: 210: #####: 211: int shift = 8 - in->comps[0].prec; #####: 212: int offset = in->comps[0].sgnd ? 1 << (in->comps[0].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 213: int csiz = (in->comps[0].prec + 7) >> 3; -: 214: -: 215: unsigned x, y; -: 216: #####: 217: if (shift < 0) { branch 0 never executed branch 1 never executed #####: 218: offset += 1 << (-shift - 1); -: 219: } -: 220: #####: 221: if (csiz == 3) { branch 0 never executed branch 1 never executed #####: 222: csiz = 4; -: 223: } -: 224: #####: 225: switch (csiz) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 226: case 1: #####: 227: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 228: const UINT8 *data = &tiledata[y * w]; #####: 229: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 230: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 231: UINT8 byte = j2ku_shift(offset + *data++, shift); #####: 232: row[0] = row[1] = row[2] = byte; #####: 233: row[3] = 0xff; #####: 234: row += 4; -: 235: } -: 236: } -: 237: break; -: 238: case 2: #####: 239: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 240: const UINT16 *data = (UINT16 *)&tiledata[2 * y * w]; #####: 241: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 242: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 243: UINT8 byte = j2ku_shift(offset + *data++, shift); #####: 244: row[0] = row[1] = row[2] = byte; #####: 245: row[3] = 0xff; #####: 246: row += 4; -: 247: } -: 248: } -: 249: break; -: 250: case 4: #####: 251: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 252: const UINT32 *data = (UINT32 *)&tiledata[4 * y * w]; #####: 253: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 254: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 255: UINT8 byte = j2ku_shift(offset + *data++, shift); #####: 256: row[0] = row[1] = row[2] = byte; #####: 257: row[3] = 0xff; #####: 258: row += 4; -: 259: } -: 260: } -: 261: break; -: 262: } #####: 263:} -: 264: -: 265:static void function j2ku_graya_la called 0 returned 0% blocks executed 0% #####: 266:j2ku_graya_la(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 267: const UINT8 *tiledata, Imaging im) -: 268:{ #####: 269: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 270: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 271: unsigned h = tileinfo->y1 - tileinfo->y0; -: 272: #####: 273: int shift = 8 - in->comps[0].prec; #####: 274: int offset = in->comps[0].sgnd ? 1 << (in->comps[0].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 275: int csiz = (in->comps[0].prec + 7) >> 3; #####: 276: int ashift = 8 - in->comps[1].prec; #####: 277: int aoffset = in->comps[1].sgnd ? 1 << (in->comps[1].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 278: int acsiz = (in->comps[1].prec + 7) >> 3; -: 279: const UINT8 *atiledata; -: 280: -: 281: unsigned x, y; -: 282: #####: 283: if (csiz == 3) { branch 0 never executed branch 1 never executed #####: 284: csiz = 4; -: 285: } #####: 286: if (acsiz == 3) { branch 0 never executed branch 1 never executed #####: 287: acsiz = 4; -: 288: } -: 289: #####: 290: if (shift < 0) { branch 0 never executed branch 1 never executed #####: 291: offset += 1 << (-shift - 1); -: 292: } #####: 293: if (ashift < 0) { branch 0 never executed branch 1 never executed #####: 294: aoffset += 1 << (-ashift - 1); -: 295: } -: 296: #####: 297: atiledata = tiledata + csiz * w * h; -: 298: #####: 299: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 300: const UINT8 *data = &tiledata[csiz * y * w]; #####: 301: const UINT8 *adata = &atiledata[acsiz * y * w]; #####: 302: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; #####: 303: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 304: UINT32 word = 0, aword = 0, byte; -: 305: #####: 306: switch (csiz) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 307: case 1: word = *data++; break; #####: 308: case 2: word = *(const UINT16 *)data; data += 2; break; #####: 309: case 4: word = *(const UINT32 *)data; data += 4; break; -: 310: } -: 311: #####: 312: switch (acsiz) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 313: case 1: aword = *adata++; break; #####: 314: case 2: aword = *(const UINT16 *)adata; adata += 2; break; #####: 315: case 4: aword = *(const UINT32 *)adata; adata += 4; break; -: 316: } -: 317: #####: 318: byte = j2ku_shift(offset + word, shift); #####: 319: row[0] = row[1] = row[2] = byte; #####: 320: row[3] = j2ku_shift(aoffset + aword, ashift); #####: 321: row += 4; -: 322: } -: 323: } #####: 324:} -: 325: -: 326:static void function j2ku_srgb_rgb called 76 returned 100% blocks executed 79% 76: 327:j2ku_srgb_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 328: const UINT8 *tiledata, Imaging im) -: 329:{ 76: 330: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; 76: 331: unsigned w = tileinfo->x1 - tileinfo->x0; 76: 332: unsigned h = tileinfo->y1 - tileinfo->y0; -: 333: -: 334: int shifts[3], offsets[3], csiz[3]; -: 335: const UINT8 *cdata[3]; 76: 336: const UINT8 *cptr = tiledata; -: 337: unsigned n, x, y; -: 338: 304: 339: for (n = 0; n < 3; ++n) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 228: 340: cdata[n] = cptr; 228: 341: shifts[n] = 8 - in->comps[n].prec; 228: 342: offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; branch 0 taken 0% (fallthrough) branch 1 taken 100% 228: 343: csiz[n] = (in->comps[n].prec + 7) >> 3; -: 344: 228: 345: if (csiz[n] == 3) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 346: csiz[n] = 4; -: 347: } -: 348: 228: 349: if (shifts[n] < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 350: offsets[n] += 1 << (-shifts[n] - 1); -: 351: } -: 352: 228: 353: cptr += csiz[n] * w * h; -: 354: } -: 355: 13080: 356: for (y = 0; y < h; ++y) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 357: const UINT8 *data[3]; 13080: 358: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; 52320: 359: for (n = 0; n < 3; ++n) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 39240: 360: data[n] = &cdata[n][csiz[n] * y * w]; -: 361: } -: 362: 4320000: 363: for (x = 0; x < w; ++x) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 12960000: 364: for (n = 0; n < 3; ++n) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 12960000: 365: UINT32 word = 0; -: 366: 12960000: 367: switch (csiz[n]) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% 12960000: 368: case 1: word = *data[n]++; break; #####: 369: case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; #####: 370: case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; -: 371: } -: 372: 25920000: 373: row[n] = j2ku_shift(offsets[n] + word, shifts[n]); -: 374: } 4320000: 375: row[3] = 0xff; 4320000: 376: row += 4; -: 377: } -: 378: } 76: 379:} -: 380: -: 381:static void function j2ku_sycc_rgb called 0 returned 0% blocks executed 0% #####: 382:j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 383: const UINT8 *tiledata, Imaging im) -: 384:{ #####: 385: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 386: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 387: unsigned h = tileinfo->y1 - tileinfo->y0; -: 388: -: 389: int shifts[3], offsets[3], csiz[3]; -: 390: const UINT8 *cdata[3]; #####: 391: const UINT8 *cptr = tiledata; -: 392: unsigned n, x, y; -: 393: #####: 394: for (n = 0; n < 3; ++n) { branch 0 never executed branch 1 never executed #####: 395: cdata[n] = cptr; #####: 396: shifts[n] = 8 - in->comps[n].prec; #####: 397: offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 398: csiz[n] = (in->comps[n].prec + 7) >> 3; -: 399: #####: 400: if (csiz[n] == 3) { branch 0 never executed branch 1 never executed #####: 401: csiz[n] = 4; -: 402: } -: 403: #####: 404: if (shifts[n] < 0) { branch 0 never executed branch 1 never executed #####: 405: offsets[n] += 1 << (-shifts[n] - 1); -: 406: } -: 407: #####: 408: cptr += csiz[n] * w * h; -: 409: } -: 410: #####: 411: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed -: 412: const UINT8 *data[3]; #####: 413: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; #####: 414: UINT8 *row_start = row; #####: 415: for (n = 0; n < 3; ++n) { branch 0 never executed branch 1 never executed #####: 416: data[n] = &cdata[n][csiz[n] * y * w]; -: 417: } -: 418: #####: 419: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 420: for (n = 0; n < 3; ++n) { branch 0 never executed branch 1 never executed #####: 421: UINT32 word = 0; -: 422: #####: 423: switch (csiz[n]) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 424: case 1: word = *data[n]++; break; #####: 425: case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; #####: 426: case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; -: 427: } -: 428: #####: 429: row[n] = j2ku_shift(offsets[n] + word, shifts[n]); -: 430: } #####: 431: row[3] = 0xff; #####: 432: row += 4; -: 433: } -: 434: #####: 435: ImagingConvertYCbCr2RGB(row_start, row_start, w); call 0 never executed -: 436: } #####: 437:} -: 438: -: 439:static void function j2ku_srgba_rgba called 10 returned 100% blocks executed 79% 10: 440:j2ku_srgba_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 441: const UINT8 *tiledata, Imaging im) -: 442:{ 10: 443: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; 10: 444: unsigned w = tileinfo->x1 - tileinfo->x0; 10: 445: unsigned h = tileinfo->y1 - tileinfo->y0; -: 446: -: 447: int shifts[4], offsets[4], csiz[4]; -: 448: const UINT8 *cdata[4]; 10: 449: const UINT8 *cptr = tiledata; -: 450: unsigned n, x, y; -: 451: 50: 452: for (n = 0; n < 4; ++n) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 40: 453: cdata[n] = cptr; 40: 454: shifts[n] = 8 - in->comps[n].prec; 40: 455: offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; branch 0 taken 0% (fallthrough) branch 1 taken 100% 40: 456: csiz[n] = (in->comps[n].prec + 7) >> 3; -: 457: 40: 458: if (csiz[n] == 3) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 459: csiz[n] = 4; -: 460: } -: 461: 40: 462: if (shifts[n] < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 463: offsets[n] += 1 << (-shifts[n] - 1); -: 464: } -: 465: 40: 466: cptr += csiz[n] * w * h; -: 467: } -: 468: 2912: 469: for (y = 0; y < h; ++y) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 470: const UINT8 *data[4]; 2912: 471: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; 14560: 472: for (n = 0; n < 4; ++n) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 11648: 473: data[n] = &cdata[n][csiz[n] * y * w]; -: 474: } -: 475: 1733632: 476: for (x = 0; x < w; ++x) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 6934528: 477: for (n = 0; n < 4; ++n) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 6934528: 478: UINT32 word = 0; -: 479: 6934528: 480: switch (csiz[n]) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% 6934528: 481: case 1: word = *data[n]++; break; #####: 482: case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; #####: 483: case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; -: 484: } -: 485: 13869056: 486: row[n] = j2ku_shift(offsets[n] + word, shifts[n]); -: 487: } 1733632: 488: row += 4; -: 489: } -: 490: } 10: 491:} -: 492: -: 493:static void function j2ku_sycca_rgba called 0 returned 0% blocks executed 0% #####: 494:j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 495: const UINT8 *tiledata, Imaging im) -: 496:{ #####: 497: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 498: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 499: unsigned h = tileinfo->y1 - tileinfo->y0; -: 500: -: 501: int shifts[4], offsets[4], csiz[4]; -: 502: const UINT8 *cdata[4]; #####: 503: const UINT8 *cptr = tiledata; -: 504: unsigned n, x, y; -: 505: #####: 506: for (n = 0; n < 4; ++n) { branch 0 never executed branch 1 never executed #####: 507: cdata[n] = cptr; #####: 508: shifts[n] = 8 - in->comps[n].prec; #####: 509: offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 510: csiz[n] = (in->comps[n].prec + 7) >> 3; -: 511: #####: 512: if (csiz[n] == 3) { branch 0 never executed branch 1 never executed #####: 513: csiz[n] = 4; -: 514: } -: 515: #####: 516: if (shifts[n] < 0) { branch 0 never executed branch 1 never executed #####: 517: offsets[n] += 1 << (-shifts[n] - 1); -: 518: } -: 519: #####: 520: cptr += csiz[n] * w * h; -: 521: } -: 522: #####: 523: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed -: 524: const UINT8 *data[4]; #####: 525: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; #####: 526: UINT8 *row_start = row; #####: 527: for (n = 0; n < 4; ++n) { branch 0 never executed branch 1 never executed #####: 528: data[n] = &cdata[n][csiz[n] * y * w]; -: 529: } -: 530: #####: 531: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 532: for (n = 0; n < 4; ++n) { branch 0 never executed branch 1 never executed #####: 533: UINT32 word = 0; -: 534: #####: 535: switch (csiz[n]) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 536: case 1: word = *data[n]++; break; #####: 537: case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; #####: 538: case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; -: 539: } -: 540: #####: 541: row[n] = j2ku_shift(offsets[n] + word, shifts[n]); -: 542: } #####: 543: row += 4; -: 544: } -: 545: #####: 546: ImagingConvertYCbCr2RGB(row_start, row_start, w); call 0 never executed -: 547: } #####: 548:} -: 549: -: 550:static const struct j2k_decode_unpacker j2k_unpackers[] = { -: 551: { "L", OPJ_CLRSPC_GRAY, 1, j2ku_gray_l }, -: 552: { "I;16", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i }, -: 553: { "I;16B", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i }, -: 554: { "LA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la }, -: 555: { "RGB", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb }, -: 556: { "RGB", OPJ_CLRSPC_GRAY, 2, j2ku_gray_rgb }, -: 557: { "RGB", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb }, -: 558: { "RGB", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb }, -: 559: { "RGB", OPJ_CLRSPC_SRGB, 4, j2ku_srgb_rgb }, -: 560: { "RGB", OPJ_CLRSPC_SYCC, 4, j2ku_sycc_rgb }, -: 561: { "RGBA", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb }, -: 562: { "RGBA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la }, -: 563: { "RGBA", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb }, -: 564: { "RGBA", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb }, -: 565: { "RGBA", OPJ_CLRSPC_SRGB, 4, j2ku_srgba_rgba }, -: 566: { "RGBA", OPJ_CLRSPC_SYCC, 4, j2ku_sycca_rgba }, -: 567:}; -: 568: -: 569:/* -------------------------------------------------------------------- */ -: 570:/* Decoder */ -: 571:/* -------------------------------------------------------------------- */ -: 572: -: 573:enum { -: 574: J2K_STATE_START = 0, -: 575: J2K_STATE_DECODING = 1, -: 576: J2K_STATE_DONE = 2, -: 577: J2K_STATE_FAILED = 3, -: 578:}; -: 579: -: 580:static int function j2k_decode_entry called 33 returned 100% blocks executed 80% 33: 581:j2k_decode_entry(Imaging im, ImagingCodecState state) -: 582:{ 33: 583: JPEG2KDECODESTATE *context = (JPEG2KDECODESTATE *) state->context; 33: 584: opj_stream_t *stream = NULL; 33: 585: opj_image_t *image = NULL; 33: 586: opj_codec_t *codec = NULL; -: 587: opj_dparameters_t params; -: 588: OPJ_COLOR_SPACE color_space; 33: 589: j2k_unpacker_t unpack = NULL; 33: 590: size_t buffer_size = 0, tile_bytes = 0; -: 591: unsigned n, tile_height, tile_width; -: 592: int components; -: 593: -: 594: 33: 595: stream = opj_stream_create(BUFFER_SIZE, OPJ_TRUE); call 0 returned 100% -: 596: 33: 597: if (!stream) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 598: state->errcode = IMAGING_CODEC_BROKEN; #####: 599: state->state = J2K_STATE_FAILED; #####: 600: goto quick_exit; -: 601: } -: 602: 33: 603: opj_stream_set_read_function(stream, j2k_read); call 0 returned 100% 33: 604: opj_stream_set_skip_function(stream, j2k_skip); call 0 returned 100% -: 605: -: 606: /* OpenJPEG 2.0 doesn't have OPJ_VERSION_MAJOR */ -: 607:#ifndef OPJ_VERSION_MAJOR -: 608: opj_stream_set_user_data(stream, state); -: 609:#else 33: 610: opj_stream_set_user_data(stream, state, NULL); call 0 returned 100% -: 611: -: 612: /* Hack: if we don't know the length, the largest file we can -: 613: possibly support is 4GB. We can't go larger than this, because -: 614: OpenJPEG truncates this value for the final box in the file, and -: 615: the box lengths in OpenJPEG are currently 32 bit. */ 33: 616: if (context->length < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 617: opj_stream_set_user_data_length(stream, 0xffffffff); call 0 never executed -: 618: } else { 33: 619: opj_stream_set_user_data_length(stream, context->length); call 0 returned 100% -: 620: } -: 621:#endif -: 622: -: 623: /* Setup decompression context */ 33: 624: context->error_msg = NULL; -: 625: 33: 626: opj_set_default_decoder_parameters(¶ms); call 0 returned 100% 33: 627: params.cp_reduce = context->reduce; 33: 628: params.cp_layer = context->layers; -: 629: 33: 630: codec = opj_create_decompress(context->format); call 0 returned 100% -: 631: 33: 632: if (!codec) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 633: state->errcode = IMAGING_CODEC_BROKEN; #####: 634: state->state = J2K_STATE_FAILED; #####: 635: goto quick_exit; -: 636: } -: 637: 33: 638: opj_set_error_handler(codec, j2k_error, context); call 0 returned 100% 33: 639: opj_setup_decoder(codec, ¶ms); call 0 returned 100% -: 640: 33: 641: if (!opj_read_header(stream, codec, &image)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 642: state->errcode = IMAGING_CODEC_BROKEN; #####: 643: state->state = J2K_STATE_FAILED; #####: 644: goto quick_exit; -: 645: } -: 646: -: 647: /* Check that this image is something we can handle */ 33: 648: if (image->numcomps < 1 || image->numcomps > 4 branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 649: || image->color_space == OPJ_CLRSPC_UNKNOWN) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 650: state->errcode = IMAGING_CODEC_BROKEN; #####: 651: state->state = J2K_STATE_FAILED; #####: 652: goto quick_exit; -: 653: } -: 654: 60: 655: for (n = 1; n < image->numcomps; ++n) { branch 0 taken 65% branch 1 taken 35% (fallthrough) 60: 656: if (image->comps[n].dx != 1 || image->comps[n].dy != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 657: state->errcode = IMAGING_CODEC_BROKEN; #####: 658: state->state = J2K_STATE_FAILED; #####: 659: goto quick_exit; -: 660: } -: 661: } -: 662: -: 663: /* -: 664: Colorspace Number of components PIL mode -: 665: ------------------------------------------------------ -: 666: sRGB 3 RGB -: 667: sRGB 4 RGBA -: 668: gray 1 L or I -: 669: gray 2 LA -: 670: YCC 3 YCbCr -: 671: -: 672: -: 673: If colorspace is unspecified, we assume: -: 674: -: 675: Number of components Colorspace -: 676: ----------------------------------------- -: 677: 1 gray -: 678: 2 gray (+ alpha) -: 679: 3 sRGB -: 680: 4 sRGB (+ alpha) -: 681: -: 682: */ -: 683: -: 684: /* Find the correct unpacker */ 33: 685: color_space = image->color_space; -: 686: 33: 687: if (color_space == OPJ_CLRSPC_UNSPECIFIED) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 688: switch (image->numcomps) { branch 0 taken 24% branch 1 taken 76% branch 2 taken 0% 8: 689: case 1: case 2: color_space = OPJ_CLRSPC_GRAY; break; 25: 690: case 3: case 4: color_space = OPJ_CLRSPC_SRGB; break; -: 691: } -: 692: } -: 693: 271: 694: for (n = 0; n < sizeof(j2k_unpackers) / sizeof (j2k_unpackers[0]); ++n) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 271: 695: if (color_space == j2k_unpackers[n].color_space branch 0 taken 26% (fallthrough) branch 1 taken 74% 71: 696: && image->numcomps == j2k_unpackers[n].components branch 0 taken 72% (fallthrough) branch 1 taken 28% 51: 697: && strcmp (im->mode, j2k_unpackers[n].mode) == 0) { branch 0 taken 65% (fallthrough) branch 1 taken 35% 33: 698: unpack = j2k_unpackers[n].unpacker; 33: 699: break; -: 700: } -: 701: } -: 702: 33: 703: if (!unpack) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 704: state->errcode = IMAGING_CODEC_BROKEN; #####: 705: state->state = J2K_STATE_FAILED; #####: 706: goto quick_exit; -: 707: } -: 708: -: 709: /* Decode the image tile-by-tile; this means we only need use as much -: 710: memory as is required for one tile's worth of components. */ -: 711: for (;;) { -: 712: JPEG2KTILEINFO tile_info; -: 713: OPJ_BOOL should_continue; 127: 714: unsigned correction = (1 << params.cp_reduce) - 1; -: 715: 127: 716: if (!opj_read_tile_header(codec, call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 717: stream, -: 718: &tile_info.tile_index, -: 719: &tile_info.data_size, -: 720: &tile_info.x0, &tile_info.y0, -: 721: &tile_info.x1, &tile_info.y1, -: 722: &tile_info.nb_comps, -: 723: &should_continue)) { #####: 724: state->errcode = IMAGING_CODEC_BROKEN; #####: 725: state->state = J2K_STATE_FAILED; #####: 726: goto quick_exit; -: 727: } -: 728: 127: 729: if (!should_continue) { branch 0 taken 74% (fallthrough) branch 1 taken 26% -: 730: break; -: 731: } -: 732: -: 733: /* Adjust the tile co-ordinates based on the reduction (OpenJPEG -: 734: doesn't do this for us) */ 94: 735: tile_info.x0 = (tile_info.x0 + correction) >> context->reduce; 94: 736: tile_info.y0 = (tile_info.y0 + correction) >> context->reduce; 94: 737: tile_info.x1 = (tile_info.x1 + correction) >> context->reduce; 94: 738: tile_info.y1 = (tile_info.y1 + correction) >> context->reduce; -: 739: -: 740: /* Check the tile bounds; if the tile is outside the image area, -: 741: or if it has a negative width or height (i.e. the coordinates are -: 742: swapped), bail. */ 94: 743: if (tile_info.x0 >= tile_info.x1 branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 744: || tile_info.y0 >= tile_info.y1 branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 745: || tile_info.x0 < (OPJ_INT32)image->x0 branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 746: || tile_info.y0 < (OPJ_INT32)image->y0 branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 747: || tile_info.x1 - image->x0 > im->xsize branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 748: || tile_info.y1 - image->y0 > im->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 749: state->errcode = IMAGING_CODEC_BROKEN; #####: 750: state->state = J2K_STATE_FAILED; #####: 751: goto quick_exit; -: 752: } -: 753: -: 754: /* Sometimes the tile_info.datasize we get back from openjpeg -: 755: is less than numcomps*w*h, and we overflow in the -: 756: shuffle stage */ -: 757: 94: 758: tile_width = tile_info.x1 - tile_info.x0; 94: 759: tile_height = tile_info.y1 - tile_info.y0; 94: 760: components = tile_info.nb_comps == 3 ? 4 : tile_info.nb_comps; branch 0 taken 19% (fallthrough) branch 1 taken 81% 94: 761: if (( tile_width > UINT_MAX / components ) || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 94: 762: ( tile_height > UINT_MAX / components ) || branch 0 taken 100% (fallthrough) branch 1 taken 0% 188: 763: ( tile_width > UINT_MAX / (tile_height * components )) || branch 0 taken 0% (fallthrough) branch 1 taken 100% 94: 764: ( tile_height > UINT_MAX / (tile_width * components ))) { #####: 765: state->errcode = IMAGING_CODEC_BROKEN; #####: 766: state->state = J2K_STATE_FAILED; #####: 767: goto quick_exit; -: 768: } -: 769: 94: 770: tile_bytes = tile_width * tile_height * components; -: 771: 94: 772: if (tile_bytes > tile_info.data_size) { branch 0 taken 81% (fallthrough) branch 1 taken 19% 76: 773: tile_info.data_size = tile_bytes; -: 774: } -: 775: 94: 776: if (buffer_size < tile_info.data_size) { branch 0 taken 37% (fallthrough) branch 1 taken 63% -: 777: /* malloc check ok, overflow and tile size sanity check above */ 35: 778: UINT8 *new = realloc (state->buffer, tile_info.data_size); 35: 779: if (!new) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 780: state->errcode = IMAGING_CODEC_MEMORY; #####: 781: state->state = J2K_STATE_FAILED; #####: 782: goto quick_exit; -: 783: } 35: 784: state->buffer = new; 35: 785: buffer_size = tile_info.data_size; -: 786: } -: 787: -: 788: 188: 789: if (!opj_decode_tile_data(codec, call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 790: tile_info.tile_index, 94: 791: (OPJ_BYTE *)state->buffer, -: 792: tile_info.data_size, -: 793: stream)) { #####: 794: state->errcode = IMAGING_CODEC_BROKEN; #####: 795: state->state = J2K_STATE_FAILED; #####: 796: goto quick_exit; -: 797: } -: 798: 94: 799: unpack(image, &tile_info, state->buffer, im); call 0 returned 100% 94: 800: } -: 801: 33: 802: if (!opj_end_decompress(codec, stream)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 803: state->errcode = IMAGING_CODEC_BROKEN; #####: 804: state->state = J2K_STATE_FAILED; #####: 805: goto quick_exit; -: 806: } -: 807: 33: 808: state->state = J2K_STATE_DONE; 33: 809: state->errcode = IMAGING_CODEC_END; -: 810: 33: 811: if (context->pfile) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 812: if(fclose(context->pfile)){ call 0 never executed branch 1 never executed branch 2 never executed #####: 813: context->pfile = NULL; -: 814: } -: 815: } -: 816: -: 817: quick_exit: 33: 818: if (codec) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 819: opj_destroy_codec(codec); call 0 returned 100% -: 820: } 33: 821: if (image) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 822: opj_image_destroy(image); call 0 returned 100% -: 823: } 33: 824: if (stream) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 825: opj_stream_destroy(stream); call 0 returned 100% -: 826: } -: 827: 33: 828: return -1; -: 829:} -: 830: -: 831:int function ImagingJpeg2KDecode called 33 returned 100% blocks executed 63% 33: 832:ImagingJpeg2KDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 833:{ -: 834: 33: 835: if (bytes){ branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 836: state->errcode = IMAGING_CODEC_BROKEN; #####: 837: state->state = J2K_STATE_FAILED; #####: 838: return -1; -: 839: } -: 840: 33: 841: if (state->state == J2K_STATE_DONE || state->state == J2K_STATE_FAILED) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 842: return -1; -: 843: } -: 844: 33: 845: if (state->state == J2K_STATE_START) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 846: state->state = J2K_STATE_DECODING; -: 847: 33: 848: return j2k_decode_entry(im, state); call 0 returned 100% -: 849: } -: 850: #####: 851: if (state->state == J2K_STATE_DECODING) { branch 0 never executed branch 1 never executed #####: 852: state->errcode = IMAGING_CODEC_BROKEN; #####: 853: state->state = J2K_STATE_FAILED; #####: 854: return -1; -: 855: } -: 856: return -1; -: 857:} -: 858: -: 859:/* -------------------------------------------------------------------- */ -: 860:/* Cleanup */ -: 861:/* -------------------------------------------------------------------- */ -: 862: -: 863:int function ImagingJpeg2KDecodeCleanup called 67 returned 100% blocks executed 67% 67: 864:ImagingJpeg2KDecodeCleanup(ImagingCodecState state) { 67: 865: JPEG2KDECODESTATE *context = (JPEG2KDECODESTATE *)state->context; -: 866: 67: 867: if (context->error_msg) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 868: free ((void *)context->error_msg); -: 869: } -: 870: 67: 871: context->error_msg = NULL; -: 872: 67: 873: return -1; -: 874:} -: 875: -: 876:const char * function ImagingJpeg2KVersion called 3 returned 100% blocks executed 100% 3: 877:ImagingJpeg2KVersion(void) -: 878:{ 3: 879: return opj_version(); call 0 returned 100% -: 880:} -: 881: -: 882:#endif /* HAVE_OPENJPEG */ -: 883: -: 884:/* -: 885: * Local Variables: -: 886: * c-basic-offset: 4 -: 887: * End: -: 888: * -: 889: */ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ModeFilter.c.gcov -: 0:Source:src/libImaging/ModeFilter.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ModeFilter.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ModeFilter.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * mode filter -: 6: * -: 7: * history: -: 8: * 2002-06-08 fl Created (based on code from IFUNC95) -: 9: * 2004-10-05 fl Rewritten; use a simpler brute-force algorithm -: 10: * -: 11: * Copyright (c) Secret Labs AB 2002-2004. All rights reserved. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16:#include "Imaging.h" -: 17: -: 18:Imaging function ImagingModeFilter called 20 returned 100% blocks executed 97% 20: 19:ImagingModeFilter(Imaging im, int size) -: 20:{ -: 21: Imaging imOut; -: 22: int x, y, i; -: 23: int xx, yy; -: 24: int maxcount; -: 25: UINT8 maxpixel; -: 26: int histogram[256]; -: 27: 20: 28: if (!im || im->bands != 1 || im->type != IMAGING_TYPE_UINT8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 29: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 30: } -: 31: 20: 32: imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize); call 0 returned 100% 20: 33: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 34: return NULL; -: 35: } -: 36: 20: 37: size = size / 2; -: 38: 1080: 39: for (y = 0; y < imOut->ysize; y++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 1060: 40: UINT8* out = &IMAGING_PIXEL_L(imOut, 0, y); 132240: 41: for (x = 0; x < imOut->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 42: -: 43: /* calculate histogram over current area */ -: 44: -: 45: /* FIXME: brute force! to improve, update the histogram -: 46: incrementally. may also add a "frequent list", like in -: 47: the old implementation, but I'm not sure that's worth -: 48: the added complexity... */ -: 49: 131180: 50: memset(histogram, 0, sizeof(histogram)); 524720: 51: for (yy = y - size; yy <= y + size; yy++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 393540: 52: if (yy >= 0 && yy < imOut->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% 391420: 53: UINT8* in = &IMAGING_PIXEL_L(im, 0, yy); 1565680: 54: for (xx = x - size; xx <= x + size; xx++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 1174260: 55: if (xx >= 0 && xx < imOut->xsize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% 1167980: 56: histogram[in[xx]]++; -: 57: } -: 58: } -: 59: } -: 60: } -: 61: -: 62: /* find most frequent pixel value in this region */ 131180: 63: maxpixel = 0; 131180: 64: maxcount = histogram[maxpixel]; 33582080: 65: for (i = 1; i < 256; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 33450900: 66: if (histogram[i] > maxcount) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 188823: 67: maxcount = histogram[i]; 188823: 68: maxpixel = (UINT8) i; -: 69: } -: 70: } -: 71: 131180: 72: if (maxcount > 2) { branch 0 taken 47% (fallthrough) branch 1 taken 53% 61560: 73: out[x] = maxpixel; -: 74: } else { 69620: 75: out[x] = IMAGING_PIXEL_L(im, x, y); -: 76: } -: 77: -: 78: } -: 79: -: 80: } -: 81: 20: 82: ImagingCopyPalette(imOut, im); call 0 returned 100% -: 83: 20: 84: return imOut; -: 85:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#GetBBox.c.gcov -: 0:Source:src/libImaging/GetBBox.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/GetBBox.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/GetBBox.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * helpers to bounding boxes, min/max values, number of colors, etc. -: 6: * -: 7: * history: -: 8: * 1996-07-22 fl Created -: 9: * 1996-12-30 fl Added projection stuff -: 10: * 1998-07-12 fl Added extrema stuff -: 11: * 2004-09-17 fl Added colors stuff -: 12: * -: 13: * Copyright (c) 1997-2004 by Secret Labs AB. -: 14: * Copyright (c) 1996-2004 by Fredrik Lundh. -: 15: * -: 16: * See the README file for details on usage and redistribution. -: 17: */ -: 18: -: 19: -: 20:#include "Imaging.h" -: 21: -: 22: -: 23:int function ImagingGetBBox called 158 returned 100% blocks executed 100% 158: 24:ImagingGetBBox(Imaging im, int bbox[4]) -: 25:{ -: 26: /* Get the bounding box for any non-zero data in the image.*/ -: 27: -: 28: int x, y; -: 29: int has_data; -: 30: -: 31: /* Initialize bounding box to max values */ 158: 32: bbox[0] = im->xsize; 158: 33: bbox[1] = -1; 158: 34: bbox[2] = bbox[3] = 0; -: 35: -: 36:#define GETBBOX(image, mask)\ -: 37: for (y = 0; y < im->ysize; y++) {\ -: 38: has_data = 0;\ -: 39: for (x = 0; x < im->xsize; x++) {\ -: 40: if (im->image[y][x] & mask) {\ -: 41: has_data = 1;\ -: 42: if (x < bbox[0]) {\ -: 43: bbox[0] = x;\ -: 44: }\ -: 45: if (x >= bbox[2]) {\ -: 46: bbox[2] = x+1;\ -: 47: }\ -: 48: }\ -: 49: }\ -: 50: if (has_data) {\ -: 51: if (bbox[1] < 0) {\ -: 52: bbox[1] = y;\ -: 53: }\ -: 54: bbox[3] = y+1;\ -: 55: }\ -: 56: } -: 57: 158: 58: if (im->image8) { branch 0 taken 15% (fallthrough) branch 1 taken 85% 190004: 59: GETBBOX(image8, 0xff); branch 0 taken 18% (fallthrough) branch 1 taken 82% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 2% (fallthrough) branch 5 taken 98% branch 6 taken 99% branch 7 taken 1% (fallthrough) branch 8 taken 28% (fallthrough) branch 9 taken 72% branch 10 taken 2% (fallthrough) branch 11 taken 98% branch 12 taken 99% (fallthrough) branch 13 taken 1% -: 60: } else { 135: 61: INT32 mask = 0xffffffff; 135: 62: if (im->bands == 3) { branch 0 taken 56% (fallthrough) branch 1 taken 44% 75: 63: ((UINT8*) &mask)[3] = 0; 108: 64: } else if (strcmp(im->mode, "RGBa") == 0 || branch 0 taken 80% (fallthrough) branch 1 taken 20% branch 2 taken 75% (fallthrough) branch 3 taken 25% 84: 65: strcmp(im->mode, "RGBA") == 0 || branch 0 taken 67% (fallthrough) branch 1 taken 33% 60: 66: strcmp(im->mode, "La") == 0 || branch 0 taken 67% (fallthrough) branch 1 taken 33% branch 2 taken 50% (fallthrough) branch 3 taken 50% branch 4 taken 50% (fallthrough) branch 5 taken 50% 36: 67: strcmp(im->mode, "LA") == 0 || branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% 12: 68: strcmp(im->mode, "PA") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 69:#ifdef WORDS_BIGENDIAN -: 70: mask = 0x000000ff; -: 71:#else 60: 72: mask = 0xff000000; -: 73:#endif -: 74: } 4947616: 75: GETBBOX(image32, mask); branch 0 taken 91% (fallthrough) branch 1 taken 9% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 99% branch 7 taken 1% (fallthrough) branch 8 taken 75% (fallthrough) branch 9 taken 25% branch 10 taken 1% (fallthrough) branch 11 taken 99% branch 12 taken 99% (fallthrough) branch 13 taken 1% -: 76: } -: 77: -: 78: /* Check that we got a box */ 158: 79: if (bbox[1] < 0) { branch 0 taken 82% (fallthrough) branch 1 taken 18% -: 80: return 0; /* no data */ -: 81: } -: 82: 129: 83: return 1; /* ok */ -: 84:} -: 85: -: 86: -: 87:int function ImagingGetProjection called 10 returned 100% blocks executed 100% 10: 88:ImagingGetProjection(Imaging im, UINT8* xproj, UINT8* yproj) -: 89:{ -: 90: /* Get projection arrays for non-zero data in the image.*/ -: 91: -: 92: int x, y; -: 93: int has_data; -: 94: -: 95: /* Initialize projection arrays */ 20: 96: memset(xproj, 0, im->xsize); 20: 97: memset(yproj, 0, im->ysize); -: 98: -: 99: #define GETPROJ(image, mask)\ -: 100: for (y = 0; y < im->ysize; y++) {\ -: 101: has_data = 0;\ -: 102: for (x = 0; x < im->xsize; x++) {\ -: 103: if (im->image[y][x] & mask) {\ -: 104: has_data = 1;\ -: 105: xproj[x] = 1;\ -: 106: }\ -: 107: }\ -: 108: if (has_data) {\ -: 109: yproj[y] = 1;\ -: 110: }\ -: 111: } -: 112: 10: 113: if (im->image8) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 400: 114: GETPROJ(image8, 0xff); branch 0 taken 6% (fallthrough) branch 1 taken 94% branch 2 taken 91% branch 3 taken 9% (fallthrough) branch 4 taken 10% (fallthrough) branch 5 taken 90% branch 6 taken 91% (fallthrough) branch 7 taken 9% -: 115: } else { 6: 116: INT32 mask = 0xffffffff; 6: 117: if (im->bands == 3) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 118: ((UINT8*) &mask)[3] = 0; -: 119: } 33168: 120: GETPROJ(image32, mask); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% branch 3 taken 1% (fallthrough) branch 4 taken 88% (fallthrough) branch 5 taken 12% branch 6 taken 98% (fallthrough) branch 7 taken 2% -: 121: } -: 122: 10: 123: return 1; /* ok */ -: 124:} -: 125: -: 126: -: 127:int function ImagingGetExtrema called 29 returned 100% blocks executed 93% 29: 128:ImagingGetExtrema(Imaging im, void *extrema) -: 129:{ -: 130: int x, y; -: 131: INT32 imin, imax; -: 132: FLOAT32 fmin, fmax; -: 133: 29: 134: if (im->bands != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 135: (void) ImagingError_ModeError(); call 0 never executed #####: 136: return -1; /* mismatch */ -: 137: } -: 138: 29: 139: if (!im->xsize || !im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 140: return 0; /* zero size */ -: 141: } -: 142: 29: 143: switch (im->type) { branch 0 taken 62% branch 1 taken 14% branch 2 taken 17% branch 3 taken 7% branch 4 taken 0% -: 144: case IMAGING_TYPE_UINT8: 18: 145: imin = imax = im->image8[0][0]; 2322: 146: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2304: 147: UINT8* in = im->image8[y]; 297216: 148: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 294912: 149: if (imin > in[x]) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 97: 150: imin = in[x]; 294815: 151: } else if (imax < in[x]) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 119: 152: imax = in[x]; -: 153: } -: 154: } -: 155: } 18: 156: ((UINT8*) extrema)[0] = (UINT8) imin; 18: 157: ((UINT8*) extrema)[1] = (UINT8) imax; 18: 158: break; -: 159: case IMAGING_TYPE_INT32: 4: 160: imin = imax = im->image32[0][0]; 488: 161: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 484: 162: INT32* in = im->image32[y]; 51636: 163: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 51152: 164: if (imin > in[x]) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 129: 165: imin = in[x]; 51023: 166: } else if (imax < in[x]) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 39: 167: imax = in[x]; -: 168: } -: 169: } -: 170: } 4: 171: memcpy(extrema, &imin, sizeof(imin)); 4: 172: memcpy(((char*)extrema) + sizeof(imin), &imax, sizeof(imax)); -: 173: break; -: 174: case IMAGING_TYPE_FLOAT32: 5: 175: fmin = fmax = ((FLOAT32*) im->image32[0])[0]; 645: 176: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 640: 177: FLOAT32* in = (FLOAT32*) im->image32[y]; 82560: 178: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 81920: 179: if (fmin > in[x]) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 52: 180: fmin = in[x]; 81868: 181: } else if (fmax < in[x]) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 64: 182: fmax = in[x]; -: 183: } -: 184: } -: 185: } 5: 186: memcpy(extrema, &fmin, sizeof(fmin)); 5: 187: memcpy(((char*)extrema) + sizeof(fmin), &fmax, sizeof(fmax)); -: 188: break; -: 189: case IMAGING_TYPE_SPECIAL: 2: 190: if (strcmp(im->mode, "I;16") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 191: UINT16 v; 2: 192: UINT8* pixel = *im->image8; -: 193:#ifdef WORDS_BIGENDIAN -: 194: v = pixel[0] + (pixel[1] << 8); -: 195:#else 2: 196: memcpy(&v, pixel, sizeof(v)); -: 197:#endif 2: 198: imin = imax = v; 162: 199: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 17408: 200: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 17408: 201: pixel = im->image[y] + x * sizeof(v); -: 202:#ifdef WORDS_BIGENDIAN -: 203: v = pixel[0] + (pixel[1] << 8); -: 204:#else 17408: 205: memcpy(&v, pixel, sizeof(v)); -: 206:#endif 17408: 207: if (imin > v) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 23: 208: imin = v; 17385: 209: } else if (imax < v) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 18: 210: imax = v; -: 211: } -: 212: } -: 213: } 2: 214: v = (UINT16) imin; 2: 215: memcpy(extrema, &v, sizeof(v)); 2: 216: v = (UINT16) imax; 4: 217: memcpy(((char*)extrema) + sizeof(v), &v, sizeof(v)); -: 218: break; -: 219: } -: 220: /* FALL THROUGH */ -: 221: default: #####: 222: (void) ImagingError_ModeError(); call 0 never executed #####: 223: return -1; -: 224: } -: 225: return 1; /* ok */ -: 226:} -: 227: -: 228: -: 229:/* static ImagingColorItem* getcolors8(Imaging im, int maxcolors, int* size);*/ -: 230:static ImagingColorItem* getcolors32(Imaging im, int maxcolors, int* size); -: 231: -: 232:ImagingColorItem* function ImagingGetColors called 20 returned 100% blocks executed 100% 20: 233:ImagingGetColors(Imaging im, int maxcolors, int* size) -: 234:{ -: 235: /* FIXME: add support for 8-bit images */ 20: 236: return getcolors32(im, maxcolors, size); call 0 returned 100% -: 237:} -: 238: -: 239:static ImagingColorItem* function getcolors32 called 20 returned 100% blocks executed 93% 20: 240:getcolors32(Imaging im, int maxcolors, int* size) -: 241:{ -: 242: unsigned int h; -: 243: unsigned int i, incr; -: 244: int colors; -: 245: INT32 pixel_mask; -: 246: int x, y; -: 247: ImagingColorItem* table; -: 248: ImagingColorItem* v; -: 249: -: 250: unsigned int code_size; -: 251: unsigned int code_poly; -: 252: unsigned int code_mask; -: 253: -: 254: /* note: the hash algorithm used here is based on the dictionary -: 255: code in Python 2.1.3; the exact implementation is borrowed from -: 256: Python's Unicode property database (written by yours truly) /F */ -: 257: -: 258: static int SIZES[] = { -: 259: 4,3, 8,3, 16,3, 32,5, 64,3, 128,3, 256,29, 512,17, 1024,9, 2048,5, -: 260: 4096,83, 8192,27, 16384,43, 32768,3, 65536,45, 131072,9, 262144,39, -: 261: 524288,39, 1048576,9, 2097152,5, 4194304,3, 8388608,33, 16777216,27, -: 262: 33554432,9, 67108864,71, 134217728,39, 268435456,9, 536870912,5, -: 263: 1073741824,83, 0 -: 264: }; -: 265: 20: 266: code_size = code_poly = code_mask = 0; -: 267: 168: 268: for (i = 0; SIZES[i]; i += 2) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 168: 269: if (SIZES[i] > maxcolors) { branch 0 taken 12% (fallthrough) branch 1 taken 88% 20: 270: code_size = SIZES[i]; 20: 271: code_poly = SIZES[i+1]; 20: 272: code_mask = code_size - 1; 20: 273: break; -: 274: } -: 275: } -: 276: -: 277: /* printf("code_size=%d\n", code_size); */ -: 278: /* printf("code_poly=%d\n", code_poly); */ -: 279: 20: 280: if (!code_size) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 281: return ImagingError_MemoryError(); /* just give up */ call 0 never executed -: 282: } -: 283: 20: 284: if (!im->image32) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 285: return ImagingError_ModeError(); call 0 never executed -: 286: } -: 287: 20: 288: table = calloc(code_size + 1, sizeof(ImagingColorItem)); 20: 289: if (!table) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 290: return ImagingError_MemoryError(); call 0 never executed -: 291: } -: 292: 20: 293: pixel_mask = 0xffffffff; 20: 294: if (im->bands == 3) { branch 0 taken 55% (fallthrough) branch 1 taken 45% 11: 295: ((UINT8*) &pixel_mask)[3] = 0; -: 296: } -: 297: -: 298: colors = 0; -: 299: 1625: 300: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1631: 301: INT32* p = im->image32[y]; 204775: 302: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 203150: 303: INT32 pixel = p[x] & pixel_mask; 203150: 304: h = (pixel); /* null hashing */ 203150: 305: i = (~h) & code_mask; 203150: 306: v = &table[i]; 203150: 307: if (!v->count) { branch 0 taken 17% (fallthrough) branch 1 taken 83% -: 308: /* add to table */ 34844: 309: if (colors++ == maxcolors) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 310: goto overflow; -: 311: } 34842: 312: v->x = x; v->y = y; 34842: 313: v->pixel = pixel; 34842: 314: v->count = 1; 34842: 315: continue; 168306: 316: } else if (v->pixel == pixel) { branch 0 taken 52% (fallthrough) branch 1 taken 48% 87972: 317: v->count++; 87972: 318: continue; -: 319: } 80334: 320: incr = (h ^ (h >> 3)) & code_mask; 80334: 321: if (!incr) { branch 0 taken 20% (fallthrough) branch 1 taken 80% 16245: 322: incr = code_mask; -: 323: } -: 324: for (;;) { 1945441: 325: i = (i + incr) & code_mask; 1945441: 326: v = &table[i]; 1945441: 327: if (!v->count) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 328: /* add to table */ 24640: 329: if (colors++ == maxcolors) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 330: goto overflow; -: 331: } 24636: 332: v->x = x; v->y = y; 24636: 333: v->pixel = pixel; 24636: 334: v->count = 1; 24636: 335: break; 1920801: 336: } else if (v->pixel == pixel) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 55694: 337: v->count++; 55694: 338: break; -: 339: } 1865107: 340: incr = incr << 1; 1865107: 341: if (incr > code_mask) { branch 0 taken 13% branch 1 taken 87% (fallthrough) 1619858: 342: incr = incr ^ code_poly; -: 343: } -: 344: } -: 345: } -: 346: } -: 347: -: 348:overflow: -: 349: -: 350: /* pack the table */ 283220: 351: for (x = y = 0; x < (int) code_size; x++) branch 0 taken 99% branch 1 taken 1% (fallthrough) 283200: 352: if (table[x].count) { branch 0 taken 21% (fallthrough) branch 1 taken 79% 59478: 353: if (x != y) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 59443: 354: table[y] = table[x]; -: 355: } 59478: 356: y++; -: 357: } 20: 358: table[y].count = 0; /* mark end of table */ -: 359: 20: 360: *size = colors; -: 361: 20: 362: return table; -: 363:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#AlphaComposite.c.gcov -: 0:Source:src/libImaging/AlphaComposite.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/AlphaComposite.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/AlphaComposite.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * Alpha composite imSrc over imDst. -: 6: * https://en.wikipedia.org/wiki/Alpha_compositing -: 7: * -: 8: * See the README file for details on usage and redistribution. -: 9: */ -: 10: -: 11: -: 12:#include "Imaging.h" -: 13: -: 14:#define PRECISION_BITS 7 -: 15: -: 16:typedef struct -: 17:{ -: 18: UINT8 r; -: 19: UINT8 g; -: 20: UINT8 b; -: 21: UINT8 a; -: 22:} rgba8; -: 23: -: 24: -: 25: -: 26:Imaging function ImagingAlphaComposite called 6 returned 100% blocks executed 91% 6: 27:ImagingAlphaComposite(Imaging imDst, Imaging imSrc) -: 28:{ -: 29: Imaging imOut; -: 30: int x, y; -: 31: -: 32: /* Check arguments */ 12: 33: if (!imDst || !imSrc || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% 12: 34: strcmp(imDst->mode, "RGBA") || branch 0 taken 100% (fallthrough) branch 1 taken 0% 12: 35: imDst->type != IMAGING_TYPE_UINT8 || branch 0 taken 0% (fallthrough) branch 1 taken 100% 6: 36: imDst->bands != 4) { #####: 37: return ImagingError_ModeError(); call 0 never executed -: 38: } -: 39: 12: 40: if (strcmp(imDst->mode, imSrc->mode) || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 6: 41: imDst->type != imSrc->type || 6: 42: imDst->bands != imSrc->bands || branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 43: imDst->xsize != imSrc->xsize || branch 0 taken 0% (fallthrough) branch 1 taken 100% 6: 44: imDst->ysize != imSrc->ysize) { #####: 45: return ImagingError_Mismatch(); call 0 never executed -: 46: } -: 47: 6: 48: imOut = ImagingNewDirty(imDst->mode, imDst->xsize, imDst->ysize); call 0 returned 100% 6: 49: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 50: return NULL; -: 51: } -: 52: 580: 53: for (y = 0; y < imDst->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 580: 54: rgba8* dst = (rgba8*) imDst->image[y]; 580: 55: rgba8* src = (rgba8*) imSrc->image[y]; 580: 56: rgba8* out = (rgba8*) imOut->image[y]; -: 57: 64852: 58: for (x = 0; x < imDst->xsize; x ++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 64272: 59: if (src->a == 0) { branch 0 taken 5% (fallthrough) branch 1 taken 95% -: 60: // Copy 4 bytes at once. 3300: 61: *out = *dst; -: 62: } else { -: 63: // Integer implementation with increased precision. -: 64: // Each variable has extra meaningful bits. -: 65: // Divisions are rounded. -: 66: -: 67: UINT32 tmpr, tmpg, tmpb; 60972: 68: UINT32 blend = dst->a * (255 - src->a); 60972: 69: UINT32 outa255 = src->a * 255 + blend; -: 70: // There we use 7 bits for precision. -: 71: // We could use more, but we go beyond 32 bits. 60972: 72: UINT32 coef1 = src->a * 255 * 255 * (1<r * coef1 + dst->r * coef2; 60972: 76: tmpg = src->g * coef1 + dst->g * coef2; 60972: 77: tmpb = src->b * coef1 + dst->b * coef2; 60972: 78: out->r = SHIFTFORDIV255(tmpr + (0x80<> PRECISION_BITS; 60972: 79: out->g = SHIFTFORDIV255(tmpg + (0x80<> PRECISION_BITS; 60972: 80: out->b = SHIFTFORDIV255(tmpb + (0x80<> PRECISION_BITS; 60972: 81: out->a = SHIFTFORDIV255(outa255 + 0x80); -: 82: } -: 83: 64272: 84: dst++; src++; out++; -: 85: } -: 86: -: 87: } -: 88: -: 89: return imOut; -: 90:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#FliDecode.c.gcov -: 0:Source:src/libImaging/FliDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/FliDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/FliDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for Autodesk Animator FLI/FLC animations -: 6: * -: 7: * history: -: 8: * 97-01-03 fl Created -: 9: * 97-01-17 fl Added SS2 support (FLC) -: 10: * -: 11: * Copyright (c) Fredrik Lundh 1997. -: 12: * Copyright (c) Secret Labs AB 1997. -: 13: * -: 14: * See the README file for information on usage and redistribution. -: 15: */ -: 16: -: 17: -: 18:#include "Imaging.h" -: 19: -: 20: -: 21:#define I16(ptr)\ -: 22: ((ptr)[0] + ((ptr)[1] << 8)) -: 23: -: 24:#define I32(ptr)\ -: 25: ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) -: 26: -: 27:#define ERR_IF_DATA_OOB(offset) \ -: 28: if ((data + (offset)) > ptr + bytes) {\ -: 29: state->errcode = IMAGING_CODEC_OVERRUN; \ -: 30: return -1; \ -: 31: } -: 32: -: 33:int function ImagingFliDecode called 444 returned 100% blocks executed 45% 444: 34:ImagingFliDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 35:{ -: 36: UINT8* ptr; -: 37: int framesize; -: 38: int c, chunks, advance; -: 39: int l, lines; 444: 40: int i, j, x = 0, y, ymax; -: 41: -: 42: /* If not even the chunk size is present, we'd better leave */ -: 43: 444: 44: if (bytes < 4) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 45: return 0; -: 46: } -: 47: -: 48: /* We don't decode anything unless we have a full chunk in the -: 49: input buffer */ -: 50: 443: 51: ptr = buf; -: 52: 443: 53: framesize = I32(ptr); -: 54: if (framesize < I32(ptr)) { -: 55: return 0; -: 56: } -: 57: -: 58: /* Make sure this is a frame chunk. The Python driver takes -: 59: case of other chunk types. */ -: 60: 443: 61: if (bytes < 8) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 62: state->errcode = IMAGING_CODEC_OVERRUN; 1: 63: return -1; -: 64: } 442: 65: if (I16(ptr+4) != 0xF1FA) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 66: state->errcode = IMAGING_CODEC_UNKNOWN; #####: 67: return -1; -: 68: } -: 69: 442: 70: chunks = I16(ptr+6); 442: 71: ptr += 16; 442: 72: bytes -= 16; -: 73: -: 74: /* Process subchunks */ 660: 75: for (c = 0; c < chunks; c++) { branch 0 taken 33% branch 1 taken 67% (fallthrough) -: 76: UINT8* data; 219: 77: if (bytes < 10) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 78: state->errcode = IMAGING_CODEC_OVERRUN; #####: 79: return -1; -: 80: } 219: 81: data = ptr + 6; 219: 82: switch (I16(ptr+4)) { branch 0 taken 4% branch 1 taken 0% branch 2 taken 0% branch 3 taken 91% branch 4 taken 0% branch 5 taken 0% branch 6 taken 5% -: 83: case 4: case 11: -: 84: /* FLI COLOR chunk */ -: 85: break; /* ignored; handled by Python code */ -: 86: case 7: -: 87: /* FLI SS2 chunk (word delta) */ -: 88: /* OOB ok, we've got 4 bytes min on entry */ #####: 89: lines = I16(data); data += 2; #####: 90: for (l = y = 0; l < lines && y < state->ysize; l++, y++) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 91: UINT8* local_buf = (UINT8*) im->image[y]; -: 92: int p, packets; #####: 93: ERR_IF_DATA_OOB(2) branch 0 never executed branch 1 never executed #####: 94: packets = I16(data); data += 2; #####: 95: while (packets & 0x8000) { branch 0 never executed branch 1 never executed -: 96: /* flag word */ #####: 97: if (packets & 0x4000) { branch 0 never executed branch 1 never executed #####: 98: y += 65536 - packets; /* skip lines */ #####: 99: if (y >= state->ysize) { branch 0 never executed branch 1 never executed #####: 100: state->errcode = IMAGING_CODEC_OVERRUN; #####: 101: return -1; -: 102: } #####: 103: local_buf = (UINT8*) im->image[y]; -: 104: } else { -: 105: /* store last byte (used if line width is odd) */ #####: 106: local_buf[state->xsize-1] = (UINT8) packets; -: 107: } #####: 108: ERR_IF_DATA_OOB(2) branch 0 never executed branch 1 never executed #####: 109: packets = I16(data); data += 2; -: 110: } #####: 111: for (p = x = 0; p < packets; p++) { branch 0 never executed branch 1 never executed #####: 112: ERR_IF_DATA_OOB(2) branch 0 never executed branch 1 never executed #####: 113: x += data[0]; /* pixel skip */ #####: 114: if (data[1] >= 128) { branch 0 never executed branch 1 never executed #####: 115: ERR_IF_DATA_OOB(4) branch 0 never executed branch 1 never executed #####: 116: i = 256-data[1]; /* run */ #####: 117: if (x + i + i > state->xsize) { branch 0 never executed branch 1 never executed -: 118: break; -: 119: } #####: 120: for (j = 0; j < i; j++) { branch 0 never executed branch 1 never executed #####: 121: local_buf[x++] = data[2]; #####: 122: local_buf[x++] = data[3]; -: 123: } -: 124: data += 2 + 2; -: 125: } else { #####: 126: i = 2 * (int) data[1]; /* chunk */ #####: 127: if (x + i > state->xsize) { branch 0 never executed branch 1 never executed -: 128: break; -: 129: } #####: 130: ERR_IF_DATA_OOB(2+i) branch 0 never executed branch 1 never executed #####: 131: memcpy(local_buf + x, data + 2, i); #####: 132: data += 2 + i; #####: 133: x += i; -: 134: } -: 135: } #####: 136: if (p < packets) { branch 0 never executed branch 1 never executed -: 137: break; /* didn't process all packets */ -: 138: } -: 139: } #####: 140: if (l < lines) { branch 0 never executed branch 1 never executed -: 141: /* didn't process all lines */ #####: 142: state->errcode = IMAGING_CODEC_OVERRUN; #####: 143: return -1; -: 144: } -: 145: break; -: 146: case 12: -: 147: /* FLI LC chunk (byte delta) */ -: 148: /* OOB Check ok, we have 4 bytes min here */ 200: 149: y = I16(data); ymax = y + I16(data+2); data += 4; 4518: 150: for (; y < ymax && y < state->ysize; y++) { branch 0 taken 96% (fallthrough) branch 1 taken 4% branch 2 taken 100% branch 3 taken 0% (fallthrough) 4318: 151: UINT8* out = (UINT8*) im->image[y]; 4318: 152: ERR_IF_DATA_OOB(1) branch 0 taken 0% (fallthrough) branch 1 taken 100% 4318: 153: int p, packets = *data++; 27803: 154: for (p = x = 0; p < packets; p++, x += i) { branch 0 taken 84% branch 1 taken 16% (fallthrough) 23485: 155: ERR_IF_DATA_OOB(2) branch 0 taken 0% (fallthrough) branch 1 taken 100% 23485: 156: x += data[0]; /* skip pixels */ 23485: 157: if (data[1] & 0x80) { branch 0 taken 53% (fallthrough) branch 1 taken 47% 12556: 158: i = 256-data[1]; /* run */ 12556: 159: if (x + i > state->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 160: break; -: 161: } 12556: 162: ERR_IF_DATA_OOB(3) branch 0 taken 0% (fallthrough) branch 1 taken 100% 25112: 163: memset(out + x, data[2], i); 12556: 164: data += 3; -: 165: } else { 10929: 166: i = data[1]; /* chunk */ 10929: 167: if (x + i > state->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 168: break; -: 169: } 10929: 170: ERR_IF_DATA_OOB(2+i) branch 0 taken 0% (fallthrough) branch 1 taken 100% 21858: 171: memcpy(out + x, data + 2, i); 10929: 172: data += i + 2; -: 173: } -: 174: } 4318: 175: if (p < packets) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 176: break; /* didn't process all packets */ -: 177: } -: 178: } 200: 179: if (y < ymax) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 180: /* didn't process all lines */ #####: 181: state->errcode = IMAGING_CODEC_OVERRUN; #####: 182: return -1; -: 183: } -: 184: break; -: 185: case 13: -: 186: /* FLI BLACK chunk */ #####: 187: for (y = 0; y < state->ysize; y++) { branch 0 never executed branch 1 never executed #####: 188: memset(im->image[y], 0, state->xsize); -: 189: } -: 190: break; -: 191: case 15: -: 192: /* FLI BRUN chunk */ -: 193: /* OOB, ok, we've got 4 bytes min on entry */ 1312: 194: for (y = 0; y < state->ysize; y++) { branch 0 taken 99% branch 1 taken 1% 1312: 195: UINT8* out = (UINT8*) im->image[y]; 1312: 196: data += 1; /* ignore packetcount byte */ 15620: 197: for (x = 0; x < state->xsize; x += i) { branch 0 taken 92% branch 1 taken 8% (fallthrough) 14308: 198: ERR_IF_DATA_OOB(2) branch 0 taken 0% (fallthrough) branch 1 taken 100% 14308: 199: if (data[0] & 0x80) { branch 0 taken 39% (fallthrough) branch 1 taken 61% 5532: 200: i = 256 - data[0]; 5532: 201: if (x + i > state->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 202: break; /* safety first */ -: 203: } 5532: 204: ERR_IF_DATA_OOB(i+1) branch 0 taken 0% (fallthrough) branch 1 taken 100% 11064: 205: memcpy(out + x, data + 1, i); 5532: 206: data += i + 1; -: 207: } else { 8776: 208: i = data[0]; 8776: 209: if (x + i > state->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 210: break; /* safety first */ -: 211: } 17552: 212: memset(out + x, data[1], i); 8776: 213: data += 2; -: 214: } -: 215: } 1312: 216: if (x != state->xsize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 217: /* didn't unpack whole line */ #####: 218: state->errcode = IMAGING_CODEC_OVERRUN; #####: 219: return -1; -: 220: } -: 221: } -: 222: break; -: 223: case 16: -: 224: /* COPY chunk */ #####: 225: if (state->xsize > bytes/state->ysize) { branch 0 never executed branch 1 never executed -: 226: /* not enough data for frame */ #####: 227: return ptr - buf; /* bytes consumed */ -: 228: } #####: 229: for (y = 0; y < state->ysize; y++) { branch 0 never executed branch 1 never executed #####: 230: UINT8* local_buf = (UINT8*) im->image[y]; #####: 231: memcpy(local_buf, data, state->xsize); #####: 232: data += state->xsize; -: 233: } -: 234: break; -: 235: case 18: -: 236: /* PSTAMP chunk */ -: 237: break; /* ignored */ -: 238: default: -: 239: /* unknown chunk */ -: 240: /* printf("unknown FLI/FLC chunk: %d\n", I16(ptr+4)); */ #####: 241: state->errcode = IMAGING_CODEC_UNKNOWN; #####: 242: return -1; -: 243: } 219: 244: advance = I32(ptr); 219: 245: if (advance < 0 || advance > bytes) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 1% (fallthrough) branch 3 taken 99% 1: 246: state->errcode = IMAGING_CODEC_OVERRUN; 1: 247: return -1; -: 248: } 218: 249: ptr += advance; 218: 250: bytes -= advance; -: 251: } -: 252: -: 253: return -1; /* end of frame */ -: 254:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#RawDecode.c.gcov -: 0:Source:src/libImaging/RawDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/RawDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/RawDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for raw (uncompressed) image data -: 6: * -: 7: * history: -: 8: * 96-03-07 fl rewritten -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1996. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19:#include "Raw.h" -: 20: -: 21: -: 22:int function ImagingRawDecode called 15300 returned 100% blocks executed 95% 15300: 23:ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 24:{ -: 25: enum { LINE = 1, SKIP }; 15300: 26: RAWSTATE* rawstate = state->context; -: 27: -: 28: UINT8* ptr; -: 29: 15300: 30: if (state->state == 0) { branch 0 taken 97% (fallthrough) branch 1 taken 3% -: 31: -: 32: /* Initialize context variables */ -: 33: -: 34: /* get size of image data and padding */ 14799: 35: state->bytes = (state->xsize * state->bits + 7) / 8; 14799: 36: if (rawstate->stride) { branch 0 taken 91% (fallthrough) branch 1 taken 9% 13424: 37: rawstate->skip = rawstate->stride - state->bytes; 13424: 38: if (rawstate->skip < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 39: state->errcode = IMAGING_CODEC_CONFIG; 1: 40: return -1; -: 41: } -: 42: } else { 1375: 43: rawstate->skip = 0; -: 44: } -: 45: -: 46: /* check image orientation */ 14798: 47: if (state->ystep < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 98: 48: state->y = state->ysize-1; 98: 49: state->ystep = -1; -: 50: } else { 14700: 51: state->ystep = 1; -: 52: } -: 53: 14798: 54: state->state = LINE; -: 55: -: 56: } -: 57: -: 58: ptr = buf; -: 59: -: 60: for (;;) { -: 61: 425530: 62: if (state->state == SKIP) { branch 0 taken 96% (fallthrough) branch 1 taken 4% -: 63: -: 64: /* Skip padding between lines */ -: 65: 410231: 66: if (bytes < rawstate->skip) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 67: return ptr - buf; -: 68: } -: 69: 410231: 70: ptr += rawstate->skip; 410231: 71: bytes -= rawstate->skip; -: 72: 410231: 73: state->state = LINE; -: 74: -: 75: } -: 76: 425530: 77: if (bytes < state->bytes) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 506: 78: return ptr - buf; -: 79: } -: 80: -: 81: /* Unpack data */ 850048: 82: state->shuffle((UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 425024: 83: state->xoff * im->pixelsize, ptr, state->xsize); -: 84: 425024: 85: ptr += state->bytes; 425024: 86: bytes -= state->bytes; -: 87: 425024: 88: state->y += state->ystep; -: 89: 425024: 90: if (state->y < 0 || state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 97% (fallthrough) branch 3 taken 3% -: 91: /* End of file (errcode = 0) */ -: 92: return -1; -: 93: } -: 94: 410231: 95: state->state = SKIP; -: 96: 410231: 97: } -: 98: -: 99:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Bands.c.gcov -: 0:Source:src/libImaging/Bands.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Bands.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Bands.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * stuff to extract and paste back individual bands -: 6: * -: 7: * history: -: 8: * 1996-03-20 fl Created -: 9: * 1997-08-27 fl Fixed putband for single band targets. -: 10: * 2003-09-26 fl Fixed getband/putband for 2-band images (LA, PA). -: 11: * -: 12: * Copyright (c) 1997-2003 by Secret Labs AB. -: 13: * Copyright (c) 1996-1997 by Fredrik Lundh. -: 14: * -: 15: * See the README file for details on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21: -: 22:Imaging function ImagingGetBand called 159 returned 100% blocks executed 91% 159: 23:ImagingGetBand(Imaging imIn, int band) -: 24:{ -: 25: Imaging imOut; -: 26: int x, y; -: 27: -: 28: /* Check arguments */ 159: 29: if (!imIn || imIn->type != IMAGING_TYPE_UINT8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 30: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 31: } -: 32: 159: 33: if (band < 0 || band >= imIn->bands) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 2: 34: return (Imaging) ImagingError_ValueError("band index out of range"); call 0 returned 100% -: 35: } -: 36: -: 37: /* Shortcuts */ 157: 38: if (imIn->bands == 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 39: return ImagingCopy(imIn); call 0 never executed -: 40: } -: 41: -: 42: /* Special case for LXXA etc */ 157: 43: if (imIn->bands == 2 && band == 1) { branch 0 taken 3% (fallthrough) branch 1 taken 97% branch 2 taken 75% (fallthrough) branch 3 taken 25% 3: 44: band = 3; -: 45: } -: 46: 157: 47: imOut = ImagingNewDirty("L", imIn->xsize, imIn->ysize); call 0 returned 100% 157: 48: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 49: return NULL; -: 50: } -: 51: -: 52: /* Extract band from image */ 14969: 53: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 14969: 54: UINT8* in = (UINT8*) imIn->image[y] + band; 14969: 55: UINT8* out = imOut->image8[y]; 14969: 56: x = 0; 480837: 57: for (; x < imIn->xsize - 3; x += 4) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 465868: 58: UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); 931736: 59: memcpy(out + x, &v, sizeof(v)); 465868: 60: in += 16; -: 61: } 955: 62: for (; x < imIn->xsize; x++) { branch 0 taken 6% branch 1 taken 94% (fallthrough) 955: 63: out[x] = *in; 955: 64: in += 4; -: 65: } -: 66: } -: 67: -: 68: return imOut; -: 69:} -: 70: -: 71: -: 72:int function ImagingSplit called 1221 returned 100% blocks executed 83% 1221: 73:ImagingSplit(Imaging imIn, Imaging bands[4]) -: 74:{ -: 75: int i, j, x, y; -: 76: -: 77: /* Check arguments */ 1221: 78: if (!imIn || imIn->type != IMAGING_TYPE_UINT8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 79: (void) ImagingError_ModeError(); call 0 never executed #####: 80: return 0; -: 81: } -: 82: -: 83: /* Shortcuts */ 1221: 84: if (imIn->bands == 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 85: bands[0] = ImagingCopy(imIn); call 0 never executed #####: 86: return imIn->bands; -: 87: } -: 88: 3788: 89: for (i = 0; i < imIn->bands; i++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 3788: 90: bands[i] = ImagingNewDirty("L", imIn->xsize, imIn->ysize); call 0 returned 100% 3788: 91: if ( ! bands[i]) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 92: for (j = 0; j < i; ++j) { branch 0 never executed branch 1 never executed #####: 93: ImagingDelete(bands[j]); call 0 never executed -: 94: } -: 95: return 0; -: 96: } -: 97: } -: 98: -: 99: /* Extract bands from image */ 1221: 100: if (imIn->bands == 2) { branch 0 taken 11% (fallthrough) branch 1 taken 89% 25680: 101: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% 25680: 102: UINT8* in = (UINT8*) imIn->image[y]; 25680: 103: UINT8* out0 = bands[0]->image8[y]; 25680: 104: UINT8* out1 = bands[1]->image8[y]; 25680: 105: x = 0; 1614876: 106: for (; x < imIn->xsize - 3; x += 4) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 1589196: 107: UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); 3178392: 108: memcpy(out0 + x, &v, sizeof(v)); 1589196: 109: v = MAKE_UINT32(in[0+3], in[4+3], in[8+3], in[12+3]); 3178392: 110: memcpy(out1 + x, &v, sizeof(v)); 1589196: 111: in += 16; -: 112: } 24504: 113: for (; x < imIn->xsize; x++) { branch 0 taken 49% branch 1 taken 51% (fallthrough) 24504: 114: out0[x] = in[0]; 24504: 115: out1[x] = in[3]; 24504: 116: in += 4; -: 117: } -: 118: } 1081: 119: } else if (imIn->bands == 3) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 143664: 120: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% 143664: 121: UINT8* in = (UINT8*) imIn->image[y]; 143664: 122: UINT8* out0 = bands[0]->image8[y]; 143664: 123: UINT8* out1 = bands[1]->image8[y]; 143664: 124: UINT8* out2 = bands[2]->image8[y]; 143664: 125: x = 0; 11915002: 126: for (; x < imIn->xsize - 3; x += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 11771338: 127: UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); 23542676: 128: memcpy(out0 + x, &v, sizeof(v)); 11771338: 129: v = MAKE_UINT32(in[0+1], in[4+1], in[8+1], in[12+1]); 23542676: 130: memcpy(out1 + x, &v, sizeof(v)); 11771338: 131: v = MAKE_UINT32(in[0+2], in[4+2], in[8+2], in[12+2]); 23542676: 132: memcpy(out2 + x, &v, sizeof(v)); 11771338: 133: in += 16; -: 134: } 21510: 135: for (; x < imIn->xsize; x++) { branch 0 taken 13% branch 1 taken 87% (fallthrough) 21510: 136: out0[x] = in[0]; 21510: 137: out1[x] = in[1]; 21510: 138: out2[x] = in[2]; 21510: 139: in += 4; -: 140: } -: 141: } -: 142: } else { 30998: 143: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 30998: 144: UINT8* in = (UINT8*) imIn->image[y]; 30998: 145: UINT8* out0 = bands[0]->image8[y]; 30998: 146: UINT8* out1 = bands[1]->image8[y]; 30998: 147: UINT8* out2 = bands[2]->image8[y]; 30998: 148: UINT8* out3 = bands[3]->image8[y]; 30998: 149: x = 0; 1833604: 150: for (; x < imIn->xsize - 3; x += 4) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 1802606: 151: UINT32 v = MAKE_UINT32(in[0], in[4], in[8], in[12]); 3605212: 152: memcpy(out0 + x, &v, sizeof(v)); 1802606: 153: v = MAKE_UINT32(in[0+1], in[4+1], in[8+1], in[12+1]); 3605212: 154: memcpy(out1 + x, &v, sizeof(v)); 1802606: 155: v = MAKE_UINT32(in[0+2], in[4+2], in[8+2], in[12+2]); 3605212: 156: memcpy(out2 + x, &v, sizeof(v)); 1802606: 157: v = MAKE_UINT32(in[0+3], in[4+3], in[8+3], in[12+3]); 3605212: 158: memcpy(out3 + x, &v, sizeof(v)); 1802606: 159: in += 16; -: 160: } 30178: 161: for (; x < imIn->xsize; x++) { branch 0 taken 49% branch 1 taken 51% (fallthrough) 30178: 162: out0[x] = in[0]; 30178: 163: out1[x] = in[1]; 30178: 164: out2[x] = in[2]; 30178: 165: out3[x] = in[3]; 30178: 166: in += 4; -: 167: } -: 168: } -: 169: } -: 170: 1221: 171: return imIn->bands; -: 172:} -: 173: -: 174: -: 175:Imaging function ImagingPutBand called 61 returned 100% blocks executed 83% 61: 176:ImagingPutBand(Imaging imOut, Imaging imIn, int band) -: 177:{ -: 178: int x, y; -: 179: -: 180: /* Check arguments */ 61: 181: if (!imIn || imIn->bands != 1 || !imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 182: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 183: } -: 184: 61: 185: if (band < 0 || band >= imOut->bands) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 186: return (Imaging) ImagingError_ValueError("band index out of range"); call 0 never executed -: 187: } -: 188: 122: 189: if (imIn->type != imOut->type || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 122: 190: imIn->xsize != imOut->xsize || branch 0 taken 0% (fallthrough) branch 1 taken 100% 61: 191: imIn->ysize != imOut->ysize) { #####: 192: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 193: } -: 194: -: 195: /* Shortcuts */ 61: 196: if (imOut->bands == 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 197: return ImagingCopy2(imOut, imIn); call 0 never executed -: 198: } -: 199: -: 200: /* Special case for LXXA etc */ 61: 201: if (imOut->bands == 2 && band == 1) { branch 0 taken 2% (fallthrough) branch 1 taken 98% branch 2 taken 100% (fallthrough) branch 3 taken 0% 1: 202: band = 3; -: 203: } -: 204: -: 205: /* Insert band into image */ 5444: 206: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5383: 207: UINT8* in = imIn->image8[y]; 5383: 208: UINT8* out = (UINT8*) imOut->image[y] + band; 1039368: 209: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1033985: 210: *out = in[x]; 1033985: 211: out += 4; -: 212: } -: 213: } -: 214: -: 215: return imOut; -: 216:} -: 217: -: 218:Imaging function ImagingFillBand called 20 returned 100% blocks executed 89% 20: 219:ImagingFillBand(Imaging imOut, int band, int color) -: 220:{ -: 221: int x, y; -: 222: -: 223: /* Check arguments */ 20: 224: if (!imOut || imOut->type != IMAGING_TYPE_UINT8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 225: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 226: } -: 227: 20: 228: if (band < 0 || band >= imOut->bands) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 229: return (Imaging) ImagingError_ValueError("band index out of range"); call 0 never executed -: 230: } -: 231: -: 232: /* Special case for LXXA etc */ 20: 233: if (imOut->bands == 2 && band == 1) { branch 0 taken 10% (fallthrough) branch 1 taken 90% branch 2 taken 100% (fallthrough) branch 3 taken 0% 2: 234: band = 3; -: 235: } -: 236: 20: 237: color = CLIP8(color); branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 238: -: 239: /* Insert color into image */ 734: 240: for (y = 0; y < imOut->ysize; y++) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 714: 241: UINT8* out = (UINT8*) imOut->image[y] + band; 86546: 242: for (x = 0; x < imOut->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 85832: 243: *out = (UINT8) color; 85832: 244: out += 4; -: 245: } -: 246: } -: 247: -: 248: return imOut; -: 249:} -: 250: -: 251:Imaging function ImagingMerge called 252 returned 100% blocks executed 88% 252: 252:ImagingMerge(const char* mode, Imaging bands[4]) -: 253:{ -: 254: int i, x, y; 252: 255: int bandsCount = 0; -: 256: Imaging imOut; -: 257: Imaging firstBand; -: 258: 252: 259: firstBand = bands[0]; 252: 260: if ( ! firstBand) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 261: return (Imaging) ImagingError_ValueError("wrong number of bands"); call 0 never executed -: 262: } -: 263: 812: 264: for (i = 0; i < 4; ++i) { branch 0 taken 88% branch 1 taken 12% (fallthrough) 940: 265: if ( ! bands[i]) { branch 0 taken 86% (fallthrough) branch 1 taken 14% -: 266: break; -: 267: } 812: 268: if (bands[i]->bands != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 269: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 270: } 812: 271: if (bands[i]->xsize != firstBand->xsize branch 0 taken 100% (fallthrough) branch 1 taken 0% 812: 272: || bands[i]->ysize != firstBand->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 273: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 274: } -: 275: } 252: 276: bandsCount = i; -: 277: 252: 278: imOut = ImagingNewDirty(mode, firstBand->xsize, firstBand->ysize); call 0 returned 100% 252: 279: if ( ! imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 280: return NULL; -: 281: } -: 282: 252: 283: if (imOut->bands != bandsCount) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 284: ImagingDelete(imOut); call 0 never executed #####: 285: return (Imaging) ImagingError_ValueError("wrong number of bands"); call 0 never executed -: 286: } -: 287: 252: 288: if (imOut->bands == 1) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 20: 289: return ImagingCopy2(imOut, firstBand); call 0 returned 100% -: 290: } -: 291: 232: 292: if (imOut->bands == 2) { branch 0 taken 12% (fallthrough) branch 1 taken 88% 1628: 293: for (y = 0; y < imOut->ysize; y++) { branch 0 taken 98% branch 1 taken 2% 1628: 294: UINT8* in0 = bands[0]->image8[y]; 1628: 295: UINT8* in1 = bands[1]->image8[y]; 1628: 296: UINT32* out = (UINT32*) imOut->image32[y]; 592156: 297: for (x = 0; x < imOut->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 590528: 298: out[x] = MAKE_UINT32(in0[x], 0, 0, in1[x]); -: 299: } -: 300: } 204: 301: } else if (imOut->bands == 3) { branch 0 taken 39% (fallthrough) branch 1 taken 61% 5211: 302: for (y = 0; y < imOut->ysize; y++) { branch 0 taken 98% branch 1 taken 2% 5211: 303: UINT8* in0 = bands[0]->image8[y]; 5211: 304: UINT8* in1 = bands[1]->image8[y]; 5211: 305: UINT8* in2 = bands[2]->image8[y]; 5211: 306: UINT32* out = (UINT32*) imOut->image32[y]; 1242984: 307: for (x = 0; x < imOut->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1237773: 308: out[x] = MAKE_UINT32(in0[x], in1[x], in2[x], 0); -: 309: } -: 310: } 124: 311: } else if (imOut->bands == 4) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 5136: 312: for (y = 0; y < imOut->ysize; y++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 5136: 313: UINT8* in0 = bands[0]->image8[y]; 5136: 314: UINT8* in1 = bands[1]->image8[y]; 5136: 315: UINT8* in2 = bands[2]->image8[y]; 5136: 316: UINT8* in3 = bands[3]->image8[y]; 5136: 317: UINT32* out = (UINT32*) imOut->image32[y]; 1087844: 318: for (x = 0; x < imOut->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1082708: 319: out[x] = MAKE_UINT32(in0[x], in1[x], in2[x], in3[x]); -: 320: } -: 321: } -: 322: } -: 323: -: 324: return imOut; -: 325:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Storage.c.gcov -: 0:Source:src/libImaging/Storage.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Storage.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Storage.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * imaging storage object -: 6: * -: 7: * This baseline implementation is designed to efficiently handle -: 8: * large images, provided they fit into the available memory. -: 9: * -: 10: * history: -: 11: * 1995-06-15 fl Created -: 12: * 1995-09-12 fl Updated API, compiles silently under ANSI C++ -: 13: * 1995-11-26 fl Compiles silently under Borland 4.5 as well -: 14: * 1996-05-05 fl Correctly test status from Prologue -: 15: * 1997-05-12 fl Increased THRESHOLD (to speed up Tk interface) -: 16: * 1997-05-30 fl Added support for floating point images -: 17: * 1997-11-17 fl Added support for "RGBX" images -: 18: * 1998-01-11 fl Added support for integer images -: 19: * 1998-03-05 fl Exported Prologue/Epilogue functions -: 20: * 1998-07-01 fl Added basic "YCrCb" support -: 21: * 1998-07-03 fl Attach palette in prologue for "P" images -: 22: * 1998-07-09 hk Don't report MemoryError on zero-size images -: 23: * 1998-07-12 fl Change "YCrCb" to "YCbCr" (!) -: 24: * 1998-10-26 fl Added "I;16" and "I;16B" storage modes (experimental) -: 25: * 1998-12-29 fl Fixed allocation bug caused by previous fix -: 26: * 1999-02-03 fl Added "RGBa" and "BGR" modes (experimental) -: 27: * 2001-04-22 fl Fixed potential memory leak in ImagingCopyPalette -: 28: * 2003-09-26 fl Added "LA" and "PA" modes (experimental) -: 29: * 2005-10-02 fl Added image counter -: 30: * -: 31: * Copyright (c) 1998-2005 by Secret Labs AB -: 32: * Copyright (c) 1995-2005 by Fredrik Lundh -: 33: * -: 34: * See the README file for information on usage and redistribution. -: 35: */ -: 36: -: 37: -: 38:#include "Imaging.h" -: 39:#include -: 40: -: 41: -: 42:int ImagingNewCount = 0; -: 43: -: 44:/* -------------------------------------------------------------------- -: 45: * Standard image object. -: 46: */ -: 47: -: 48:Imaging function ImagingNewPrologueSubtype called 1088083 returned 100% blocks executed 97% 1088083: 49:ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) -: 50:{ -: 51: Imaging im; -: 52: -: 53: /* linesize overflow check, roughly the current largest space req'd */ 1088083: 54: if (xsize > (INT_MAX / 4) - 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 55: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 56: } -: 57: 1088083: 58: im = (Imaging) calloc(1, size); 1088083: 59: if (!im) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 60: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 61: } -: 62: -: 63: /* Setup image descriptor */ 1088083: 64: im->xsize = xsize; 1088083: 65: im->ysize = ysize; -: 66: 1088083: 67: im->type = IMAGING_TYPE_UINT8; -: 68: 1088083: 69: if (strcmp(mode, "1") == 0) { branch 0 taken 96% (fallthrough) branch 1 taken 4% branch 2 taken 96% (fallthrough) branch 3 taken 4% -: 70: /* 1-bit images */ 1041541: 71: im->bands = im->pixelsize = 1; 1041541: 72: im->linesize = xsize; -: 73: 46542: 74: } else if (strcmp(mode, "P") == 0) { branch 0 taken 4% (fallthrough) branch 1 taken 96% branch 2 taken 4% (fallthrough) branch 3 taken 96% -: 75: /* 8-bit palette mapped images */ 1935: 76: im->bands = im->pixelsize = 1; 1935: 77: im->linesize = xsize; 1935: 78: im->palette = ImagingPaletteNew("RGB"); call 0 returned 100% -: 79: 44607: 80: } else if (strcmp(mode, "PA") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 1% (fallthrough) branch 5 taken 99% -: 81: /* 8-bit palette with alpha */ 74: 82: im->bands = 2; 74: 83: im->pixelsize = 4; /* store in image32 memory */ 74: 84: im->linesize = xsize * 4; 74: 85: im->palette = ImagingPaletteNew("RGB"); call 0 returned 100% -: 86: 44533: 87: } else if (strcmp(mode, "L") == 0) { branch 0 taken 21% (fallthrough) branch 1 taken 79% branch 2 taken 18% (fallthrough) branch 3 taken 82% -: 88: /* 8-bit greyscale (luminance) images */ 8102: 89: im->bands = im->pixelsize = 1; 8102: 90: im->linesize = xsize; -: 91: 36431: 92: } else if (strcmp(mode, "LA") == 0) { branch 0 taken 3% (fallthrough) branch 1 taken 97% branch 2 taken 40% (fallthrough) branch 3 taken 60% branch 4 taken 1% (fallthrough) branch 5 taken 99% -: 93: /* 8-bit greyscale (luminance) with alpha */ 375: 94: im->bands = 2; 375: 95: im->pixelsize = 4; /* store in image32 memory */ 375: 96: im->linesize = xsize * 4; -: 97: 36056: 98: } else if (strcmp(mode, "La") == 0) { branch 0 taken 2% (fallthrough) branch 1 taken 98% branch 2 taken 95% (fallthrough) branch 3 taken 5% branch 4 taken 2% (fallthrough) branch 5 taken 98% -: 99: /* 8-bit greyscale (luminance) with premultiplied alpha */ 619: 100: im->bands = 2; 619: 101: im->pixelsize = 4; /* store in image32 memory */ 619: 102: im->linesize = xsize * 4; -: 103: 35437: 104: } else if (strcmp(mode, "F") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 1% (fallthrough) branch 3 taken 99% -: 105: /* 32-bit floating point images */ 444: 106: im->bands = 1; 444: 107: im->pixelsize = 4; 444: 108: im->linesize = xsize * 4; 444: 109: im->type = IMAGING_TYPE_FLOAT32; -: 110: 34993: 111: } else if (strcmp(mode, "I") == 0) { branch 0 taken 22% (fallthrough) branch 1 taken 78% branch 2 taken 21% (fallthrough) branch 3 taken 79% -: 112: /* 32-bit integer images */ 7411: 113: im->bands = 1; 7411: 114: im->pixelsize = 4; 7411: 115: im->linesize = xsize * 4; 7411: 116: im->type = IMAGING_TYPE_INT32; -: 117: 27582: 118: } else if (strcmp(mode, "I;16") == 0 || strcmp(mode, "I;16L") == 0 \ branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% 27391: 119: || strcmp(mode, "I;16B") == 0 || strcmp(mode, "I;16N") == 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% -: 120: /* EXPERIMENTAL */ -: 121: /* 16-bit raw integer images */ 288: 122: im->bands = 1; 288: 123: im->pixelsize = 2; 288: 124: im->linesize = xsize * 2; 288: 125: im->type = IMAGING_TYPE_SPECIAL; -: 126: 27294: 127: } else if (strcmp(mode, "RGB") == 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 88% (fallthrough) branch 7 taken 12% -: 128: /* 24-bit true colour images */ 23971: 129: im->bands = 3; 23971: 130: im->pixelsize = 4; 23971: 131: im->linesize = xsize * 4; -: 132: 3323: 133: } else if (strcmp(mode, "BGR;15") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 134: /* EXPERIMENTAL */ -: 135: /* 15-bit reversed true colour */ 6: 136: im->bands = 1; 6: 137: im->pixelsize = 2; 6: 138: im->linesize = (xsize*2 + 3) & -4; 6: 139: im->type = IMAGING_TYPE_SPECIAL; -: 140: 3317: 141: } else if (strcmp(mode, "BGR;16") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 142: /* EXPERIMENTAL */ -: 143: /* 16-bit reversed true colour */ 1: 144: im->bands = 1; 1: 145: im->pixelsize = 2; 1: 146: im->linesize = (xsize*2 + 3) & -4; 1: 147: im->type = IMAGING_TYPE_SPECIAL; -: 148: 3316: 149: } else if (strcmp(mode, "BGR;24") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 150: /* EXPERIMENTAL */ -: 151: /* 24-bit reversed true colour */ 1: 152: im->bands = 1; 1: 153: im->pixelsize = 3; 1: 154: im->linesize = (xsize*3 + 3) & -4; 1: 155: im->type = IMAGING_TYPE_SPECIAL; -: 156: 3315: 157: } else if (strcmp(mode, "BGR;32") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 158: /* EXPERIMENTAL */ -: 159: /* 32-bit reversed true colour */ 1: 160: im->bands = 1; 1: 161: im->pixelsize = 4; 1: 162: im->linesize = (xsize*4 + 3) & -4; 1: 163: im->type = IMAGING_TYPE_SPECIAL; -: 164: 3314: 165: } else if (strcmp(mode, "RGBX") == 0) { branch 0 taken 3% (fallthrough) branch 1 taken 97% -: 166: /* 32-bit true colour images with padding */ 111: 167: im->bands = im->pixelsize = 4; 111: 168: im->linesize = xsize * 4; -: 169: 3203: 170: } else if (strcmp(mode, "RGBA") == 0) { branch 0 taken 69% (fallthrough) branch 1 taken 31% -: 171: /* 32-bit true colour images with alpha */ 2197: 172: im->bands = im->pixelsize = 4; 2197: 173: im->linesize = xsize * 4; -: 174: 1006: 175: } else if (strcmp(mode, "RGBa") == 0) { branch 0 taken 64% (fallthrough) branch 1 taken 36% -: 176: /* 32-bit true colour images with premultiplied alpha */ 647: 177: im->bands = im->pixelsize = 4; 647: 178: im->linesize = xsize * 4; -: 179: 359: 180: } else if (strcmp(mode, "CMYK") == 0) { branch 0 taken 50% (fallthrough) branch 1 taken 50% -: 181: /* 32-bit colour separation */ 178: 182: im->bands = im->pixelsize = 4; 178: 183: im->linesize = xsize * 4; -: 184: 181: 185: } else if (strcmp(mode, "YCbCr") == 0) { branch 0 taken 44% (fallthrough) branch 1 taken 56% -: 186: /* 24-bit video format */ 79: 187: im->bands = 3; 79: 188: im->pixelsize = 4; 79: 189: im->linesize = xsize * 4; -: 190: 102: 191: } else if (strcmp(mode, "LAB") == 0) { branch 0 taken 33% (fallthrough) branch 1 taken 67% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 33% (fallthrough) branch 7 taken 67% -: 192: /* 24-bit color, luminance, + 2 color channels */ -: 193: /* L is uint8, a,b are int8 */ 34: 194: im->bands = 3; 34: 195: im->pixelsize = 4; 34: 196: im->linesize = xsize * 4; -: 197: 68: 198: } else if (strcmp(mode, "HSV") == 0) { branch 0 taken 91% (fallthrough) branch 1 taken 9% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 91% (fallthrough) branch 7 taken 9% -: 199: /* 24-bit color, luminance, + 2 color channels */ -: 200: /* L is uint8, a,b are int8 */ 62: 201: im->bands = 3; 62: 202: im->pixelsize = 4; 62: 203: im->linesize = xsize * 4; -: 204: -: 205: } else { 6: 206: free(im); 6: 207: return (Imaging) ImagingError_ValueError("unrecognized image mode"); call 0 returned 100% -: 208: } -: 209: -: 210: /* Setup image descriptor */ 2176154: 211: strcpy(im->mode, mode); -: 212: -: 213: /* Pointer array (allocate at least one line, to avoid MemoryError -: 214: exceptions on platforms where calloc(0, x) returns NULL) */ 1088077: 215: im->image = (char **) calloc((ysize > 0) ? ysize : 1, sizeof(void *)); -: 216: 1088077: 217: if ( ! im->image) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 218: free(im); #####: 219: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 220: } -: 221: -: 222: /* Initialize alias pointers to pixel data. */ 1088077: 223: switch (im->pixelsize) { branch 0 taken 97% branch 1 taken 3% branch 2 taken 0% -: 224: case 1: case 2: case 3: 1051874: 225: im->image8 = (UINT8 **) im->image; 1051874: 226: break; -: 227: case 4: 36203: 228: im->image32 = (INT32 **) im->image; 36203: 229: break; -: 230: } -: 231: 1088077: 232: ImagingDefaultArena.stats_new_count += 1; -: 233: 1088077: 234: return im; -: 235:} -: 236: -: 237:Imaging function ImagingNewPrologue called 1087977 returned 100% blocks executed 100% 1087977: 238:ImagingNewPrologue(const char *mode, int xsize, int ysize) -: 239:{ 1087977: 240: return ImagingNewPrologueSubtype( call 0 returned 100% -: 241: mode, xsize, ysize, sizeof(struct ImagingMemoryInstance)); -: 242:} -: 243: -: 244:void function ImagingDelete called 1088105 returned 100% blocks executed 100% 1088105: 245:ImagingDelete(Imaging im) -: 246:{ 1088105: 247: if (!im) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 248: return; -: 249: } -: 250: 1088037: 251: if (im->palette) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2136: 252: ImagingPaletteDelete(im->palette); call 0 returned 100% -: 253: } -: 254: 1088037: 255: if (im->destroy) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 1087547: 256: im->destroy(im); call 0 returned 100% -: 257: } -: 258: 1088037: 259: if (im->image) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1088037: 260: free(im->image); -: 261: } -: 262: 1088037: 263: free(im); -: 264:} -: 265: -: 266: -: 267:/* Array Storage Type */ -: 268:/* ------------------ */ -: 269:/* Allocate image as an array of line buffers. */ -: 270: -: 271:#define IMAGING_PAGE_SIZE (4096) -: 272: -: 273:struct ImagingMemoryArena ImagingDefaultArena = { -: 274: 1, // alignment -: 275: 16*1024*1024, // block_size -: 276: 0, // blocks_max -: 277: 0, // blocks_cached -: 278: NULL, // blocks_pool -: 279: 0, 0, 0, 0, 0 // Stats -: 280:}; -: 281: -: 282:int function ImagingMemorySetBlocksMax called 20 returned 100% blocks executed 100% 20: 283:ImagingMemorySetBlocksMax(ImagingMemoryArena arena, int blocks_max) -: 284:{ -: 285: void *p; -: 286: /* Free already cached blocks */ 20: 287: ImagingMemoryClearCache(arena, blocks_max); call 0 returned 100% -: 288: 20: 289: if (blocks_max == 0 && arena->blocks_pool != NULL) { branch 0 taken 75% (fallthrough) branch 1 taken 25% branch 2 taken 60% (fallthrough) branch 3 taken 40% 9: 290: free(arena->blocks_pool); 9: 291: arena->blocks_pool = NULL; 11: 292: } else if (arena->blocks_pool != NULL) { branch 0 taken 9% (fallthrough) branch 1 taken 91% 1: 293: p = realloc(arena->blocks_pool, sizeof(*arena->blocks_pool) * blocks_max); 1: 294: if ( ! p) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 295: // Leave previous blocks_max value -: 296: return 0; -: 297: } 1: 298: arena->blocks_pool = p; -: 299: } else { 10: 300: arena->blocks_pool = calloc(sizeof(*arena->blocks_pool), blocks_max); 10: 301: if ( ! arena->blocks_pool) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 302: return 0; -: 303: } -: 304: } 20: 305: arena->blocks_max = blocks_max; -: 306: 20: 307: return 1; -: 308:} -: 309: -: 310:void function ImagingMemoryClearCache called 38 returned 100% blocks executed 100% 38: 311:ImagingMemoryClearCache(ImagingMemoryArena arena, int new_size) -: 312:{ 205: 313: while (arena->blocks_cached > new_size) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 129: 314: arena->blocks_cached -= 1; 129: 315: free(arena->blocks_pool[arena->blocks_cached].ptr); 129: 316: arena->stats_freed_blocks += 1; -: 317: } 38: 318:} -: 319: -: 320:ImagingMemoryBlock function memory_get_block called 1089084 returned 100% blocks executed 73% 1089084: 321:memory_get_block(ImagingMemoryArena arena, int requested_size, int dirty) -: 322:{ 1089084: 323: ImagingMemoryBlock block = {NULL, 0}; -: 324: 1089084: 325: if (arena->blocks_cached > 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 326: // Get block from cache 129: 327: arena->blocks_cached -= 1; 129: 328: block = arena->blocks_pool[arena->blocks_cached]; -: 329: // Reallocate if needed 129: 330: if (block.size != requested_size){ branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 331: block.ptr = realloc(block.ptr, requested_size); -: 332: } 129: 333: if ( ! block.ptr) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 334: // Can't allocate, free previous pointer (it is still valid) #####: 335: free(arena->blocks_pool[arena->blocks_cached].ptr); #####: 336: arena->stats_freed_blocks += 1; #####: 337: return block; -: 338: } 129: 339: if ( ! dirty) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 340: memset(block.ptr, 0, requested_size); -: 341: } 129: 342: arena->stats_reused_blocks += 1; 129: 343: if (block.ptr != arena->blocks_pool[arena->blocks_cached].ptr) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 344: arena->stats_reallocated_blocks += 1; -: 345: } -: 346: } else { 1088955: 347: if (dirty) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 1082250: 348: block.ptr = malloc(requested_size); -: 349: } else { 6705: 350: block.ptr = calloc(1, requested_size); -: 351: } 1088955: 352: arena->stats_allocated_blocks += 1; -: 353: } 1089084: 354: block.size = requested_size; 1089084: 355: return block; -: 356:} -: 357: -: 358:void function memory_return_block called 1089044 returned 100% blocks executed 83% 1089044: 359:memory_return_block(ImagingMemoryArena arena, ImagingMemoryBlock block) -: 360:{ 1089044: 361: if (arena->blocks_cached < arena->blocks_max) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 362: // Reduce block size 258: 363: if (block.size > arena->block_size) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 364: block.size = arena->block_size; #####: 365: block.ptr = realloc(block.ptr, arena->block_size); -: 366: } 258: 367: arena->blocks_pool[arena->blocks_cached] = block; 258: 368: arena->blocks_cached += 1; -: 369: } else { 1088786: 370: free(block.ptr); 1088786: 371: arena->stats_freed_blocks += 1; -: 372: } 1089044: 373:} -: 374: -: 375: -: 376:static void function ImagingDestroyArray called 1087441 returned 100% blocks executed 100% 1087441: 377:ImagingDestroyArray(Imaging im) -: 378:{ 1087441: 379: int y = 0; -: 380: 1087441: 381: if (im->blocks) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 2176485: 382: while (im->blocks[y].ptr) { branch 0 taken 50% branch 1 taken 50% (fallthrough) 1089044: 383: memory_return_block(&ImagingDefaultArena, im->blocks[y]); call 0 returned 100% 1089044: 384: y += 1; -: 385: } 1087441: 386: free(im->blocks); -: 387: } 1087441: 388:} -: 389: -: 390:Imaging function ImagingAllocateArray called 1087971 returned 100% blocks executed 86% 1087971: 391:ImagingAllocateArray(Imaging im, int dirty, int block_size) -: 392:{ -: 393: int y, line_in_block, current_block; 1087971: 394: ImagingMemoryArena arena = &ImagingDefaultArena; 1087971: 395: ImagingMemoryBlock block = {NULL, 0}; -: 396: int aligned_linesize, lines_per_block, blocks_count; 1087971: 397: char *aligned_ptr = NULL; -: 398: -: 399: /* 0-width or 0-height image. No need to do anything */ 1087971: 400: if ( ! im->linesize || ! im->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% -: 401: return im; -: 402: } -: 403: 1087481: 404: aligned_linesize = (im->linesize + arena->alignment - 1) & -arena->alignment; 1087481: 405: lines_per_block = (block_size - (arena->alignment - 1)) / aligned_linesize; 1087481: 406: if (lines_per_block == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 407: lines_per_block = 1; -: 408: } 1087481: 409: blocks_count = (im->ysize + lines_per_block - 1) / lines_per_block; -: 410: // printf("NEW size: %dx%d, ls: %d, lpb: %d, blocks: %d\n", -: 411: // im->xsize, im->ysize, aligned_linesize, lines_per_block, blocks_count); -: 412: -: 413: /* One extra pointer is always NULL */ 1087481: 414: im->blocks = calloc(sizeof(*im->blocks), blocks_count + 1); 1087481: 415: if ( ! im->blocks) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 416: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 417: } -: 418: -: 419: /* Allocate image as an array of lines */ -: 420: line_in_block = 0; -: 421: current_block = 0; 9368277: 422: for (y = 0; y < im->ysize; y++) { branch 0 taken 90% branch 1 taken 10% (fallthrough) 9368277: 423: if (line_in_block == 0) { branch 0 taken 12% (fallthrough) branch 1 taken 88% -: 424: int required; 1089084: 425: int lines_remaining = lines_per_block; 1089084: 426: if (lines_remaining > im->ysize - y) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 1087373: 427: lines_remaining = im->ysize - y; -: 428: } 1089084: 429: required = lines_remaining * aligned_linesize + arena->alignment - 1; 1089084: 430: block = memory_get_block(arena, required, dirty); call 0 returned 100% 1089084: 431: if ( ! block.ptr) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 432: ImagingDestroyArray(im); call 0 never executed #####: 433: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 434: } 1089084: 435: im->blocks[current_block] = block; -: 436: /* Bulletproof code from libc _int_memalign */ 1089084: 437: aligned_ptr = (char *)( 2178168: 438: ((size_t) (block.ptr + arena->alignment - 1)) & 1089084: 439: -((Py_ssize_t) arena->alignment)); -: 440: } -: 441: 9368277: 442: im->image[y] = aligned_ptr + aligned_linesize * line_in_block; -: 443: 9368277: 444: line_in_block += 1; 9368277: 445: if (line_in_block >= lines_per_block) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 446: /* Reset counter and start new block */ 1711: 447: line_in_block = 0; 1711: 448: current_block += 1; -: 449: } -: 450: } -: 451: 1087481: 452: im->destroy = ImagingDestroyArray; -: 453: 1087481: 454: return im; -: 455:} -: 456: -: 457: -: 458:/* Block Storage Type */ -: 459:/* ------------------ */ -: 460:/* Allocate image as a single block. */ -: 461: -: 462:static void function ImagingDestroyBlock called 0 returned 0% blocks executed 0% #####: 463:ImagingDestroyBlock(Imaging im) -: 464:{ #####: 465: if (im->block) { branch 0 never executed branch 1 never executed #####: 466: free(im->block); -: 467: } #####: 468:} -: 469: -: 470:Imaging function ImagingAllocateBlock called 0 returned 0% blocks executed 0% #####: 471:ImagingAllocateBlock(Imaging im) -: 472:{ -: 473: Py_ssize_t y, i; -: 474: -: 475: /* overflow check for malloc */ #####: 476: if (im->linesize && branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 477: im->ysize > INT_MAX / im->linesize) { #####: 478: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 479: } -: 480: #####: 481: if (im->ysize * im->linesize <= 0) { branch 0 never executed branch 1 never executed -: 482: /* some platforms return NULL for malloc(0); this fix -: 483: prevents MemoryError on zero-sized images on such -: 484: platforms */ #####: 485: im->block = (char *) malloc(1); -: 486: } else { -: 487: /* malloc check ok, overflow check above */ #####: 488: im->block = (char *) calloc(im->ysize, im->linesize); -: 489: } -: 490: #####: 491: if ( ! im->block) { branch 0 never executed branch 1 never executed #####: 492: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 493: } -: 494: #####: 495: for (y = i = 0; y < im->ysize; y++) { branch 0 never executed branch 1 never executed #####: 496: im->image[y] = im->block + i; #####: 497: i += im->linesize; -: 498: } -: 499: #####: 500: im->destroy = ImagingDestroyBlock; -: 501: #####: 502: return im; -: 503:} -: 504: -: 505:/* -------------------------------------------------------------------- -: 506: * Create a new, internally allocated, image. -: 507: */ -: 508: -: 509:Imaging function ImagingNewInternal called 1087978 returned 100% blocks executed 62% 1087978: 510:ImagingNewInternal(const char* mode, int xsize, int ysize, int dirty) -: 511:{ -: 512: Imaging im; -: 513: 1087978: 514: if (xsize < 0 || ysize < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 1% (fallthrough) branch 3 taken 99% 1: 515: return (Imaging) ImagingError_ValueError("bad image size"); call 0 returned 100% -: 516: } -: 517: 1087977: 518: im = ImagingNewPrologue(mode, xsize, ysize); call 0 returned 100% 1087977: 519: if ( ! im) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 520: return NULL; -: 521: } -: 522: 1087971: 523: if (ImagingAllocateArray(im, dirty, ImagingDefaultArena.block_size)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 524: return im; -: 525: } -: 526: #####: 527: ImagingError_Clear(); call 0 never executed -: 528: -: 529: // Try to allocate the image once more with smallest possible block size #####: 530: if (ImagingAllocateArray(im, dirty, IMAGING_PAGE_SIZE)) { call 0 never executed branch 1 never executed branch 2 never executed -: 531: return im; -: 532: } -: 533: #####: 534: ImagingDelete(im); call 0 never executed #####: 535: return NULL; -: 536:} -: 537: -: 538:Imaging function ImagingNew called 6129 returned 100% blocks executed 100% 6129: 539:ImagingNew(const char* mode, int xsize, int ysize) -: 540:{ 6129: 541: return ImagingNewInternal(mode, xsize, ysize, 0); call 0 returned 100% -: 542:} -: 543: -: 544:Imaging function ImagingNewDirty called 1081849 returned 100% blocks executed 100% 1081849: 545:ImagingNewDirty(const char* mode, int xsize, int ysize) -: 546:{ 1081849: 547: return ImagingNewInternal(mode, xsize, ysize, 1); call 0 returned 100% -: 548:} -: 549: -: 550:Imaging function ImagingNewBlock called 0 returned 0% blocks executed 0% #####: 551:ImagingNewBlock(const char* mode, int xsize, int ysize) -: 552:{ -: 553: Imaging im; -: 554: #####: 555: if (xsize < 0 || ysize < 0) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 556: return (Imaging) ImagingError_ValueError("bad image size"); call 0 never executed -: 557: } -: 558: #####: 559: im = ImagingNewPrologue(mode, xsize, ysize); call 0 never executed #####: 560: if ( ! im) { branch 0 never executed branch 1 never executed -: 561: return NULL; -: 562: } -: 563: #####: 564: if (ImagingAllocateBlock(im)) { call 0 never executed branch 1 never executed branch 2 never executed -: 565: return im; -: 566: } -: 567: #####: 568: ImagingDelete(im); call 0 never executed #####: 569: return NULL; -: 570:} -: 571: -: 572:Imaging function ImagingNew2Dirty called 10306 returned 100% blocks executed 89% 10306: 573:ImagingNew2Dirty(const char* mode, Imaging imOut, Imaging imIn) -: 574:{ -: 575: /* allocate or validate output image */ -: 576: 10306: 577: if (imOut) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 578: /* make sure images match */ 20: 579: if (strcmp(imOut->mode, mode) != 0 branch 0 taken 100% (fallthrough) branch 1 taken 0% 20: 580: || imOut->xsize != imIn->xsize branch 0 taken 100% (fallthrough) branch 1 taken 0% 20: 581: || imOut->ysize != imIn->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 582: return ImagingError_Mismatch(); call 0 never executed -: 583: } -: 584: } else { -: 585: /* create new image */ 10286: 586: imOut = ImagingNewDirty(mode, imIn->xsize, imIn->ysize); call 0 returned 100% 10286: 587: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 588: return NULL; -: 589: } -: 590: } -: 591: -: 592: return imOut; -: 593:} -: 594: -: 595:void function ImagingCopyPalette called 1032267 returned 100% blocks executed 100% 1032267: 596:ImagingCopyPalette(Imaging destination, Imaging source) -: 597:{ 1032267: 598: if (source->palette) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1331: 599: if (destination->palette) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1331: 600: ImagingPaletteDelete(destination->palette); call 0 returned 100% -: 601: } 1331: 602: destination->palette = ImagingPaletteDuplicate(source->palette); call 0 returned 100% -: 603: } 1032267: 604:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#SunRleDecode.c.gcov -: 0:Source:src/libImaging/SunRleDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/SunRleDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/SunRleDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * THIS IS WORK IN PROGRESS -: 3: * -: 4: * The Python Imaging Library. -: 5: * $Id$ -: 6: * -: 7: * decoder for SUN RLE data. -: 8: * -: 9: * history: -: 10: * 97-01-04 fl Created -: 11: * -: 12: * Copyright (c) Fredrik Lundh 1997. -: 13: * Copyright (c) Secret Labs AB 1997. -: 14: * -: 15: * See the README file for information on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21: -: 22:int function ImagingSunRleDecode called 19 returned 100% blocks executed 100% 19: 23:ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 24:{ -: 25: int n; -: 26: UINT8* ptr; 19: 27: UINT8 extra_data = 0; 19: 28: UINT8 extra_bytes = 0; -: 29: 19: 30: ptr = buf; -: 31: -: 32: for (;;) { -: 33: 1043968: 34: if (bytes < 1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 14: 35: return ptr - buf; -: 36: } -: 37: 1043954: 38: if (ptr[0] == 0x80) { branch 0 taken 2% (fallthrough) branch 1 taken 98% -: 39: 18634: 40: if (bytes < 2) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 41: break; -: 42: } -: 43: 18633: 44: n = ptr[1]; -: 45: -: 46: 18633: 47: if (n == 0) { branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 48: -: 49: /* Literal 0x80 (2 bytes) */ 5101: 50: n = 1; -: 51: 5101: 52: state->buffer[state->x] = 0x80; -: 53: 5101: 54: ptr += 2; 5101: 55: bytes -= 2; -: 56: -: 57: } else { -: 58: -: 59: /* Run (3 bytes) */ 13532: 60: if (bytes < 3) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 61: break; -: 62: } -: 63: -: 64: /* from (https://www.fileformat.info/format/sunraster/egff.htm) -: 65: -: 66: For example, a run of 100 pixels with the value of -: 67: 0Ah would encode as the values 80h 64h 0Ah. A -: 68: single pixel value of 80h would encode as the -: 69: values 80h 00h. The four unencoded bytes 12345678h -: 70: would be stored in the RLE stream as 12h 34h 56h -: 71: 78h. 100 pixels, n=100, not 100 pixels, n=99. -: 72: -: 73: But Wait! There's More! -: 74: (https://www.fileformat.info/format/sunraster/spec/598a59c4fac64c52897585d390d86360/view.htm) -: 75: -: 76: If the first byte is 0x80, and the second byte is -: 77: not zero, the record is three bytes long. The -: 78: second byte is a count and the third byte is a -: 79: value. Output (count+1) pixels of that value. -: 80: -: 81: 2 specs, same site, but Imagemagick and GIMP seem -: 82: to agree on the second one. -: 83: */ 13532: 84: n += 1; -: 85: 13532: 86: if (state->x + n > state->bytes) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 325: 87: extra_bytes = n; /* full value */ 325: 88: n = state->bytes - state->x; 325: 89: extra_bytes -= n; 325: 90: extra_data = ptr[2]; -: 91: } -: 92: 27064: 93: memset(state->buffer + state->x, ptr[2], n); -: 94: 13532: 95: ptr += 3; 13532: 96: bytes -= 3; -: 97: -: 98: } -: 99: -: 100: } else { -: 101: -: 102: /* Literal byte */ 1025320: 103: n = 1; -: 104: 1025320: 105: state->buffer[state->x] = ptr[0]; -: 106: 1025320: 107: ptr += 1; 1025320: 108: bytes -= 1; -: 109: -: 110: } -: 111: -: 112: for (;;) { 1044359: 113: state->x += n; -: 114: 1044359: 115: if (state->x >= state->bytes) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 116: -: 117: /* Got a full line, unpack it */ 5808: 118: state->shuffle((UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 3872: 119: state->xoff * im->pixelsize, state->buffer, -: 120: state->xsize); -: 121: 1936: 122: state->x = 0; -: 123: 1936: 124: if (++state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 125: /* End of file (errcode = 0) */ -: 126: return -1; -: 127: } -: 128: } -: 129: 1044355: 130: if (extra_bytes == 0) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 131: break; -: 132: } -: 133: 406: 134: if (state->x > 0) { branch 0 taken 0% branch 1 taken 100% (fallthrough) -: 135: break; // assert -: 136: } -: 137: 406: 138: if (extra_bytes >= state->bytes) { branch 0 taken 80% (fallthrough) branch 1 taken 20% -: 139: n = state->bytes; -: 140: } else { 324: 141: n = extra_bytes; -: 142: } 812: 143: memset(state->buffer + state->x, extra_data, n); 406: 144: extra_bytes -= n; 406: 145: } -: 146: } -: 147: 1: 148: return ptr - buf; -: 149:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#QuantHeap.c.gcov -: 0:Source:src/libImaging/QuantHeap.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/QuantHeap.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/QuantHeap.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * heap data type used by the image quantizer -: 6: * -: 7: * history: -: 8: * 98-09-10 tjs Contributed -: 9: * 98-12-29 fl Added to PIL 1.0b1 -: 10: * -: 11: * Written by Toby J Sargeant . -: 12: * -: 13: * Copyright (c) 1998 by Toby J Sargeant -: 14: * Copyright (c) 1998 by Secret Labs AB -: 15: * -: 16: * See the README file for information on usage and redistribution. -: 17: */ -: 18: -: 19:#include -: 20:#include -: 21:#include -: 22:#include -: 23:#include -: 24: -: 25:#include "QuantHeap.h" -: 26: -: 27:struct _Heap { -: 28: void **heap; -: 29: unsigned int heapsize; -: 30: unsigned int heapcount; -: 31: HeapCmpFunc cf; -: 32:}; -: 33: -: 34:#define INITIAL_SIZE 256 -: 35: -: 36:// #define DEBUG -: 37: -: 38:#ifdef DEBUG -: 39:static int _heap_test(Heap *); -: 40:#endif -: 41: function ImagingQuantHeapFree called 12 returned 100% blocks executed 100% 12: 42:void ImagingQuantHeapFree(Heap *h) { 12: 43: free(h->heap); 12: 44: free(h); 12: 45:} -: 46: function _heap_grow.isra.0 called 1 returned 100% blocks executed 100% 1: 47:static int _heap_grow(Heap *h,unsigned int newsize) { -: 48: void *newheap; 1: 49: if (!newsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 50: newsize=h->heapsize<<1; -: 51: } 1: 52: if (newsizeheapsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 53: return 0; -: 54: } 1: 55: if (newsize > INT_MAX / sizeof(void *)){ branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 56: return 0; -: 57: } -: 58: /* malloc check ok, using calloc for overflow, also checking -: 59: above due to memcpy below*/ 1: 60: newheap=calloc(newsize, sizeof(void *)); 1: 61: if (!newheap) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 62: return 0; -: 63: } 2: 64: memcpy(newheap,h->heap,sizeof(void *)*h->heapsize); 1: 65: free(h->heap); 1: 66: h->heap=newheap; 1: 67: h->heapsize=newsize; -: 68: return 1; -: 69:} -: 70: -: 71:#ifdef DEBUG -: 72:static int _heap_test(Heap *h) { -: 73: unsigned int k; -: 74: for (k=1;k*2<=h->heapcount;k++) { -: 75: if (h->cf(h,h->heap[k],h->heap[k*2])<0) { -: 76: printf ("heap is bad\n"); -: 77: return 0; -: 78: } -: 79: if (k*2+1<=h->heapcount && h->cf(h,h->heap[k],h->heap[k*2+1])<0) { -: 80: printf ("heap is bad\n"); -: 81: return 0; -: 82: } -: 83: } -: 84: return 1; -: 85:} -: 86:#endif -: 87: function ImagingQuantHeapRemove called 2367 returned 100% blocks executed 100% 2367: 88:int ImagingQuantHeapRemove(Heap* h,void **r) { -: 89: unsigned int k,l; -: 90: void *v; -: 91: 2367: 92: if (!h->heapcount) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 93: return 0; -: 94: } 2363: 95: *r=h->heap[1]; 2363: 96: v=h->heap[h->heapcount--]; 14863: 97: for (k=1;k*2<=h->heapcount;k=l) { branch 0 taken 85% branch 1 taken 15% (fallthrough) 12623: 98: l=k*2; 12623: 99: if (lheapcount) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 12533: 100: if (h->cf(h,h->heap[l],h->heap[l+1])<0) { call 0 returned 100% branch 1 taken 48% (fallthrough) branch 2 taken 52% 6005: 101: l++; -: 102: } -: 103: } 12623: 104: if (h->cf(h,v,h->heap[l])>0) { call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 105: break; -: 106: } 12500: 107: h->heap[k]=h->heap[l]; -: 108: } 2363: 109: h->heap[k]=v; -: 110:#ifdef DEBUG -: 111: if (!_heap_test(h)) { printf ("oops - heap_remove messed up the heap\n"); exit(1); } -: 112:#endif 2363: 113: return 1; -: 114:} -: 115: function ImagingQuantHeapAdd called 4108 returned 100% blocks executed 100% 4108: 116:int ImagingQuantHeapAdd(Heap *h,void *val) { -: 117: int k; 4108: 118: if (h->heapcount==h->heapsize-1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 119: _heap_grow(h,0); call 0 returned 100% -: 120: } 4108: 121: k=++h->heapcount; 10466: 122: while (k!=1) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 6318: 123: if (h->cf(h,val,h->heap[k/2])<=0) { call 0 returned 100% branch 1 taken 36% (fallthrough) branch 2 taken 64% -: 124: break; -: 125: } 2250: 126: h->heap[k]=h->heap[k/2]; 2250: 127: k>>=1; -: 128: } 4108: 129: h->heap[k]=val; -: 130:#ifdef DEBUG -: 131: if (!_heap_test(h)) { printf ("oops - heap_add messed up the heap\n"); exit(1); } -: 132:#endif 4108: 133: return 1; -: 134:} -: 135: function ImagingQuantHeapTop called 0 returned 0% blocks executed 0% #####: 136:int ImagingQuantHeapTop(Heap *h,void **r) { #####: 137: if (!h->heapcount) { branch 0 never executed branch 1 never executed -: 138: return 0; -: 139: } #####: 140: *r=h->heap[1]; #####: 141: return 1; -: 142:} -: 143: function ImagingQuantHeapNew called 12 returned 100% blocks executed 80% 12: 144:Heap *ImagingQuantHeapNew(HeapCmpFunc cf) { -: 145: Heap *h; -: 146: -: 147: /* malloc check ok, small constant allocation */ 12: 148: h=malloc(sizeof(Heap)); 12: 149: if (!h) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 150: return NULL; -: 151: } 12: 152: h->heapsize=INITIAL_SIZE; -: 153: /* malloc check ok, using calloc for overflow */ 12: 154: h->heap=calloc(h->heapsize, sizeof(void *)); 12: 155: if (!h->heap) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 156: free(h); #####: 157: return NULL; -: 158: } 12: 159: h->heapcount=0; 12: 160: h->cf=cf; 12: 161: return h; -: 162:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#_imaging.c.gcov -: 0:Source:src/_imaging.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imaging.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imaging.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * -: 4: * the imaging library bindings -: 5: * -: 6: * history: -: 7: * 1995-09-24 fl Created -: 8: * 1996-03-24 fl Ready for first public release (release 0.0) -: 9: * 1996-03-25 fl Added fromstring (for Jack's "img" library) -: 10: * 1996-03-28 fl Added channel operations -: 11: * 1996-03-31 fl Added point operation -: 12: * 1996-04-08 fl Added new/new_block/new_array factories -: 13: * 1996-04-13 fl Added decoders -: 14: * 1996-05-04 fl Added palette hack -: 15: * 1996-05-12 fl Compile cleanly as C++ -: 16: * 1996-05-19 fl Added matrix conversions, gradient fills -: 17: * 1996-05-27 fl Added display_mode -: 18: * 1996-07-22 fl Added getbbox, offset -: 19: * 1996-07-23 fl Added sequence semantics -: 20: * 1996-08-13 fl Added logical operators, point mode -: 21: * 1996-08-16 fl Modified paste interface -: 22: * 1996-09-06 fl Added putdata methods, use abstract interface -: 23: * 1996-11-01 fl Added xbm encoder -: 24: * 1996-11-04 fl Added experimental path stuff, draw_lines, etc -: 25: * 1996-12-10 fl Added zip decoder, crc32 interface -: 26: * 1996-12-14 fl Added modulo arithmetics -: 27: * 1996-12-29 fl Added zip encoder -: 28: * 1997-01-03 fl Added fli and msp decoders -: 29: * 1997-01-04 fl Added experimental sun_rle and tga_rle decoders -: 30: * 1997-01-05 fl Added gif encoder, getpalette hack -: 31: * 1997-02-23 fl Added histogram mask -: 32: * 1997-05-12 fl Minor tweaks to match the IFUNC95 interface -: 33: * 1997-05-21 fl Added noise generator, spread effect -: 34: * 1997-06-05 fl Added mandelbrot generator -: 35: * 1997-08-02 fl Modified putpalette to coerce image mode if necessary -: 36: * 1998-01-11 fl Added INT32 support -: 37: * 1998-01-22 fl Fixed draw_points to draw the last point too -: 38: * 1998-06-28 fl Added getpixel, getink, draw_ink -: 39: * 1998-07-12 fl Added getextrema -: 40: * 1998-07-17 fl Added point conversion to arbitrary formats -: 41: * 1998-09-21 fl Added support for resampling filters -: 42: * 1998-09-22 fl Added support for quad transform -: 43: * 1998-12-29 fl Added support for arcs, chords, and pieslices -: 44: * 1999-01-10 fl Added some experimental arrow graphics stuff -: 45: * 1999-02-06 fl Added draw_bitmap, font acceleration stuff -: 46: * 2001-04-17 fl Fixed some egcs compiler nits -: 47: * 2001-09-17 fl Added screen grab primitives (win32) -: 48: * 2002-03-09 fl Added stretch primitive -: 49: * 2002-03-10 fl Fixed filter handling in rotate -: 50: * 2002-06-06 fl Added I, F, and RGB support to putdata -: 51: * 2002-06-08 fl Added rankfilter -: 52: * 2002-06-09 fl Added support for user-defined filter kernels -: 53: * 2002-11-19 fl Added clipboard grab primitives (win32) -: 54: * 2002-12-11 fl Added draw context -: 55: * 2003-04-26 fl Tweaks for Python 2.3 beta 1 -: 56: * 2003-05-21 fl Added createwindow primitive (win32) -: 57: * 2003-09-13 fl Added thread section hooks -: 58: * 2003-09-15 fl Added expand helper -: 59: * 2003-09-26 fl Added experimental LA support -: 60: * 2004-02-21 fl Handle zero-size images in quantize -: 61: * 2004-06-05 fl Added ptr attribute (used to access Imaging objects) -: 62: * 2004-06-05 fl Don't crash when fetching pixels from zero-wide images -: 63: * 2004-09-17 fl Added getcolors -: 64: * 2004-10-04 fl Added modefilter -: 65: * 2005-10-02 fl Added access proxy -: 66: * 2006-06-18 fl Always draw last point in polyline -: 67: * -: 68: * Copyright (c) 1997-2006 by Secret Labs AB -: 69: * Copyright (c) 1995-2006 by Fredrik Lundh -: 70: * -: 71: * See the README file for information on usage and redistribution. -: 72: */ -: 73: -: 74:#define PY_SSIZE_T_CLEAN -: 75:#include "Python.h" -: 76: -: 77:#ifdef HAVE_LIBJPEG -: 78:#include "jconfig.h" -: 79:#endif -: 80: -: 81:#ifdef HAVE_LIBZ -: 82:#include "zlib.h" -: 83:#endif -: 84: -: 85:#ifdef HAVE_LIBTIFF -: 86:#ifndef _TIFFIO_ -: 87:#include -: 88:#endif -: 89:#endif -: 90: -: 91:#include "libImaging/Imaging.h" -: 92: -: 93:#define _USE_MATH_DEFINES -: 94:#include -: 95: -: 96:/* Configuration stuff. Feel free to undef things you don't need. */ -: 97:#define WITH_IMAGECHOPS /* ImageChops support */ -: 98:#define WITH_IMAGEDRAW /* ImageDraw support */ -: 99:#define WITH_MAPPING /* use memory mapping to read some file formats */ -: 100:#define WITH_IMAGEPATH /* ImagePath stuff */ -: 101:#define WITH_ARROW /* arrow graphics stuff (experimental) */ -: 102:#define WITH_EFFECTS /* special effects */ -: 103:#define WITH_QUANTIZE /* quantization support */ -: 104:#define WITH_RANKFILTER /* rank filter */ -: 105:#define WITH_MODEFILTER /* mode filter */ -: 106:#define WITH_THREADING /* "friendly" threading support */ -: 107:#define WITH_UNSHARPMASK /* Kevin Cazabon's unsharpmask module */ -: 108: -: 109:#undef VERBOSE -: 110: -: 111:#define B16(p, i) ((((int)p[(i)]) << 8) + p[(i)+1]) -: 112:#define L16(p, i) ((((int)p[(i)+1]) << 8) + p[(i)]) -: 113:#define S16(v) ((v) < 32768 ? (v) : ((v) - 65536)) -: 114: -: 115:/* -------------------------------------------------------------------- */ -: 116:/* OBJECT ADMINISTRATION */ -: 117:/* -------------------------------------------------------------------- */ -: 118: -: 119:typedef struct { -: 120: PyObject_HEAD -: 121: Imaging image; -: 122: ImagingAccess access; -: 123:} ImagingObject; -: 124: -: 125:static PyTypeObject Imaging_Type; -: 126: -: 127:#ifdef WITH_IMAGEDRAW -: 128: -: 129:typedef struct -: 130:{ -: 131: /* to write a character, cut out sxy from glyph data, place -: 132: at current position plus dxy, and advance by (dx, dy) */ -: 133: int dx, dy; -: 134: int dx0, dy0, dx1, dy1; -: 135: int sx0, sy0, sx1, sy1; -: 136:} Glyph; -: 137: -: 138:typedef struct { -: 139: PyObject_HEAD -: 140: ImagingObject* ref; -: 141: Imaging bitmap; -: 142: int ysize; -: 143: int baseline; -: 144: Glyph glyphs[256]; -: 145:} ImagingFontObject; -: 146: -: 147:static PyTypeObject ImagingFont_Type; -: 148: -: 149:typedef struct { -: 150: PyObject_HEAD -: 151: ImagingObject* image; -: 152: UINT8 ink[4]; -: 153: int blend; -: 154:} ImagingDrawObject; -: 155: -: 156:static PyTypeObject ImagingDraw_Type; -: 157: -: 158:#endif -: 159: -: 160:typedef struct { -: 161: PyObject_HEAD -: 162: ImagingObject* image; -: 163: int readonly; -: 164:} PixelAccessObject; -: 165: -: 166:static PyTypeObject PixelAccess_Type; -: 167: -: 168:PyObject* function PyImagingNew called 53148 returned 100% blocks executed 75% 53148: 169:PyImagingNew(Imaging imOut) -: 170:{ -: 171: ImagingObject* imagep; -: 172: 53148: 173: if (!imOut) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 174: return NULL; -: 175: } -: 176: 52932: 177: imagep = PyObject_New(ImagingObject, &Imaging_Type); call 0 returned 100% 52932: 178: if (imagep == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 179: ImagingDelete(imOut); call 0 never executed #####: 180: return NULL; -: 181: } -: 182: -: 183:#ifdef VERBOSE -: 184: printf("imaging %p allocated\n", imagep); -: 185:#endif -: 186: 52932: 187: imagep->image = imOut; 52932: 188: imagep->access = ImagingAccessNew(imOut); call 0 returned 100% -: 189: 52932: 190: return (PyObject*) imagep; -: 191:} -: 192: -: 193:static void function _dealloc called 52896 returned 100% blocks executed 100% 52896: 194:_dealloc(ImagingObject* imagep) -: 195:{ -: 196: -: 197:#ifdef VERBOSE -: 198: printf("imaging %p deleted\n", imagep); -: 199:#endif -: 200: -: 201: if (imagep->access) { -: 202: ImagingAccessDelete(imagep->image, imagep->access); -: 203: } 52896: 204: ImagingDelete(imagep->image); call 0 returned 100% 52896: 205: PyObject_Del(imagep); call 0 returned 100% 52896: 206:} -: 207: -: 208:#define PyImaging_Check(op) (Py_TYPE(op) == &Imaging_Type) -: 209: function PyImaging_AsImaging called 35472 returned 100% blocks executed 60% 35472: 210:Imaging PyImaging_AsImaging(PyObject *op) -: 211:{ 35472: 212: if (!PyImaging_Check(op)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 213: PyErr_BadInternalCall(); call 0 never executed #####: 214: return NULL; -: 215: } -: 216: 35472: 217: return ((ImagingObject *)op)->image; -: 218:} -: 219: -: 220: -: 221:/* -------------------------------------------------------------------- */ -: 222:/* THREAD HANDLING */ -: 223:/* -------------------------------------------------------------------- */ -: 224: function ImagingSectionEnter called 2137796 returned 100% blocks executed 100% 2137796: 225:void ImagingSectionEnter(ImagingSectionCookie* cookie) -: 226:{ -: 227:#ifdef WITH_THREADING 2137796: 228: *cookie = (PyThreadState *) PyEval_SaveThread(); call 0 returned 100% -: 229:#endif 2137796: 230:} -: 231: function ImagingSectionLeave called 2137796 returned 100% blocks executed 100% 2137796: 232:void ImagingSectionLeave(ImagingSectionCookie* cookie) -: 233:{ -: 234:#ifdef WITH_THREADING 2137796: 235: PyEval_RestoreThread((PyThreadState*) *cookie); call 0 returned 100% -: 236:#endif 2137796: 237:} -: 238: -: 239:/* -------------------------------------------------------------------- */ -: 240:/* BUFFER HANDLING */ -: 241:/* -------------------------------------------------------------------- */ -: 242:/* Python compatibility API */ -: 243: function PyImaging_CheckBuffer called 3038 returned 100% blocks executed 100% 3038: 244:int PyImaging_CheckBuffer(PyObject* buffer) -: 245:{ 3038: 246: return PyObject_CheckBuffer(buffer); branch 0 taken 4% (fallthrough) branch 1 taken 96% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 247:} -: 248: function PyImaging_GetBuffer called 109 returned 100% blocks executed 100% 109: 249:int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view) -: 250:{ -: 251: /* must call check_buffer first! */ 109: 252: return PyObject_GetBuffer(buffer, view, PyBUF_SIMPLE); call 0 returned 100% -: 253:} -: 254: -: 255:/* -------------------------------------------------------------------- */ -: 256:/* EXCEPTION REROUTING */ -: 257:/* -------------------------------------------------------------------- */ -: 258: -: 259:/* error messages */ -: 260:static const char* must_be_sequence = "argument must be a sequence"; -: 261:static const char* must_be_two_coordinates = -: 262: "coordinate list must contain exactly 2 coordinates"; -: 263:static const char* wrong_mode = "unrecognized image mode"; -: 264:static const char* wrong_raw_mode = "unrecognized raw mode"; -: 265:static const char* outside_image = "image index out of range"; -: 266:static const char* outside_palette = "palette index out of range"; -: 267:static const char* wrong_palette_size = "invalid palette size"; -: 268:static const char* no_palette = "image has no palette"; -: 269:static const char* readonly = "image is readonly"; -: 270:/* static const char* no_content = "image has no content"; */ -: 271: -: 272:void * function ImagingError_OSError called 0 returned 0% blocks executed 0% #####: 273:ImagingError_OSError(void) -: 274:{ #####: 275: PyErr_SetString(PyExc_OSError, "error when accessing file"); call 0 never executed #####: 276: return NULL; -: 277:} -: 278: -: 279:void * function ImagingError_MemoryError called 2 returned 100% blocks executed 100% 2: 280:ImagingError_MemoryError(void) -: 281:{ 2: 282: return PyErr_NoMemory(); call 0 returned 100% -: 283:} -: 284: -: 285:void * function ImagingError_Mismatch called 0 returned 0% blocks executed 0% #####: 286:ImagingError_Mismatch(void) -: 287:{ #####: 288: PyErr_SetString(PyExc_ValueError, "images do not match"); call 0 never executed #####: 289: return NULL; -: 290:} -: 291: -: 292:void * function ImagingError_ModeError called 32 returned 100% blocks executed 100% 32: 293:ImagingError_ModeError(void) -: 294:{ 32: 295: PyErr_SetString(PyExc_ValueError, "image has wrong mode"); call 0 returned 100% 32: 296: return NULL; -: 297:} -: 298: -: 299:void * function ImagingError_ValueError called 264 returned 100% blocks executed 100% 264: 300:ImagingError_ValueError(const char *message) -: 301:{ 264: 302: PyErr_SetString( branch 0 taken 99% (fallthrough) branch 1 taken 1% call 2 returned 100% -: 303: PyExc_ValueError, -: 304: (message) ? (char*) message : "unrecognized argument value" -: 305: ); 264: 306: return NULL; -: 307:} -: 308: -: 309:void function ImagingError_Clear called 0 returned 0% blocks executed 0% #####: 310:ImagingError_Clear(void) -: 311:{ #####: 312: PyErr_Clear(); call 0 never executed #####: 313:} -: 314: -: 315:/* -------------------------------------------------------------------- */ -: 316:/* HELPERS */ -: 317:/* -------------------------------------------------------------------- */ -: 318: -: 319:static int function getbands called 1 returned 100% blocks executed 100% 1: 320:getbands(const char* mode) -: 321:{ -: 322: Imaging im; -: 323: int bands; -: 324: -: 325: /* FIXME: add primitive to libImaging to avoid extra allocation */ 1: 326: im = ImagingNew(mode, 0, 0); call 0 returned 100% 1: 327: if (!im) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 328: return -1; -: 329: } -: 330: 1: 331: bands = im->bands; -: 332: 1: 333: ImagingDelete(im); call 0 returned 100% -: 334: 1: 335: return bands; -: 336:} -: 337: -: 338:#define TYPE_UINT8 (0x100|sizeof(UINT8)) -: 339:#define TYPE_INT32 (0x200|sizeof(INT32)) -: 340:#define TYPE_FLOAT16 (0x500|sizeof(FLOAT16)) -: 341:#define TYPE_FLOAT32 (0x300|sizeof(FLOAT32)) -: 342:#define TYPE_DOUBLE (0x400|sizeof(double)) -: 343: -: 344:static void* function getlist called 402 returned 100% blocks executed 95% 402: 345:getlist(PyObject* arg, Py_ssize_t* length, const char* wrong_length, int type) -: 346:{ -: 347: /* - allocates and returns a c array of the items in the -: 348: python sequence arg. -: 349: - the size of the returned array is in length -: 350: - all of the arg items must be numeric items of the type -: 351: specified in type -: 352: - sequence length is checked against the length parameter IF -: 353: an error parameter is passed in wrong_length -: 354: - caller is responsible for freeing the memory -: 355: */ -: 356: -: 357: Py_ssize_t i, n; -: 358: int itemp; -: 359: double dtemp; -: 360: FLOAT32 ftemp; -: 361: UINT8* list; -: 362: PyObject* seq; -: 363: PyObject* op; -: 364: 402: 365: if ( ! PySequence_Check(arg)) { call 0 returned 100% branch 1 taken 1% (fallthrough) branch 2 taken 99% 1: 366: PyErr_SetString(PyExc_TypeError, must_be_sequence); call 0 returned 100% 1: 367: return NULL; -: 368: } -: 369: 401: 370: n = PySequence_Size(arg); call 0 returned 100% 401: 371: if (length && wrong_length && n != *length) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 88% (fallthrough) branch 3 taken 12% branch 4 taken 1% (fallthrough) branch 5 taken 99% 5: 372: PyErr_SetString(PyExc_ValueError, wrong_length); call 0 returned 100% 5: 373: return NULL; -: 374: } -: 375: -: 376: /* malloc check ok, type & ff is just a sizeof(something) -: 377: calloc checks for overflow */ 396: 378: list = calloc(n, type & 0xff); 396: 379: if ( ! list) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 380: return PyErr_NoMemory(); call 0 never executed -: 381: } -: 382: 396: 383: seq = PySequence_Fast(arg, must_be_sequence); call 0 returned 100% 396: 384: if ( ! seq) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 385: free(list); #####: 386: return NULL; -: 387: } -: 388: 165926: 389: for (i = 0; i < n; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 165926: 390: op = PySequence_Fast_GET_ITEM(seq, i); branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 391: // DRY, branch prediction is going to work _really_ well -: 392: // on this switch. And 3 fewer loops to copy/paste. 165926: 393: switch (type) { branch 0 taken 39% branch 1 taken 11% branch 2 taken 48% branch 3 taken 1% branch 4 taken 0% -: 394: case TYPE_UINT8: 65536: 395: itemp = PyLong_AsLong(op); call 0 returned 100% 65536: 396: list[i] = CLIP8(itemp); branch 0 taken 99% (fallthrough) branch 1 taken 1% 65536: 397: break; -: 398: case TYPE_INT32: 18944: 399: itemp = PyLong_AsLong(op); call 0 returned 100% 18944: 400: memcpy(list + i * sizeof(INT32), &itemp, sizeof(itemp)); -: 401: break; -: 402: case TYPE_FLOAT32: 79664: 403: ftemp = (FLOAT32)PyFloat_AsDouble(op); call 0 returned 100% 79664: 404: memcpy(list + i * sizeof(ftemp), &ftemp, sizeof(ftemp)); -: 405: break; -: 406: case TYPE_DOUBLE: 1782: 407: dtemp = PyFloat_AsDouble(op); call 0 returned 100% 1782: 408: memcpy(list + i * sizeof(dtemp), &dtemp, sizeof(dtemp)); -: 409: break; -: 410: } -: 411: } -: 412: 396: 413: Py_DECREF(seq); branch 0 taken 1% (fallthrough) branch 1 taken 99% call 2 returned 100% -: 414: 396: 415: if (PyErr_Occurred()) { call 0 returned 100% branch 1 taken 1% (fallthrough) branch 2 taken 99% 1: 416: free(list); 1: 417: return NULL; -: 418: } -: 419: 395: 420: if (length) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 395: 421: *length = n; -: 422: } -: 423: -: 424: return list; -: 425:} -: 426: -: 427:FLOAT32 function float16tofloat32 called 2709 returned 100% blocks executed 100% 2709: 428:float16tofloat32(const FLOAT16 in) { -: 429: UINT32 t1; -: 430: UINT32 t2; -: 431: UINT32 t3; -: 432: FLOAT32 out[1] = {0}; -: 433: 2709: 434: t1 = in & 0x7fff; // Non-sign bits 2709: 435: t2 = in & 0x8000; // Sign bit 2709: 436: t3 = in & 0x7c00; // Exponent -: 437: 2709: 438: t1 <<= 13; // Align mantissa on MSB 2709: 439: t2 <<= 16; // Shift sign bit into position -: 440: 2709: 441: t1 += 0x38000000; // Adjust bias -: 442: 2709: 443: t1 = (t3 == 0 ? 0 : t1); // Denormals-as-zero branch 0 taken 91% (fallthrough) branch 1 taken 9% -: 444: 2709: 445: t1 |= t2; // Re-insert sign bit -: 446: 2709: 447: memcpy(out, &t1, 4); 2709: 448: return out[0]; -: 449:} -: 450: -: 451:static inline PyObject* function getpixel.isra.1 called 4641756 returned 100% blocks executed 95% 4641756: 452:getpixel(Imaging im, ImagingAccess access, int x, int y) -: 453:{ -: 454: union { -: 455: UINT8 b[4]; -: 456: UINT16 h; -: 457: INT32 i; -: 458: FLOAT32 f; -: 459: } pixel; -: 460: 4641756: 461: if (x < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 49286: 462: x = im->xsize + x; -: 463: } 4641756: 464: if (y < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 49286: 465: y = im->ysize + y; -: 466: } -: 467: 4641756: 468: if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 1% (fallthrough) branch 7 taken 99% 300: 469: PyErr_SetString(PyExc_IndexError, outside_image); call 0 returned 100% -: 470: return NULL; -: 471: } -: 472: 4641456: 473: access->get_pixel(im, x, y, &pixel); call 0 returned 100% -: 474: 4641456: 475: switch (im->type) { branch 0 taken 95% branch 1 taken 3% branch 2 taken 1% branch 3 taken 1% branch 4 taken 0% -: 476: case IMAGING_TYPE_UINT8: 4431905: 477: switch (im->bands) { branch 0 taken 93% branch 1 taken 1% branch 2 taken 5% branch 3 taken 2% branch 4 taken 0% -: 478: case 1: 4120100: 479: return PyLong_FromLong(pixel.b[0]); call 0 returned 100% -: 480: case 2: 30335: 481: return Py_BuildValue("BB", pixel.b[0], pixel.b[1]); call 0 returned 100% -: 482: case 3: 200107: 483: return Py_BuildValue("BBB", pixel.b[0], pixel.b[1], pixel.b[2]); call 0 returned 100% -: 484: case 4: 81363: 485: return Py_BuildValue("BBBB", pixel.b[0], pixel.b[1], pixel.b[2], pixel.b[3]); call 0 returned 100% -: 486: } -: 487: break; -: 488: case IMAGING_TYPE_INT32: 119633: 489: return PyLong_FromLong(pixel.i); call 0 returned 100% -: 490: case IMAGING_TYPE_FLOAT32: 62458: 491: return PyFloat_FromDouble(pixel.f); call 0 returned 100% -: 492: case IMAGING_TYPE_SPECIAL: 27460: 493: if (strncmp(im->mode, "I;16", 4) == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 27460: 494: return PyLong_FromLong(pixel.h); call 0 returned 100% -: 495: } -: 496: break; -: 497: } -: 498: -: 499: /* unknown type */ #####: 500: Py_INCREF(Py_None); -: 501: return Py_None; -: 502:} -: 503: -: 504:static char* function getink called 409620 returned 100% blocks executed 93% 409620: 505:getink(PyObject* color, Imaging im, char* ink) -: 506:{ 409620: 507: int g=0, b=0, a=0; 409620: 508: double f=0; -: 509: /* Windows 64 bit longs are 32 bits, and 0xFFFFFFFF (white) is a -: 510: python long (not int) that raises an overflow error when trying -: 511: to return it into a 32 bit C long -: 512: */ 409620: 513: PY_LONG_LONG r = 0; -: 514: FLOAT32 ftmp; -: 515: INT32 itmp; -: 516: -: 517: /* fill ink buffer (four bytes) with something that can -: 518: be cast to either UINT8 or INT32 */ -: 519: 409620: 520: int rIsInt = 0; 409620: 521: if (PyTuple_Check(color) && PyTuple_Size(color) == 1) { branch 0 taken 45% (fallthrough) branch 1 taken 55% call 2 returned 100% branch 3 taken 1% (fallthrough) branch 4 taken 99% 6: 522: color = PyTuple_GetItem(color, 0); call 0 returned 100% -: 523: } 409620: 524: if (im->type == IMAGING_TYPE_UINT8 || branch 0 taken 1% (fallthrough) branch 1 taken 99% 187: 525: im->type == IMAGING_TYPE_INT32 || branch 0 taken 58% (fallthrough) branch 1 taken 42% -: 526: im->type == IMAGING_TYPE_SPECIAL) { 409542: 527: if (PyLong_Check(color)) { branch 0 taken 55% (fallthrough) branch 1 taken 45% 227221: 528: r = PyLong_AsLongLong(color); call 0 returned 100% 227221: 529: if (r == -1 && PyErr_Occurred()) { branch 0 taken 1% (fallthrough) branch 1 taken 99% call 2 returned 100% branch 3 taken 98% branch 4 taken 2% -: 530: return NULL; -: 531: } -: 532: rIsInt = 1; 182321: 533: } else if (im->type == IMAGING_TYPE_UINT8) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 182312: 534: if (!PyTuple_Check(color)) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 12: 535: PyErr_SetString(PyExc_TypeError, "color must be int or tuple"); call 0 returned 100% 12: 536: return NULL; -: 537: } -: 538: } else { 9: 539: PyErr_SetString(PyExc_TypeError, "color must be int or single-element tuple"); call 0 returned 100% 9: 540: return NULL; -: 541: } -: 542: } -: 543: 409592: 544: switch (im->type) { branch 0 taken 99% branch 1 taken 1% branch 2 taken 1% branch 3 taken 1% branch 4 taken 0% -: 545: case IMAGING_TYPE_UINT8: -: 546: /* unsigned integer */ 409318: 547: if (im->bands == 1) { branch 0 taken 55% (fallthrough) branch 1 taken 45% -: 548: /* unsigned integer, single layer */ 226051: 549: if (rIsInt != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 550: if (!PyArg_ParseTuple(color, "L", &r)) { call 0 never executed branch 1 never executed branch 2 never executed -: 551: return NULL; -: 552: } -: 553: } 226051: 554: ink[0] = (char) CLIP8(r); branch 0 taken 82% (fallthrough) branch 1 taken 18% branch 2 taken 99% (fallthrough) branch 3 taken 1% 226051: 555: ink[1] = ink[2] = ink[3] = 0; -: 556: } else { 183267: 557: a = 255; 183267: 558: if (rIsInt) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 559: /* compatibility: ABGR */ 967: 560: a = (UINT8) (r >> 24); 967: 561: b = (UINT8) (r >> 16); 967: 562: g = (UINT8) (r >> 8); 967: 563: r = (UINT8) r; -: 564: } else { 182300: 565: if (im->bands == 2) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 5185: 566: if (!PyArg_ParseTuple(color, "L|i", &r, &a)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 567: return NULL; -: 568: } 5185: 569: g = b = r; -: 570: } else { 177115: 571: if (!PyArg_ParseTuple(color, "Lii|i", &r, &g, &b, &a)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 572: return NULL; -: 573: } -: 574: } -: 575: } 183267: 576: ink[0] = (char) CLIP8(r); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% 183267: 577: ink[1] = (char) CLIP8(g); branch 0 taken 92% (fallthrough) branch 1 taken 8% branch 2 taken 100% (fallthrough) branch 3 taken 0% 183267: 578: ink[2] = (char) CLIP8(b); branch 0 taken 92% (fallthrough) branch 1 taken 8% branch 2 taken 100% (fallthrough) branch 3 taken 0% 183267: 579: ink[3] = (char) CLIP8(a); branch 0 taken 98% (fallthrough) branch 1 taken 2% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 580: } -: 581: return ink; -: 582: case IMAGING_TYPE_INT32: -: 583: /* signed integer */ 95: 584: itmp = r; 95: 585: memcpy(ink, &itmp, sizeof(itmp)); 95: 586: return ink; -: 587: case IMAGING_TYPE_FLOAT32: -: 588: /* floating point */ 78: 589: f = PyFloat_AsDouble(color); call 0 returned 100% 78: 590: if (f == -1.0 && PyErr_Occurred()) { branch 0 taken 0% (fallthrough) branch 1 taken 100% call 2 never executed branch 3 never executed branch 4 never executed -: 591: return NULL; -: 592: } 78: 593: ftmp = f; 78: 594: memcpy(ink, &ftmp, sizeof(ftmp)); 78: 595: return ink; -: 596: case IMAGING_TYPE_SPECIAL: 101: 597: if (strncmp(im->mode, "I;16", 4) == 0) { branch 0 taken 95% (fallthrough) branch 1 taken 5% 96: 598: ink[0] = (UINT8) r; 96: 599: ink[1] = (UINT8) (r >> 8); 96: 600: ink[2] = ink[3] = 0; 96: 601: return ink; -: 602: } -: 603: } -: 604: 5: 605: PyErr_SetString(PyExc_ValueError, wrong_mode); call 0 returned 100% 5: 606: return NULL; -: 607:} -: 608: -: 609:/* -------------------------------------------------------------------- */ -: 610:/* FACTORIES */ -: 611:/* -------------------------------------------------------------------- */ -: 612: -: 613:static PyObject* function _fill called 15843 returned 100% blocks executed 100% 15843: 614:_fill(PyObject* self, PyObject* args) -: 615:{ -: 616: char* mode; -: 617: int xsize, ysize; -: 618: PyObject* color; -: 619: char buffer[4]; -: 620: Imaging im; -: 621: 15843: 622: xsize = ysize = 256; 15843: 623: color = NULL; -: 624: 15843: 625: if (!PyArg_ParseTuple(args, "s|(ii)O", &mode, &xsize, &ysize, &color)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 626: return NULL; -: 627: } -: 628: 15843: 629: im = ImagingNewDirty(mode, xsize, ysize); call 0 returned 100% 15843: 630: if (!im) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 631: return NULL; -: 632: } -: 633: 15837: 634: buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0; 15837: 635: if (color) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 15828: 636: if (!getink(color, im, buffer)) { call 0 returned 100% branch 1 taken 1% (fallthrough) branch 2 taken 99% 4: 637: ImagingDelete(im); call 0 returned 100% 4: 638: return NULL; -: 639: } -: 640: } -: 641: -: 642: 15833: 643: (void) ImagingFill(im, buffer); call 0 returned 100% -: 644: 15833: 645: return PyImagingNew(im); call 0 returned 100% -: 646:} -: 647: -: 648:static PyObject* function _new called 5932 returned 100% blocks executed 100% 5932: 649:_new(PyObject* self, PyObject* args) -: 650:{ -: 651: char* mode; -: 652: int xsize, ysize; -: 653: 5932: 654: if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 655: return NULL; -: 656: } -: 657: 5932: 658: return PyImagingNew(ImagingNew(mode, xsize, ysize)); call 0 returned 100% call 1 returned 100% -: 659:} -: 660: -: 661:static PyObject* function _new_block called 0 returned 0% blocks executed 0% #####: 662:_new_block(PyObject* self, PyObject* args) -: 663:{ -: 664: char* mode; -: 665: int xsize, ysize; -: 666: #####: 667: if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) { call 0 never executed branch 1 never executed branch 2 never executed -: 668: return NULL; -: 669: } -: 670: #####: 671: return PyImagingNew(ImagingNewBlock(mode, xsize, ysize)); call 0 never executed call 1 never executed -: 672:} -: 673: -: 674:static PyObject* function _linear_gradient called 12 returned 100% blocks executed 100% 12: 675:_linear_gradient(PyObject* self, PyObject* args) -: 676:{ -: 677: char* mode; -: 678: 12: 679: if (!PyArg_ParseTuple(args, "s", &mode)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 680: return NULL; -: 681: } -: 682: 12: 683: return PyImagingNew(ImagingFillLinearGradient(mode)); call 0 returned 100% call 1 returned 100% -: 684:} -: 685: -: 686:static PyObject* function _radial_gradient called 3 returned 100% blocks executed 100% 3: 687:_radial_gradient(PyObject* self, PyObject* args) -: 688:{ -: 689: char* mode; -: 690: 3: 691: if (!PyArg_ParseTuple(args, "s", &mode)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 692: return NULL; -: 693: } -: 694: 3: 695: return PyImagingNew(ImagingFillRadialGradient(mode)); call 0 returned 100% call 1 returned 100% -: 696:} -: 697: -: 698:static PyObject* function _alpha_composite called 6 returned 100% blocks executed 100% 6: 699:_alpha_composite(ImagingObject* self, PyObject* args) -: 700:{ -: 701: ImagingObject* imagep1; -: 702: ImagingObject* imagep2; -: 703: 6: 704: if (!PyArg_ParseTuple(args, "O!O!", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 705: &Imaging_Type, &imagep1, -: 706: &Imaging_Type, &imagep2)) { -: 707: return NULL; -: 708: } -: 709: 6: 710: return PyImagingNew(ImagingAlphaComposite(imagep1->image, imagep2->image)); call 0 returned 100% call 1 returned 100% -: 711:} -: 712: -: 713:static PyObject* function _blend called 19 returned 100% blocks executed 100% 19: 714:_blend(ImagingObject* self, PyObject* args) -: 715:{ -: 716: ImagingObject* imagep1; -: 717: ImagingObject* imagep2; -: 718: double alpha; -: 719: 19: 720: alpha = 0.5; 19: 721: if (!PyArg_ParseTuple(args, "O!O!|d", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 722: &Imaging_Type, &imagep1, -: 723: &Imaging_Type, &imagep2, -: 724: &alpha)) { -: 725: return NULL; -: 726: } -: 727: 19: 728: return PyImagingNew(ImagingBlend(imagep1->image, imagep2->image, call 0 returned 100% call 1 returned 100% -: 729: (float) alpha)); -: 730:} -: 731: -: 732:/* -------------------------------------------------------------------- */ -: 733:/* METHODS */ -: 734:/* -------------------------------------------------------------------- */ -: 735: -: 736:static INT16* function _prepare_lut_table called 44 returned 100% blocks executed 92% 44: 737:_prepare_lut_table(PyObject* table, Py_ssize_t table_size) -: 738:{ -: 739: int i; -: 740: Py_buffer buffer_info; 44: 741: INT32 data_type = TYPE_FLOAT32; 44: 742: float item = 0; 44: 743: void* table_data = NULL; 44: 744: int free_table_data = 0; -: 745: INT16* prepared; -: 746: -: 747: /* NOTE: This value should be the same as in ColorLUT.c */ -: 748: #define PRECISION_BITS (16 - 8 - 2) -: 749: 44: 750: const char* wrong_size = ("The table should have table_channels * " -: 751: "size1D * size2D * size3D float items."); -: 752: 44: 753: if (PyObject_CheckBuffer(table)) { branch 0 taken 18% (fallthrough) branch 1 taken 82% branch 2 taken 100% (fallthrough) branch 3 taken 0% 8: 754: if ( ! PyObject_GetBuffer(table, &buffer_info, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 755: PyBUF_CONTIG_RO | PyBUF_FORMAT)) { 8: 756: if (buffer_info.ndim == 1 && buffer_info.shape[0] == table_size) { branch 0 taken 88% (fallthrough) branch 1 taken 13% branch 2 taken 86% (fallthrough) branch 3 taken 14% 6: 757: if (strlen(buffer_info.format) == 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 758: switch (buffer_info.format[0]) { branch 0 taken 33% branch 1 taken 17% branch 2 taken 17% branch 3 taken 33% -: 759: case 'e': 2: 760: data_type = TYPE_FLOAT16; 2: 761: table_data = buffer_info.buf; 2: 762: break; -: 763: case 'f': 1: 764: data_type = TYPE_FLOAT32; 1: 765: table_data = buffer_info.buf; 1: 766: break; -: 767: case 'd': 1: 768: data_type = TYPE_DOUBLE; 1: 769: table_data = buffer_info.buf; 1: 770: break; -: 771: } -: 772: } -: 773: } 8: 774: PyBuffer_Release(&buffer_info); call 0 returned 100% -: 775: } -: 776: } -: 777: 44: 778: if ( ! table_data) { branch 0 taken 91% (fallthrough) branch 1 taken 9% 40: 779: free_table_data = 1; 40: 780: table_data = getlist(table, &table_size, wrong_size, TYPE_FLOAT32); call 0 returned 100% 40: 781: if ( ! table_data) { branch 0 taken 85% (fallthrough) branch 1 taken 15% -: 782: return NULL; -: 783: } -: 784: } -: 785: -: 786: /* malloc check ok, max is 2 * 4 * 65**3 = 2197000 */ 38: 787: prepared = (INT16*) malloc(sizeof(INT16) * table_size); 38: 788: if ( ! prepared) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 789: if (free_table_data) { branch 0 never executed branch 1 never executed #####: 790: free(table_data); -: 791: } #####: 792: return (INT16*) PyErr_NoMemory(); call 0 never executed -: 793: } -: 794: 85652: 795: for (i = 0; i < table_size; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 796: FLOAT16 htmp; -: 797: double dtmp; 85652: 798: switch (data_type) { branch 0 taken 3% branch 1 taken 94% branch 2 taken 2% branch 3 taken 0% -: 799: case TYPE_FLOAT16: 2709: 800: memcpy(&htmp, ((char*) table_data) + i * sizeof(htmp), sizeof(htmp)); 2709: 801: item = float16tofloat32(htmp); call 0 returned 100% 2709: 802: break; -: 803: case TYPE_FLOAT32: 80864: 804: memcpy(&item, ((char*) table_data) + i * sizeof(FLOAT32), sizeof(FLOAT32)); -: 805: break; -: 806: case TYPE_DOUBLE: 2079: 807: memcpy(&dtmp, ((char*) table_data) + i * sizeof(dtmp), sizeof(dtmp)); 2079: 808: item = (FLOAT32) dtmp; 2079: 809: break; -: 810: } -: 811: /* Max value for INT16 */ 85652: 812: if (item >= (0x7fff - 0.5) / (255 << PRECISION_BITS)) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 12: 813: prepared[i] = 0x7fff; 36: 814: continue; -: 815: } -: 816: /* Min value for INT16 */ 85640: 817: if (item <= (-0x8000 + 0.5) / (255 << PRECISION_BITS)) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 12: 818: prepared[i] = -0x8000; 12: 819: continue; -: 820: } 85628: 821: if (item < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 12: 822: prepared[i] = item * (255 << PRECISION_BITS) - 0.5; -: 823: } else { 85616: 824: prepared[i] = item * (255 << PRECISION_BITS) + 0.5; -: 825: } -: 826: } -: 827: -: 828: #undef PRECISION_BITS 38: 829: if (free_table_data) { branch 0 taken 89% (fallthrough) branch 1 taken 11% 34: 830: free(table_data); -: 831: } -: 832: return prepared; -: 833:} -: 834: -: 835: -: 836:static PyObject* function _color_lut_3d called 48 returned 100% blocks executed 100% 48: 837:_color_lut_3d(ImagingObject* self, PyObject* args) -: 838:{ -: 839: char* mode; -: 840: int filter; -: 841: int table_channels; -: 842: int size1D, size2D, size3D; -: 843: PyObject* table; -: 844: -: 845: INT16* prepared_table; -: 846: Imaging imOut; -: 847: 48: 848: if ( ! PyArg_ParseTuple(args, "siiiiiO:color_lut_3d", &mode, &filter, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 849: &table_channels, &size1D, &size2D, &size3D, -: 850: &table)) { -: 851: return NULL; -: 852: } -: 853: -: 854: /* actually, it is trilinear */ 48: 855: if (filter != IMAGING_TRANSFORM_BILINEAR) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 1: 856: PyErr_SetString(PyExc_ValueError, call 0 returned 100% -: 857: "Only LINEAR filter is supported."); 1: 858: return NULL; -: 859: } -: 860: 47: 861: if (1 > table_channels || table_channels > 4) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 1: 862: PyErr_SetString(PyExc_ValueError, call 0 returned 100% -: 863: "table_channels should be from 1 to 4"); 1: 864: return NULL; -: 865: } -: 866: 90: 867: if (2 > size1D || size1D > 65 || branch 0 taken 96% (fallthrough) branch 1 taken 4% branch 2 taken 100% (fallthrough) branch 3 taken 0% 132: 868: 2 > size2D || size2D > 65 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 88: 869: 2 > size3D || size3D > 65 branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 870: ) { 2: 871: PyErr_SetString(PyExc_ValueError, call 0 returned 100% -: 872: "Table size in any dimension should be from 2 to 65"); 2: 873: return NULL; -: 874: } -: 875: 88: 876: prepared_table = _prepare_lut_table( call 0 returned 100% 44: 877: table, table_channels * size1D * size2D * size3D); 44: 878: if ( ! prepared_table) { branch 0 taken 86% (fallthrough) branch 1 taken 14% -: 879: return NULL; -: 880: } -: 881: 38: 882: imOut = ImagingNewDirty(mode, self->image->xsize, self->image->ysize); call 0 returned 100% 38: 883: if ( ! imOut) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 1: 884: free(prepared_table); 1: 885: return NULL; -: 886: } -: 887: 37: 888: if ( ! ImagingColorLUT3D_linear(imOut, self->image, call 0 returned 100% branch 1 taken 19% (fallthrough) branch 2 taken 81% -: 889: table_channels, size1D, size2D, size3D, -: 890: prepared_table)) { 7: 891: free(prepared_table); 7: 892: ImagingDelete(imOut); call 0 returned 100% 7: 893: return NULL; -: 894: } -: 895: 30: 896: free(prepared_table); -: 897: 30: 898: return PyImagingNew(imOut); call 0 returned 100% -: 899:} -: 900: -: 901:static PyObject* function _convert called 7902 returned 100% blocks executed 67% 7902: 902:_convert(ImagingObject* self, PyObject* args) -: 903:{ -: 904: char* mode; 7902: 905: int dither = 0; 7902: 906: ImagingObject *paletteimage = NULL; -: 907: 7902: 908: if (!PyArg_ParseTuple(args, "s|iO", &mode, &dither, &paletteimage)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 909: return NULL; -: 910: } 7902: 911: if (paletteimage != NULL) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 5: 912: if (!PyImaging_Check(paletteimage)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 913: PyObject_Print((PyObject *)paletteimage, stderr, 0); call 0 never executed #####: 914: PyErr_SetString(PyExc_ValueError, "palette argument must be image with mode 'P'"); call 0 never executed #####: 915: return NULL; -: 916: } 5: 917: if (paletteimage->image->palette == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 918: PyErr_SetString(PyExc_ValueError, "null palette"); call 0 never executed #####: 919: return NULL; -: 920: } -: 921: } -: 922: 7902: 923: return PyImagingNew(ImagingConvert(self->image, mode, paletteimage ? paletteimage->image->palette : NULL, dither)); branch 0 taken 1% (fallthrough) branch 1 taken 99% call 2 returned 100% call 3 returned 100% -: 924:} -: 925: -: 926:static PyObject* function _convert2 called 0 returned 0% blocks executed 0% #####: 927:_convert2(ImagingObject* self, PyObject* args) -: 928:{ -: 929: ImagingObject* imagep1; -: 930: ImagingObject* imagep2; #####: 931: if (!PyArg_ParseTuple(args, "O!O!", call 0 never executed branch 1 never executed branch 2 never executed -: 932: &Imaging_Type, &imagep1, -: 933: &Imaging_Type, &imagep2)) { -: 934: return NULL; -: 935: } -: 936: #####: 937: if (!ImagingConvert2(imagep1->image, imagep2->image)) { call 0 never executed branch 1 never executed branch 2 never executed -: 938: return NULL; -: 939: } -: 940: #####: 941: Py_INCREF(Py_None); #####: 942: return Py_None; -: 943:} -: 944: -: 945:static PyObject* function _convert_matrix called 4 returned 100% blocks executed 100% 4: 946:_convert_matrix(ImagingObject* self, PyObject* args) -: 947:{ -: 948: char* mode; -: 949: float m[12]; 4: 950: if (!PyArg_ParseTuple(args, "s(ffff)", &mode, m+0, m+1, m+2, m+3)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 4: 951: PyErr_Clear(); call 0 returned 100% 4: 952: if (!PyArg_ParseTuple(args, "s(ffffffffffff)", &mode, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 953: m+0, m+1, m+2, m+3, -: 954: m+4, m+5, m+6, m+7, -: 955: m+8, m+9, m+10, m+11)){ -: 956: return NULL; -: 957: } -: 958: } -: 959: 4: 960: return PyImagingNew(ImagingConvertMatrix(self->image, mode, m)); call 0 returned 100% call 1 returned 100% -: 961:} -: 962: -: 963:static PyObject* function _convert_transparent called 8 returned 100% blocks executed 100% 8: 964:_convert_transparent(ImagingObject* self, PyObject* args) -: 965:{ -: 966: char* mode; -: 967: int r,g,b; 8: 968: if (PyArg_ParseTuple(args, "s(iii)", &mode, &r, &g, &b)) { call 0 returned 100% branch 1 taken 25% (fallthrough) branch 2 taken 75% 2: 969: return PyImagingNew(ImagingConvertTransparent(self->image, mode, r, g, b)); call 0 returned 100% call 1 returned 100% -: 970: } 6: 971: PyErr_Clear(); call 0 returned 100% 6: 972: if (PyArg_ParseTuple(args, "si", &mode, &r)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 6: 973: return PyImagingNew(ImagingConvertTransparent(self->image, mode, r, 0, 0)); call 0 returned 100% call 1 returned 100% -: 974: } -: 975: return NULL; -: 976:} -: 977: -: 978:static PyObject* function _copy called 2565 returned 100% blocks executed 100% 2565: 979:_copy(ImagingObject* self, PyObject* args) -: 980:{ 2565: 981: if (!PyArg_ParseTuple(args, "")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 982: return NULL; -: 983: } -: 984: 2565: 985: return PyImagingNew(ImagingCopy(self->image)); call 0 returned 100% call 1 returned 100% -: 986:} -: 987: -: 988:static PyObject* function _crop called 4182 returned 100% blocks executed 100% 4182: 989:_crop(ImagingObject* self, PyObject* args) -: 990:{ -: 991: int x0, y0, x1, y1; 4182: 992: if (!PyArg_ParseTuple(args, "(iiii)", &x0, &y0, &x1, &y1)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 993: return NULL; -: 994: } -: 995: 4182: 996: return PyImagingNew(ImagingCrop(self->image, x0, y0, x1, y1)); call 0 returned 100% call 1 returned 100% -: 997:} -: 998: -: 999:static PyObject* function _expand_image called 47 returned 100% blocks executed 100% 47: 1000:_expand_image(ImagingObject* self, PyObject* args) -: 1001:{ -: 1002: int x, y; 47: 1003: int mode = 0; 47: 1004: if (!PyArg_ParseTuple(args, "ii|i", &x, &y, &mode)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1005: return NULL; -: 1006: } -: 1007: 47: 1008: return PyImagingNew(ImagingExpand(self->image, x, y, mode)); call 0 returned 100% call 1 returned 100% -: 1009:} -: 1010: -: 1011:static PyObject* function _filter called 47 returned 100% blocks executed 92% 47: 1012:_filter(ImagingObject* self, PyObject* args) -: 1013:{ -: 1014: PyObject* imOut; -: 1015: Py_ssize_t kernelsize; -: 1016: FLOAT32* kerneldata; -: 1017: -: 1018: int xsize, ysize, i; -: 1019: float divisor, offset; 47: 1020: PyObject* kernel = NULL; 47: 1021: if (!PyArg_ParseTuple(args, "(ii)ffO", &xsize, &ysize, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1022: &divisor, &offset, &kernel)) { -: 1023: return NULL; -: 1024: } -: 1025: -: 1026: /* get user-defined kernel */ 47: 1027: kerneldata = getlist(kernel, &kernelsize, NULL, TYPE_FLOAT32); call 0 returned 100% 47: 1028: if (!kerneldata) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1029: return NULL; -: 1030: } 47: 1031: if (kernelsize != (Py_ssize_t) xsize * (Py_ssize_t) ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 1032: free(kerneldata); #####: 1033: return ImagingError_ValueError("bad kernel size"); call 0 never executed -: 1034: } -: 1035: 599: 1036: for (i = 0; i < kernelsize; ++i) { branch 0 taken 93% branch 1 taken 7% (fallthrough) 599: 1037: kerneldata[i] /= divisor; -: 1038: } -: 1039: 47: 1040: imOut = PyImagingNew( call 0 returned 100% call 1 returned 100% -: 1041: ImagingFilter(self->image, xsize, ysize, kerneldata, offset) -: 1042: ); -: 1043: 47: 1044: free(kerneldata); -: 1045: 47: 1046: return imOut; -: 1047:} -: 1048: -: 1049:#ifdef WITH_UNSHARPMASK -: 1050:static PyObject* function _gaussian_blur called 15 returned 100% blocks executed 100% 15: 1051:_gaussian_blur(ImagingObject* self, PyObject* args) -: 1052:{ -: 1053: Imaging imIn; -: 1054: Imaging imOut; -: 1055: 15: 1056: float radius = 0; 15: 1057: int passes = 3; 15: 1058: if (!PyArg_ParseTuple(args, "f|i", &radius, &passes)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1059: return NULL; -: 1060: } -: 1061: 15: 1062: imIn = self->image; 15: 1063: imOut = ImagingNewDirty(imIn->mode, imIn->xsize, imIn->ysize); call 0 returned 100% 15: 1064: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1065: return NULL; -: 1066: } -: 1067: 15: 1068: if (!ImagingGaussianBlur(imOut, imIn, radius, passes)) { call 0 returned 100% branch 1 taken 27% (fallthrough) branch 2 taken 73% 4: 1069: ImagingDelete(imOut); call 0 returned 100% 4: 1070: return NULL; -: 1071: } -: 1072: 11: 1073: return PyImagingNew(imOut); call 0 returned 100% -: 1074:} -: 1075:#endif -: 1076: -: 1077:static PyObject* function _getpalette called 906 returned 100% blocks executed 87% 906: 1078:_getpalette(ImagingObject* self, PyObject* args) -: 1079:{ -: 1080: PyObject* palette; 906: 1081: int palettesize = 256; -: 1082: int bits; -: 1083: ImagingShuffler pack; -: 1084: 906: 1085: char* mode = "RGB"; 906: 1086: char* rawmode = "RGB"; 906: 1087: if (!PyArg_ParseTuple(args, "|ss", &mode, &rawmode)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1088: return NULL; -: 1089: } -: 1090: 906: 1091: if (!self->image->palette) { branch 0 taken 57% (fallthrough) branch 1 taken 43% 515: 1092: PyErr_SetString(PyExc_ValueError, no_palette); call 0 returned 100% 515: 1093: return NULL; -: 1094: } -: 1095: 391: 1096: pack = ImagingFindPacker(mode, rawmode, &bits); call 0 returned 100% 391: 1097: if (!pack) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1098: PyErr_SetString(PyExc_ValueError, wrong_raw_mode); call 0 never executed #####: 1099: return NULL; -: 1100: } -: 1101: 391: 1102: palette = PyBytes_FromStringAndSize(NULL, palettesize * bits / 8); call 0 returned 100% 391: 1103: if (!palette) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1104: return NULL; -: 1105: } -: 1106: 782: 1107: pack((UINT8*) PyBytes_AsString(palette), call 0 returned 100% call 1 returned 100% 391: 1108: self->image->palette->palette, palettesize); -: 1109: 391: 1110: return palette; -: 1111:} -: 1112: -: 1113:static PyObject* function _getpalettemode called 98 returned 100% blocks executed 60% 98: 1114:_getpalettemode(ImagingObject* self, PyObject* args) -: 1115:{ 98: 1116: if (!self->image->palette) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1117: PyErr_SetString(PyExc_ValueError, no_palette); call 0 never executed #####: 1118: return NULL; -: 1119: } -: 1120: 98: 1121: return PyUnicode_FromString(self->image->palette->mode); call 0 returned 100% -: 1122:} -: 1123: -: 1124:static inline int function _getxy called 553606 returned 100% blocks executed 43% 553606: 1125:_getxy(PyObject* xy, int* x, int *y) -: 1126:{ -: 1127: PyObject* value; -: 1128: 553606: 1129: if (!PyTuple_Check(xy) || PyTuple_GET_SIZE(xy) != 2) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 1130: goto badarg; -: 1131: } -: 1132: 553606: 1133: value = PyTuple_GET_ITEM(xy, 0); 553606: 1134: if (PyLong_Check(value)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 553606: 1135: *x = PyLong_AS_LONG(value); call 0 returned 100% #####: 1136: } else if (PyFloat_Check(value)) { branch 0 never executed branch 1 never executed call 2 never executed branch 3 never executed branch 4 never executed #####: 1137: *x = (int) PyFloat_AS_DOUBLE(value); -: 1138: } else { -: 1139: goto badval; -: 1140: } -: 1141: 553606: 1142: value = PyTuple_GET_ITEM(xy, 1); 553606: 1143: if (PyLong_Check(value)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 553606: 1144: *y = PyLong_AS_LONG(value); call 0 returned 100% #####: 1145: } else if (PyFloat_Check(value)) { branch 0 never executed branch 1 never executed call 2 never executed branch 3 never executed branch 4 never executed #####: 1146: *y = (int) PyFloat_AS_DOUBLE(value); -: 1147: } else { -: 1148: goto badval; -: 1149: } -: 1150: -: 1151: return 0; -: 1152: -: 1153: badarg: #####: 1154: PyErr_SetString( call 0 never executed -: 1155: PyExc_TypeError, -: 1156: "argument must be sequence of length 2" -: 1157: ); #####: 1158: return -1; -: 1159: -: 1160: badval: #####: 1161: PyErr_SetString( call 0 never executed -: 1162: PyExc_TypeError, -: 1163: "an integer is required" -: 1164: ); #####: 1165: return -1; -: 1166:} -: 1167: -: 1168:static PyObject* function _getpixel called 67946 returned 100% blocks executed 67% 67946: 1169:_getpixel(ImagingObject* self, PyObject* args) -: 1170:{ -: 1171: PyObject* xy; -: 1172: int x, y; -: 1173: 67946: 1174: if (PyTuple_GET_SIZE(args) != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1175: PyErr_SetString( call 0 never executed -: 1176: PyExc_TypeError, -: 1177: "argument 1 must be sequence of length 2" -: 1178: ); #####: 1179: return NULL; -: 1180: } -: 1181: 67946: 1182: xy = PyTuple_GET_ITEM(args, 0); -: 1183: 67946: 1184: if (_getxy(xy, &x, &y)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1185: return NULL; -: 1186: } -: 1187: 67946: 1188: if (self->access == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1189: Py_INCREF(Py_None); #####: 1190: return Py_None; -: 1191: } -: 1192: 67946: 1193: return getpixel(self->image, self->access, x, y); call 0 returned 100% -: 1194:} -: 1195: -: 1196:union hist_extrema { -: 1197: UINT8 u[2]; -: 1198: INT32 i[2]; -: 1199: FLOAT32 f[2]; -: 1200:}; -: 1201: -: 1202:static union hist_extrema* function parse_histogram_extremap.isra.0 called 1919 returned 100% blocks executed 88% 1919: 1203:parse_histogram_extremap(ImagingObject* self, PyObject* extremap, -: 1204: union hist_extrema* ep) -: 1205:{ -: 1206: int i0, i1; -: 1207: double f0, f1; -: 1208: 1919: 1209: if (extremap) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 10: 1210: switch (self->image->type) { branch 0 taken 60% branch 1 taken 20% branch 2 taken 20% branch 3 taken 0% -: 1211: case IMAGING_TYPE_UINT8: 6: 1212: if (!PyArg_ParseTuple(extremap, "ii", &i0, &i1)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1213: return NULL; -: 1214: } 6: 1215: ep->u[0] = CLIP8(i0); branch 0 taken 0% (fallthrough) branch 1 taken 100% 6: 1216: ep->u[1] = CLIP8(i1); branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 1217: break; -: 1218: case IMAGING_TYPE_INT32: 2: 1219: if (!PyArg_ParseTuple(extremap, "ii", &i0, &i1)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1220: return NULL; -: 1221: } 2: 1222: ep->i[0] = i0; 2: 1223: ep->i[1] = i1; -: 1224: break; -: 1225: case IMAGING_TYPE_FLOAT32: 2: 1226: if (!PyArg_ParseTuple(extremap, "dd", &f0, &f1)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1227: return NULL; -: 1228: } 2: 1229: ep->f[0] = (FLOAT32) f0; 2: 1230: ep->f[1] = (FLOAT32) f1; -: 1231: break; -: 1232: default: -: 1233: return NULL; -: 1234: } -: 1235: } else { -: 1236: return NULL; -: 1237: } -: 1238: return ep; -: 1239:} -: 1240: -: 1241:static PyObject* function _histogram called 1909 returned 100% blocks executed 89% 1909: 1242:_histogram(ImagingObject* self, PyObject* args) -: 1243:{ -: 1244: ImagingHistogram h; -: 1245: PyObject* list; -: 1246: int i; -: 1247: union hist_extrema extrema; -: 1248: union hist_extrema* ep; -: 1249: 1909: 1250: PyObject* extremap = NULL; 1909: 1251: ImagingObject* maskp = NULL; 1909: 1252: if (!PyArg_ParseTuple(args, "|OO!", &extremap, &Imaging_Type, &maskp)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1253: return NULL; -: 1254: } -: 1255: -: 1256: /* Using a var to avoid allocations. */ 1909: 1257: ep = parse_histogram_extremap(self, extremap, &extrema); call 0 returned 100% 1909: 1258: h = ImagingGetHistogram(self->image, (maskp) ? maskp->image : NULL, ep); branch 0 taken 1% (fallthrough) branch 1 taken 99% call 2 returned 100% -: 1259: 1909: 1260: if (!h) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1261: return NULL; -: 1262: } -: 1263: -: 1264: /* Build an integer list containing the histogram */ 1909: 1265: list = PyList_New(h->bands * 256); 502901: 1266: for (i = 0; i < h->bands * 256; i++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) -: 1267: PyObject* item; 500992: 1268: item = PyLong_FromLong(h->histogram[i]); call 0 returned 100% 500992: 1269: if (item == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1270: Py_DECREF(list); branch 0 never executed branch 1 never executed call 2 never executed -: 1271: list = NULL; -: 1272: break; -: 1273: } 500992: 1274: PyList_SetItem(list, i, item); call 0 returned 100% -: 1275: } -: 1276: -: 1277: /* Destroy the histogram structure */ 1909: 1278: ImagingHistogramDelete(h); call 0 returned 100% -: 1279: 1909: 1280: return list; -: 1281:} -: 1282: -: 1283:static PyObject* function _entropy called 10 returned 100% blocks executed 94% 10: 1284:_entropy(ImagingObject* self, PyObject* args) -: 1285:{ -: 1286: ImagingHistogram h; -: 1287: int idx, length; -: 1288: long sum; -: 1289: double entropy, fsum, p; -: 1290: union hist_extrema extrema; -: 1291: union hist_extrema* ep; -: 1292: 10: 1293: PyObject* extremap = NULL; 10: 1294: ImagingObject* maskp = NULL; 10: 1295: if (!PyArg_ParseTuple(args, "|OO!", &extremap, &Imaging_Type, &maskp)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1296: return NULL; -: 1297: } -: 1298: -: 1299: /* Using a local var to avoid allocations. */ 10: 1300: ep = parse_histogram_extremap(self, extremap, &extrema); call 0 returned 100% 10: 1301: h = ImagingGetHistogram(self->image, (maskp) ? maskp->image : NULL, ep); branch 0 taken 0% (fallthrough) branch 1 taken 100% call 2 returned 100% -: 1302: 10: 1303: if (!h) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1304: return NULL; -: 1305: } -: 1306: -: 1307: /* Calculate the histogram entropy */ -: 1308: /* First, sum the histogram data */ 10: 1309: length = h->bands * 256; 10: 1310: sum = 0; 5642: 1311: for (idx = 0; idx < length; idx++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5632: 1312: sum += h->histogram[idx]; -: 1313: } -: 1314: -: 1315: /* Next, normalize the histogram data, */ -: 1316: /* using the histogram sum value */ 10: 1317: fsum = (double)sum; 10: 1318: entropy = 0.0; 5642: 1319: for (idx = 0; idx < length; idx++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5632: 1320: p = (double)h->histogram[idx] / fsum; 5632: 1321: if (p != 0.0) { branch 0 taken 79% (fallthrough) branch 1 taken 21% 4444: 1322: entropy += p * log(p) * M_LOG2E; -: 1323: } -: 1324: } -: 1325: -: 1326: /* Destroy the histogram structure */ 10: 1327: ImagingHistogramDelete(h); call 0 returned 100% -: 1328: 10: 1329: return PyFloat_FromDouble(-entropy); call 0 returned 100% -: 1330:} -: 1331: -: 1332:#ifdef WITH_MODEFILTER -: 1333:static PyObject* function _modefilter called 20 returned 100% blocks executed 100% 20: 1334:_modefilter(ImagingObject* self, PyObject* args) -: 1335:{ -: 1336: int size; 20: 1337: if (!PyArg_ParseTuple(args, "i", &size)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1338: return NULL; -: 1339: } -: 1340: 20: 1341: return PyImagingNew(ImagingModeFilter(self->image, size)); call 0 returned 100% call 1 returned 100% -: 1342:} -: 1343:#endif -: 1344: -: 1345:static PyObject* function _offset called 5 returned 100% blocks executed 100% 5: 1346:_offset(ImagingObject* self, PyObject* args) -: 1347:{ -: 1348: int xoffset, yoffset; 5: 1349: if (!PyArg_ParseTuple(args, "ii", &xoffset, &yoffset)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1350: return NULL; -: 1351: } -: 1352: 5: 1353: return PyImagingNew(ImagingOffset(self->image, xoffset, yoffset)); call 0 returned 100% call 1 returned 100% -: 1354:} -: 1355: -: 1356:static PyObject* function _paste called 14589 returned 100% blocks executed 100% 14589: 1357:_paste(ImagingObject* self, PyObject* args) -: 1358:{ -: 1359: int status; -: 1360: char ink[4]; -: 1361: -: 1362: PyObject* source; -: 1363: int x0, y0, x1, y1; 14589: 1364: ImagingObject* maskp = NULL; 14589: 1365: if (!PyArg_ParseTuple(args, "O(iiii)|O!", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1366: &source, -: 1367: &x0, &y0, &x1, &y1, -: 1368: &Imaging_Type, &maskp)) { -: 1369: return NULL; -: 1370: } -: 1371: 14589: 1372: if (PyImaging_Check(source)) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 29014: 1373: status = ImagingPaste( call 0 returned 100% branch 1 taken 4% (fallthrough) branch 2 taken 96% call 3 returned 100% -: 1374: self->image, PyImaging_AsImaging(source), 14507: 1375: (maskp) ? maskp->image : NULL, -: 1376: x0, y0, x1, y1 -: 1377: ); -: 1378: -: 1379: } else { 82: 1380: if (!getink(source, self->image, ink)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1381: return NULL; -: 1382: } 164: 1383: status = ImagingFill2( branch 0 taken 29% (fallthrough) branch 1 taken 71% call 2 returned 100% -: 1384: self->image, ink, 82: 1385: (maskp) ? maskp->image : NULL, -: 1386: x0, y0, x1, y1 -: 1387: ); -: 1388: } -: 1389: 14589: 1390: if (status < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1391: return NULL; -: 1392: } -: 1393: 14589: 1394: Py_INCREF(Py_None); 14589: 1395: return Py_None; -: 1396:} -: 1397: -: 1398:static PyObject* function _point called 41 returned 100% blocks executed 72% 41: 1399:_point(ImagingObject* self, PyObject* args) -: 1400:{ -: 1401: static const char* wrong_number = "wrong number of lut entries"; -: 1402: -: 1403: Py_ssize_t n; -: 1404: int i, bands; -: 1405: Imaging im; -: 1406: -: 1407: PyObject* list; -: 1408: char* mode; 41: 1409: if (!PyArg_ParseTuple(args, "Oz", &list, &mode)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1410: return NULL; -: 1411: } -: 1412: 42: 1413: if (mode && !strcmp(mode, "F")) { branch 0 taken 7% (fallthrough) branch 1 taken 93% branch 2 taken 33% (fallthrough) branch 3 taken 67% branch 4 taken 33% (fallthrough) branch 5 taken 67% -: 1414: FLOAT32* data; -: 1415: -: 1416: /* map from 8-bit data to floating point */ 1: 1417: n = 256; 1: 1418: data = getlist(list, &n, wrong_number, TYPE_FLOAT32); call 0 returned 100% 1: 1419: if (!data) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1420: return NULL; -: 1421: } 1: 1422: im = ImagingPoint(self->image, mode, (void*) data); call 0 returned 100% 1: 1423: free(data); -: 1424: 41: 1425: } else if (!strcmp(self->image->mode, "I") && mode && !strcmp(mode, "L")) { branch 0 taken 5% (fallthrough) branch 1 taken 95% branch 2 taken 5% (fallthrough) branch 3 taken 95% branch 4 taken 50% (fallthrough) branch 5 taken 50% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 100% (fallthrough) branch 9 taken 0% -: 1426: UINT8* data; -: 1427: -: 1428: /* map from 16-bit subset of 32-bit data to 8-bit */ -: 1429: /* FIXME: support arbitrary number of entries (requires API change) */ 1: 1430: n = 65536; 1: 1431: data = getlist(list, &n, wrong_number, TYPE_UINT8); call 0 returned 100% 1: 1432: if (!data) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1433: return NULL; -: 1434: } 1: 1435: im = ImagingPoint(self->image, mode, (void*) data); call 0 returned 100% 1: 1436: free(data); -: 1437: -: 1438: } else { -: 1439: INT32* data; -: 1440: UINT8 lut[1024]; -: 1441: 39: 1442: if (mode) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 1: 1443: bands = getbands(mode); call 0 returned 100% 1: 1444: if (bands < 0) { branch 0 taken 100% branch 1 taken 0% 1: 1445: return NULL; -: 1446: } -: 1447: } else { 38: 1448: bands = self->image->bands; -: 1449: } -: 1450: -: 1451: /* map to integer data */ 39: 1452: n = 256 * bands; 39: 1453: data = getlist(list, &n, wrong_number, TYPE_INT32); call 0 returned 100% 39: 1454: if (!data) { branch 0 taken 97% (fallthrough) branch 1 taken 3% -: 1455: return NULL; -: 1456: } -: 1457: 38: 1458: if (mode && !strcmp(mode, "I")) { branch 0 taken 3% (fallthrough) branch 1 taken 97% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 1459: im = ImagingPoint(self->image, mode, (void*) data); call 0 never executed 38: 1460: } else if (mode && bands > 1) { branch 0 taken 3% (fallthrough) branch 1 taken 97% branch 2 taken 100% (fallthrough) branch 3 taken 0% #####: 1461: for (i = 0; i < 256; i++) { branch 0 never executed branch 1 never executed #####: 1462: lut[i*4] = CLIP8(data[i]); branch 0 never executed branch 1 never executed #####: 1463: lut[i*4+1] = CLIP8(data[i+256]); branch 0 never executed branch 1 never executed #####: 1464: lut[i*4+2] = CLIP8(data[i+512]); branch 0 never executed branch 1 never executed #####: 1465: if (n > 768) { branch 0 never executed branch 1 never executed #####: 1466: lut[i*4+3] = CLIP8(data[i+768]); branch 0 never executed branch 1 never executed -: 1467: } -: 1468: } #####: 1469: im = ImagingPoint(self->image, mode, (void*) lut); call 0 never executed -: 1470: } else { -: 1471: /* map individual bands */ 18944: 1472: for (i = 0; i < n; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 18944: 1473: lut[i] = CLIP8(data[i]); branch 0 taken 93% (fallthrough) branch 1 taken 7% -: 1474: } 38: 1475: im = ImagingPoint(self->image, mode, (void*) lut); call 0 returned 100% -: 1476: } 38: 1477: free(data); -: 1478: } -: 1479: 40: 1480: return PyImagingNew(im); call 0 returned 100% -: 1481:} -: 1482: -: 1483:static PyObject* function _point_transform called 4 returned 100% blocks executed 100% 4: 1484:_point_transform(ImagingObject* self, PyObject* args) -: 1485:{ 4: 1486: double scale = 1.0; 4: 1487: double offset = 0.0; 4: 1488: if (!PyArg_ParseTuple(args, "|dd", &scale, &offset)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1489: return NULL; -: 1490: } -: 1491: 4: 1492: return PyImagingNew(ImagingPointTransform(self->image, scale, offset)); call 0 returned 100% call 1 returned 100% -: 1493:} -: 1494: -: 1495:static PyObject* function _putdata called 40 returned 100% blocks executed 67% 40: 1496:_putdata(ImagingObject* self, PyObject* args) -: 1497:{ -: 1498: Imaging image; -: 1499: // i & n are # pixels, require py_ssize_t. x can be as large as n. y, just because. -: 1500: Py_ssize_t n, i, x, y; -: 1501: -: 1502: PyObject* data; 40: 1503: PyObject* seq = NULL; -: 1504: PyObject* op; 40: 1505: double scale = 1.0; 40: 1506: double offset = 0.0; -: 1507: 40: 1508: if (!PyArg_ParseTuple(args, "O|dd", &data, &scale, &offset)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1509: return NULL; -: 1510: } -: 1511: 40: 1512: if (!PySequence_Check(data)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1513: PyErr_SetString(PyExc_TypeError, must_be_sequence); call 0 never executed #####: 1514: return NULL; -: 1515: } -: 1516: 40: 1517: image = self->image; -: 1518: 40: 1519: n = PyObject_Length(data); call 0 returned 100% 40: 1520: if (n > (Py_ssize_t)image->xsize * (Py_ssize_t)image->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1521: PyErr_SetString(PyExc_TypeError, "too many data entries"); call 0 never executed #####: 1522: return NULL; -: 1523: } -: 1524: 40: 1525: if (image->image8) { branch 0 taken 60% (fallthrough) branch 1 taken 40% 24: 1526: if (PyBytes_Check(data)) { branch 0 taken 4% (fallthrough) branch 1 taken 96% -: 1527: unsigned char* p; 1: 1528: p = (unsigned char*) PyBytes_AS_STRING(data); 1: 1529: if (scale == 1.0 && offset == 0.0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 1530: /* Plain string data */ 16: 1531: for (i = y = 0; i < n; i += image->xsize, y++) { branch 0 taken 94% branch 1 taken 6% 16: 1532: x = n - i; 16: 1533: if (x > (int) image->xsize) { branch 0 taken 94% (fallthrough) branch 1 taken 6% 15: 1534: x = image->xsize; -: 1535: } 32: 1536: memcpy(image->image8[y], p+i, x); -: 1537: } -: 1538: } else { -: 1539: /* Scaled and clipped string data */ #####: 1540: for (i = x = y = 0; i < n; i++) { branch 0 never executed branch 1 never executed #####: 1541: image->image8[y][x] = CLIP8((int) (p[i] * scale + offset)); branch 0 never executed branch 1 never executed #####: 1542: if (++x >= (int) image->xsize) { branch 0 never executed branch 1 never executed #####: 1543: x = 0, y++; -: 1544: } -: 1545: } -: 1546: } -: 1547: } else { 23: 1548: seq = PySequence_Fast(data, must_be_sequence); call 0 returned 100% 23: 1549: if (!seq) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1550: PyErr_SetString(PyExc_TypeError, must_be_sequence); call 0 never executed #####: 1551: return NULL; -: 1552: } 23: 1553: if (scale == 1.0 && offset == 0.0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 1554: /* Clipped data */ 4070356: 1555: for (i = x = y = 0; i < n; i++) { branch 0 taken 99% branch 1 taken 1% 4070356: 1556: op = PySequence_Fast_GET_ITEM(seq, i); branch 0 taken 100% (fallthrough) branch 1 taken 0% 4070356: 1557: image->image8[y][x] = (UINT8) CLIP8(PyLong_AsLong(op)); call 0 returned 100% branch 1 taken 94% (fallthrough) branch 2 taken 6% call 3 returned 100% branch 4 taken 100% (fallthrough) branch 5 taken 0% call 6 returned 100% 4070356: 1558: if (++x >= (int) image->xsize){ branch 0 taken 1% (fallthrough) branch 1 taken 99% 5836: 1559: x = 0, y++; -: 1560: } -: 1561: } -: 1562: -: 1563: } else { -: 1564: /* Scaled and clipped data */ #####: 1565: for (i = x = y = 0; i < n; i++) { branch 0 never executed branch 1 never executed #####: 1566: PyObject *op = PySequence_Fast_GET_ITEM(seq, i); branch 0 never executed branch 1 never executed #####: 1567: image->image8[y][x] = CLIP8( call 0 never executed branch 1 never executed branch 2 never executed call 3 never executed branch 4 never executed branch 5 never executed call 6 never executed -: 1568: (int) (PyFloat_AsDouble(op) * scale + offset)); #####: 1569: if (++x >= (int) image->xsize){ branch 0 never executed branch 1 never executed #####: 1570: x = 0, y++; -: 1571: } -: 1572: } -: 1573: } 23: 1574: PyErr_Clear(); /* Avoid weird exceptions */ call 0 returned 100% -: 1575: } -: 1576: } else { -: 1577: /* 32-bit images */ 16: 1578: seq = PySequence_Fast(data, must_be_sequence); call 0 returned 100% 16: 1579: if (!seq) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1580: PyErr_SetString(PyExc_TypeError, must_be_sequence); call 0 never executed #####: 1581: return NULL; -: 1582: } 16: 1583: switch (image->type) { branch 0 taken 25% branch 1 taken 13% branch 2 taken 63% -: 1584: case IMAGING_TYPE_INT32: 16393: 1585: for (i = x = y = 0; i < n; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16393: 1586: op = PySequence_Fast_GET_ITEM(seq, i); branch 0 taken 100% (fallthrough) branch 1 taken 0% 32786: 1587: IMAGING_PIXEL_INT32(image, x, y) = 16393: 1588: (INT32) (PyFloat_AsDouble(op) * scale + offset); call 0 returned 100% 16393: 1589: if (++x >= (int) image->xsize){ branch 0 taken 1% (fallthrough) branch 1 taken 99% 131: 1590: x = 0, y++; -: 1591: } -: 1592: } 2: 1593: PyErr_Clear(); /* Avoid weird exceptions */ call 0 returned 100% 2: 1594: break; -: 1595: case IMAGING_TYPE_FLOAT32: 46393: 1596: for (i = x = y = 0; i < n; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 46393: 1597: op = PySequence_Fast_GET_ITEM(seq, i); branch 0 taken 100% (fallthrough) branch 1 taken 0% 92786: 1598: IMAGING_PIXEL_FLOAT32(image, x, y) = 46393: 1599: (FLOAT32) (PyFloat_AsDouble(op) * scale + offset); call 0 returned 100% 46393: 1600: if (++x >= (int) image->xsize){ branch 0 taken 1% (fallthrough) branch 1 taken 99% 331: 1601: x = 0, y++; -: 1602: } -: 1603: } 4: 1604: PyErr_Clear(); /* Avoid weird exceptions */ call 0 returned 100% 4: 1605: break; -: 1606: default: 32800: 1607: for (i = x = y = 0; i < n; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 1608: union { -: 1609: char ink[4]; -: 1610: INT32 inkint; -: 1611: } u; -: 1612: 32800: 1613: u.inkint = 0; -: 1614: 32800: 1615: op = PySequence_Fast_GET_ITEM(seq, i); branch 0 taken 100% (fallthrough) branch 1 taken 0% 32800: 1616: if (!op || !getink(op, image, u.ink)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% branch 3 taken 0% (fallthrough) branch 4 taken 100% #####: 1617: Py_DECREF(seq); branch 0 never executed branch 1 never executed call 2 never executed #####: 1618: return NULL; -: 1619: } -: 1620: /* FIXME: what about scale and offset? */ 32800: 1621: image->image32[y][x] = u.inkint; 32800: 1622: if (++x >= (int) image->xsize){ branch 0 taken 1% (fallthrough) branch 1 taken 99% 270: 1623: x = 0, y++; -: 1624: } -: 1625: } 10: 1626: PyErr_Clear(); /* Avoid weird exceptions */ call 0 returned 100% 10: 1627: break; -: 1628: } -: 1629: } -: 1630: 40: 1631: Py_XDECREF(seq); branch 0 taken 98% (fallthrough) branch 1 taken 3% branch 2 taken 28% (fallthrough) branch 3 taken 72% call 4 returned 100% -: 1632: 40: 1633: Py_INCREF(Py_None); 40: 1634: return Py_None; -: 1635:} -: 1636: -: 1637:#ifdef WITH_QUANTIZE -: 1638: -: 1639:static PyObject* function _quantize called 25 returned 100% blocks executed 78% 25: 1640:_quantize(ImagingObject* self, PyObject* args) -: 1641:{ 25: 1642: int colours = 256; 25: 1643: int method = 0; 25: 1644: int kmeans = 0; 25: 1645: if (!PyArg_ParseTuple(args, "|iii", &colours, &method, &kmeans)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1646: return NULL; -: 1647: } -: 1648: 25: 1649: if (!self->image->xsize || !self->image->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 1650: /* no content; return an empty image */ #####: 1651: return PyImagingNew( call 0 never executed call 1 never executed -: 1652: ImagingNew("P", self->image->xsize, self->image->ysize) -: 1653: ); -: 1654: } -: 1655: 25: 1656: return PyImagingNew(ImagingQuantize(self->image, colours, method, kmeans)); call 0 returned 100% call 1 returned 100% -: 1657:} -: 1658:#endif -: 1659: -: 1660:static PyObject* function _putpalette called 955 returned 100% blocks executed 88% 955: 1661:_putpalette(ImagingObject* self, PyObject* args) -: 1662:{ -: 1663: ImagingShuffler unpack; -: 1664: int bits; -: 1665: -: 1666: char* rawmode; -: 1667: UINT8* palette; -: 1668: Py_ssize_t palettesize; 955: 1669: if (!PyArg_ParseTuple(args, "sy#", &rawmode, &palette, &palettesize)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1670: return NULL; -: 1671: } -: 1672: 1783: 1673: if (strcmp(self->image->mode, "L") && strcmp(self->image->mode, "LA") && branch 0 taken 13% (fallthrough) branch 1 taken 87% branch 2 taken 87% (fallthrough) branch 3 taken 13% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 99% (fallthrough) branch 9 taken 1% branch 10 taken 2% (fallthrough) branch 11 taken 98% 841: 1674: strcmp(self->image->mode, "P") && strcmp(self->image->mode, "PA")) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 1675: PyErr_SetString(PyExc_ValueError, wrong_mode); call 0 never executed #####: 1676: return NULL; -: 1677: } -: 1678: 955: 1679: unpack = ImagingFindUnpacker("RGB", rawmode, &bits); call 0 returned 100% 955: 1680: if (!unpack) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1681: PyErr_SetString(PyExc_ValueError, wrong_raw_mode); call 0 never executed #####: 1682: return NULL; -: 1683: } -: 1684: 955: 1685: if ( palettesize * 8 / bits > 256) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 1686: PyErr_SetString(PyExc_ValueError, wrong_palette_size); call 0 returned 100% 1: 1687: return NULL; -: 1688: } -: 1689: 954: 1690: ImagingPaletteDelete(self->image->palette); call 0 returned 100% -: 1691: 1908: 1692: strcpy(self->image->mode, strlen(self->image->mode) == 2 ? "PA" : "P"); branch 0 taken 98% (fallthrough) branch 1 taken 2% -: 1693: 954: 1694: self->image->palette = ImagingPaletteNew("RGB"); call 0 returned 100% -: 1695: 954: 1696: unpack(self->image->palette->palette, palette, palettesize * 8 / bits); call 0 returned 100% -: 1697: 954: 1698: Py_INCREF(Py_None); 954: 1699: return Py_None; -: 1700:} -: 1701: -: 1702:static PyObject* function _putpalettealpha called 404 returned 100% blocks executed 60% 404: 1703:_putpalettealpha(ImagingObject* self, PyObject* args) -: 1704:{ -: 1705: int index; 404: 1706: int alpha = 0; 404: 1707: if (!PyArg_ParseTuple(args, "i|i", &index, &alpha)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1708: return NULL; -: 1709: } -: 1710: 404: 1711: if (!self->image->palette) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1712: PyErr_SetString(PyExc_ValueError, no_palette); call 0 never executed #####: 1713: return NULL; -: 1714: } -: 1715: 404: 1716: if (index < 0 || index >= 256) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1717: PyErr_SetString(PyExc_ValueError, outside_palette); call 0 never executed #####: 1718: return NULL; -: 1719: } -: 1720: 808: 1721: strcpy(self->image->palette->mode, "RGBA"); 404: 1722: self->image->palette->palette[index*4+3] = (UINT8) alpha; -: 1723: 404: 1724: Py_INCREF(Py_None); 404: 1725: return Py_None; -: 1726:} -: 1727: -: 1728:static PyObject* function _putpalettealphas called 31 returned 100% blocks executed 69% 31: 1729:_putpalettealphas(ImagingObject* self, PyObject* args) -: 1730:{ -: 1731: int i; -: 1732: UINT8 *values; -: 1733: Py_ssize_t length; 31: 1734: if (!PyArg_ParseTuple(args, "y#", &values, &length)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1735: return NULL; -: 1736: } -: 1737: 31: 1738: if (!self->image->palette) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1739: PyErr_SetString(PyExc_ValueError, no_palette); call 0 never executed #####: 1740: return NULL; -: 1741: } -: 1742: 31: 1743: if (length > 256) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1744: PyErr_SetString(PyExc_ValueError, outside_palette); call 0 never executed #####: 1745: return NULL; -: 1746: } -: 1747: 62: 1748: strcpy(self->image->palette->mode, "RGBA"); 7459: 1749: for (i=0; iimage->palette->palette[i*4+3] = (UINT8) values[i]; -: 1751: } -: 1752: 31: 1753: Py_INCREF(Py_None); 31: 1754: return Py_None; -: 1755:} -: 1756: -: 1757:static PyObject* function _putpixel called 91439 returned 100% blocks executed 100% 91439: 1758:_putpixel(ImagingObject* self, PyObject* args) -: 1759:{ -: 1760: Imaging im; -: 1761: char ink[4]; -: 1762: -: 1763: int x, y; -: 1764: PyObject* color; 91439: 1765: if (!PyArg_ParseTuple(args, "(ii)O", &x, &y, &color)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1766: return NULL; -: 1767: } -: 1768: 91439: 1769: im = self->image; -: 1770: 91439: 1771: if (x < 0) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 32834: 1772: x = im->xsize + x; -: 1773: } 91439: 1774: if (y < 0) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 32834: 1775: y = im->ysize + y; -: 1776: } -: 1777: 91439: 1778: if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% 88: 1779: PyErr_SetString(PyExc_IndexError, outside_image); call 0 returned 100% 88: 1780: return NULL; -: 1781: } -: 1782: 91351: 1783: if (!getink(color, im, ink)) { call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 1784: return NULL; -: 1785: } -: 1786: 91322: 1787: if (self->access) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 91322: 1788: self->access->put_pixel(im, x, y, ink); call 0 returned 100% -: 1789: } -: 1790: 91322: 1791: Py_INCREF(Py_None); 91322: 1792: return Py_None; -: 1793:} -: 1794: -: 1795:#ifdef WITH_RANKFILTER -: 1796:static PyObject* function _rankfilter called 45 returned 100% blocks executed 100% 45: 1797:_rankfilter(ImagingObject* self, PyObject* args) -: 1798:{ -: 1799: int size, rank; 45: 1800: if (!PyArg_ParseTuple(args, "ii", &size, &rank)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1801: return NULL; -: 1802: } -: 1803: 45: 1804: return PyImagingNew(ImagingRankFilter(self->image, size, rank)); call 0 returned 100% call 1 returned 100% -: 1805:} -: 1806:#endif -: 1807: -: 1808:static PyObject* function _resize called 11059 returned 100% blocks executed 100% 11059: 1809:_resize(ImagingObject* self, PyObject* args) -: 1810:{ -: 1811: Imaging imIn; -: 1812: Imaging imOut; -: 1813: -: 1814: int xsize, ysize; 11059: 1815: int filter = IMAGING_TRANSFORM_NEAREST; 11059: 1816: float box[4] = {0, 0, 0, 0}; -: 1817: 11059: 1818: imIn = self->image; 11059: 1819: box[2] = imIn->xsize; 11059: 1820: box[3] = imIn->ysize; -: 1821: 11059: 1822: if (!PyArg_ParseTuple(args, "(ii)|i(ffff)", &xsize, &ysize, &filter, call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 1823: &box[0], &box[1], &box[2], &box[3])) { -: 1824: return NULL; -: 1825: } -: 1826: 11053: 1827: if (xsize < 1 || ysize < 1) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 2: 1828: return ImagingError_ValueError("height and width must be > 0"); call 0 returned 100% -: 1829: } -: 1830: 11051: 1831: if (box[0] < 0 || box[1] < 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 12: 1832: return ImagingError_ValueError("box offset can't be negative"); call 0 returned 100% -: 1833: } -: 1834: 11039: 1835: if (box[2] > imIn->xsize || box[3] > imIn->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 12: 1836: return ImagingError_ValueError("box can't exceed original image size"); call 0 returned 100% -: 1837: } -: 1838: 11027: 1839: if (box[2] - box[0] < 0 || box[3] - box[1] < 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 18: 1840: return ImagingError_ValueError("box can't be empty"); call 0 returned 100% -: 1841: } -: 1842: -: 1843: // If box's coordinates are int and box size matches requested size 11009: 1844: if (box[0] - (int) box[0] == 0 && box[2] - box[0] == xsize branch 0 taken 9% (fallthrough) branch 1 taken 91% branch 2 taken 10% (fallthrough) branch 3 taken 90% 104: 1845: && box[1] - (int) box[1] == 0 && box[3] - box[1] == ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 23% (fallthrough) branch 3 taken 77% 24: 1846: imOut = ImagingCrop(imIn, box[0], box[1], box[2], box[3]); call 0 returned 100% -: 1847: } 10985: 1848: else if (filter == IMAGING_TRANSFORM_NEAREST) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 1849: double a[6]; -: 1850: 110: 1851: memset(a, 0, sizeof a); 110: 1852: a[0] = (double) (box[2] - box[0]) / xsize; 110: 1853: a[4] = (double) (box[3] - box[1]) / ysize; 110: 1854: a[2] = box[0]; 110: 1855: a[5] = box[1]; -: 1856: 110: 1857: imOut = ImagingNewDirty(imIn->mode, xsize, ysize); call 0 returned 100% -: 1858: 110: 1859: imOut = ImagingTransform( call 0 returned 100% -: 1860: imOut, imIn, IMAGING_TRANSFORM_AFFINE, -: 1861: 0, 0, xsize, ysize, -: 1862: a, filter, 1); -: 1863: } -: 1864: else { 10875: 1865: imOut = ImagingResample(imIn, xsize, ysize, filter, box); call 0 returned 100% -: 1866: } -: 1867: 11009: 1868: return PyImagingNew(imOut); call 0 returned 100% -: 1869:} -: 1870: -: 1871:static PyObject* function _reduce called 513 returned 100% blocks executed 100% 513: 1872:_reduce(ImagingObject* self, PyObject* args) -: 1873:{ -: 1874: Imaging imIn; -: 1875: Imaging imOut; -: 1876: -: 1877: int xscale, yscale; 513: 1878: int box[4] = {0, 0, 0, 0}; -: 1879: 513: 1880: imIn = self->image; 513: 1881: box[2] = imIn->xsize; 513: 1882: box[3] = imIn->ysize; -: 1883: 513: 1884: if (!PyArg_ParseTuple(args, "(ii)|(iiii)", &xscale, &yscale, call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 1885: &box[0], &box[1], &box[2], &box[3])) { -: 1886: return NULL; -: 1887: } -: 1888: 511: 1889: if (xscale < 1 || yscale < 1) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 0% (fallthrough) branch 3 taken 100% 2: 1890: return ImagingError_ValueError("scale must be > 0"); call 0 returned 100% -: 1891: } -: 1892: 509: 1893: if (box[0] < 0 || box[1] < 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 2: 1894: return ImagingError_ValueError("box offset can't be negative"); call 0 returned 100% -: 1895: } -: 1896: 507: 1897: if (box[2] > imIn->xsize || box[3] > imIn->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 2: 1898: return ImagingError_ValueError("box can't exceed original image size"); call 0 returned 100% -: 1899: } -: 1900: 505: 1901: if (box[2] <= box[0] || box[3] <= box[1]) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 2: 1902: return ImagingError_ValueError("box can't be empty"); call 0 returned 100% -: 1903: } -: 1904: 503: 1905: if (xscale == 1 && yscale == 1) { branch 0 taken 22% (fallthrough) branch 1 taken 78% branch 2 taken 7% (fallthrough) branch 3 taken 93% 8: 1906: imOut = ImagingCrop(imIn, box[0], box[1], box[2], box[3]); call 0 returned 100% -: 1907: } else { -: 1908: // Change box format: (left, top, width, height) 495: 1909: box[2] -= box[0]; 495: 1910: box[3] -= box[1]; 495: 1911: imOut = ImagingReduce(imIn, xscale, yscale, box); call 0 returned 100% -: 1912: } -: 1913: 503: 1914: return PyImagingNew(imOut); call 0 returned 100% -: 1915:} -: 1916: -: 1917: -: 1918:#define IS_RGB(mode)\ -: 1919: (!strcmp(mode, "RGB") || !strcmp(mode, "RGBA") || !strcmp(mode, "RGBX")) -: 1920: -: 1921:static PyObject* function im_setmode called 22 returned 100% blocks executed 100% 22: 1922:im_setmode(ImagingObject* self, PyObject* args) -: 1923:{ -: 1924: /* attempt to modify the mode of an image in place */ -: 1925: -: 1926: Imaging im; -: 1927: -: 1928: char* mode; -: 1929: Py_ssize_t modelen; 22: 1930: if (!PyArg_ParseTuple(args, "s#:setmode", &mode, &modelen)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1931: return NULL; -: 1932: } -: 1933: 22: 1934: im = self->image; -: 1935: -: 1936: /* move all logic in here to the libImaging primitive */ -: 1937: 22: 1938: if (!strcmp(im->mode, mode)) { branch 0 taken 86% (fallthrough) branch 1 taken 14% -: 1939: ; /* same mode; always succeeds */ 19: 1940: } else if (IS_RGB(im->mode) && IS_RGB(mode)) { branch 0 taken 79% (fallthrough) branch 1 taken 21% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 32% (fallthrough) branch 7 taken 68% branch 8 taken 83% (fallthrough) branch 9 taken 17% branch 10 taken 20% (fallthrough) branch 11 taken 80% branch 12 taken 93% (fallthrough) branch 13 taken 7% branch 14 taken 100% (fallthrough) branch 15 taken 0% branch 16 taken 100% (fallthrough) branch 17 taken 0% branch 18 taken 93% (fallthrough) branch 19 taken 7% branch 20 taken 21% (fallthrough) branch 21 taken 79% branch 22 taken 33% (fallthrough) branch 23 taken 67% -: 1941: /* color to color */ 26: 1942: strcpy(im->mode, mode); 13: 1943: im->bands = modelen; 13: 1944: if (!strcmp(mode, "RGBA")) { branch 0 taken 85% (fallthrough) branch 1 taken 15% 11: 1945: (void) ImagingFillBand(im, 3, 255); call 0 returned 100% -: 1946: } -: 1947: } else { -: 1948: /* trying doing an in-place conversion */ 6: 1949: if (!ImagingConvertInPlace(im, mode)) { call 0 returned 100% branch 1 taken 33% (fallthrough) branch 2 taken 67% -: 1950: return NULL; -: 1951: } -: 1952: } -: 1953: -: 1954: if (self->access) { -: 1955: ImagingAccessDelete(im, self->access); -: 1956: } 18: 1957: self->access = ImagingAccessNew(im); call 0 returned 100% -: 1958: 18: 1959: Py_INCREF(Py_None); 18: 1960: return Py_None; -: 1961:} -: 1962: -: 1963: -: 1964:static PyObject* function _transform2 called 274 returned 100% blocks executed 92% 274: 1965:_transform2(ImagingObject* self, PyObject* args) -: 1966:{ -: 1967: static const char* wrong_number = "wrong number of matrix entries"; -: 1968: -: 1969: Imaging imOut; -: 1970: Py_ssize_t n; -: 1971: double *a; -: 1972: -: 1973: ImagingObject* imagep; -: 1974: int x0, y0, x1, y1; -: 1975: int method; -: 1976: PyObject* data; 274: 1977: int filter = IMAGING_TRANSFORM_NEAREST; 274: 1978: int fill = 1; 274: 1979: if (!PyArg_ParseTuple(args, "(iiii)O!iO|ii", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1980: &x0, &y0, &x1, &y1, -: 1981: &Imaging_Type, &imagep, -: 1982: &method, &data, -: 1983: &filter, &fill)) { -: 1984: return NULL; -: 1985: } -: 1986: 274: 1987: switch (method) { branch 0 taken 75% branch 1 taken 22% branch 2 taken 3% branch 3 taken 0% -: 1988: case IMAGING_TRANSFORM_AFFINE: 205: 1989: n = 6; 205: 1990: break; -: 1991: case IMAGING_TRANSFORM_PERSPECTIVE: 60: 1992: n = 8; 60: 1993: break; -: 1994: case IMAGING_TRANSFORM_QUAD: 9: 1995: n = 8; 9: 1996: break; -: 1997: default: #####: 1998: n = -1; /* force error */ -: 1999: } -: 2000: 274: 2001: a = getlist(data, &n, wrong_number, TYPE_DOUBLE); call 0 returned 100% 274: 2002: if (!a) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2003: return NULL; -: 2004: } -: 2005: 548: 2006: imOut = ImagingTransform( call 0 returned 100% 274: 2007: self->image, imagep->image, method, -: 2008: x0, y0, x1, y1, a, filter, fill); -: 2009: 274: 2010: free(a); -: 2011: 274: 2012: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2013: return NULL; -: 2014: } -: 2015: 274: 2016: Py_INCREF(Py_None); 274: 2017: return Py_None; -: 2018:} -: 2019: -: 2020:static PyObject* function _transpose called 283 returned 100% blocks executed 87% 283: 2021:_transpose(ImagingObject* self, PyObject* args) -: 2022:{ -: 2023: Imaging imIn; -: 2024: Imaging imOut; -: 2025: -: 2026: int op; 283: 2027: if (!PyArg_ParseTuple(args, "i", &op)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2028: return NULL; -: 2029: } -: 2030: 283: 2031: imIn = self->image; -: 2032: 283: 2033: switch (op) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 43% (fallthrough) branch 3 taken 57% branch 4 taken 0% (fallthrough) branch 5 taken 100% -: 2034: case 0: /* flip left right */ -: 2035: case 1: /* flip top bottom */ -: 2036: case 3: /* rotate 180 */ 122: 2037: imOut = ImagingNewDirty(imIn->mode, imIn->xsize, imIn->ysize); call 0 returned 100% 122: 2038: break; -: 2039: case 2: /* rotate 90 */ -: 2040: case 4: /* rotate 270 */ -: 2041: case 5: /* transpose */ -: 2042: case 6: /* transverse */ 161: 2043: imOut = ImagingNewDirty(imIn->mode, imIn->ysize, imIn->xsize); call 0 returned 100% 161: 2044: break; -: 2045: default: #####: 2046: PyErr_SetString(PyExc_ValueError, "No such transpose operation"); call 0 never executed #####: 2047: return NULL; -: 2048: } -: 2049: 283: 2050: if (imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 283: 2051: switch (op) { branch 0 taken 12% branch 1 taken 11% branch 2 taken 24% branch 3 taken 20% branch 4 taken 16% branch 5 taken 8% branch 6 taken 8% branch 7 taken 0% -: 2052: case 0: 33: 2053: (void) ImagingFlipLeftRight(imOut, imIn); call 0 returned 100% 33: 2054: break; -: 2055: case 1: 31: 2056: (void) ImagingFlipTopBottom(imOut, imIn); call 0 returned 100% 31: 2057: break; -: 2058: case 2: 68: 2059: (void) ImagingRotate90(imOut, imIn); call 0 returned 100% 68: 2060: break; -: 2061: case 3: 58: 2062: (void) ImagingRotate180(imOut, imIn); call 0 returned 100% 58: 2063: break; -: 2064: case 4: 45: 2065: (void) ImagingRotate270(imOut, imIn); call 0 returned 100% 45: 2066: break; -: 2067: case 5: 24: 2068: (void) ImagingTranspose(imOut, imIn); call 0 returned 100% 24: 2069: break; -: 2070: case 6: 24: 2071: (void) ImagingTransverse(imOut, imIn); call 0 returned 100% 24: 2072: break; -: 2073: } -: 2074: } -: 2075: 283: 2076: return PyImagingNew(imOut); call 0 returned 100% -: 2077:} -: 2078: -: 2079:#ifdef WITH_UNSHARPMASK -: 2080:static PyObject* function _unsharp_mask called 16 returned 100% blocks executed 100% 16: 2081:_unsharp_mask(ImagingObject* self, PyObject* args) -: 2082:{ -: 2083: Imaging imIn; -: 2084: Imaging imOut; -: 2085: -: 2086: float radius; -: 2087: int percent, threshold; 16: 2088: if (!PyArg_ParseTuple(args, "fii", &radius, &percent, &threshold)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2089: return NULL; -: 2090: } -: 2091: 16: 2092: imIn = self->image; 16: 2093: imOut = ImagingNewDirty(imIn->mode, imIn->xsize, imIn->ysize); call 0 returned 100% 16: 2094: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2095: return NULL; -: 2096: } -: 2097: 16: 2098: if (!ImagingUnsharpMask(imOut, imIn, radius, percent, threshold)) { call 0 returned 100% branch 1 taken 75% (fallthrough) branch 2 taken 25% -: 2099: return NULL; -: 2100: } -: 2101: 12: 2102: return PyImagingNew(imOut); call 0 returned 100% -: 2103:} -: 2104:#endif -: 2105: -: 2106:static PyObject* function _box_blur called 40 returned 100% blocks executed 100% 40: 2107:_box_blur(ImagingObject* self, PyObject* args) -: 2108:{ -: 2109: Imaging imIn; -: 2110: Imaging imOut; -: 2111: -: 2112: float radius; 40: 2113: int n = 1; 40: 2114: if (!PyArg_ParseTuple(args, "f|i", &radius, &n)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2115: return NULL; -: 2116: } -: 2117: 40: 2118: imIn = self->image; 40: 2119: imOut = ImagingNewDirty(imIn->mode, imIn->xsize, imIn->ysize); call 0 returned 100% 40: 2120: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2121: return NULL; -: 2122: } -: 2123: 40: 2124: if (!ImagingBoxBlur(imOut, imIn, radius, n)) { call 0 returned 100% branch 1 taken 13% (fallthrough) branch 2 taken 88% 5: 2125: ImagingDelete(imOut); call 0 returned 100% 5: 2126: return NULL; -: 2127: } -: 2128: 35: 2129: return PyImagingNew(imOut); call 0 returned 100% -: 2130:} -: 2131: -: 2132:/* -------------------------------------------------------------------- */ -: 2133: -: 2134:static PyObject* function _isblock called 0 returned 0% blocks executed 0% #####: 2135:_isblock(ImagingObject* self, PyObject* args) -: 2136:{ #####: 2137: return PyBool_FromLong(self->image->block != NULL); call 0 never executed -: 2138:} -: 2139: -: 2140:static PyObject* function _getbbox called 158 returned 100% blocks executed 100% 158: 2141:_getbbox(ImagingObject* self, PyObject* args) -: 2142:{ -: 2143: int bbox[4]; 158: 2144: if (!ImagingGetBBox(self->image, bbox)) { call 0 returned 100% branch 1 taken 18% (fallthrough) branch 2 taken 82% 29: 2145: Py_INCREF(Py_None); 29: 2146: return Py_None; -: 2147: } -: 2148: 129: 2149: return Py_BuildValue("iiii", bbox[0], bbox[1], bbox[2], bbox[3]); call 0 returned 100% -: 2150:} -: 2151: -: 2152:static PyObject* function _getcolors called 20 returned 100% blocks executed 100% 20: 2153:_getcolors(ImagingObject* self, PyObject* args) -: 2154:{ -: 2155: ImagingColorItem* items; -: 2156: int i, colors; -: 2157: PyObject* out; -: 2158: 20: 2159: int maxcolors = 256; 20: 2160: if (!PyArg_ParseTuple(args, "i:getcolors", &maxcolors)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2161: return NULL; -: 2162: } -: 2163: 20: 2164: items = ImagingGetColors(self->image, maxcolors, &colors); call 0 returned 100% 20: 2165: if (!items) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2166: return NULL; -: 2167: } -: 2168: 20: 2169: if (colors > maxcolors) { branch 0 taken 30% (fallthrough) branch 1 taken 70% 6: 2170: out = Py_None; 6: 2171: Py_INCREF(out); -: 2172: } else { 14: 2173: out = PyList_New(colors); 50274: 2174: for (i = 0; i < colors; i++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 50260: 2175: ImagingColorItem* v = &items[i]; 50260: 2176: PyObject* item = Py_BuildValue( call 0 returned 100% call 1 returned 100% -: 2177: "iN", v->count, getpixel(self->image, self->access, v->x, v->y) -: 2178: ); 50260: 2179: PyList_SetItem(out, i, item); call 0 returned 100% -: 2180: } -: 2181: } -: 2182: 20: 2183: free(items); -: 2184: 20: 2185: return out; -: 2186:} -: 2187: -: 2188:static PyObject* function _getextrema called 29 returned 100% blocks executed 91% 29: 2189:_getextrema(ImagingObject* self, PyObject* args) -: 2190:{ -: 2191: union { -: 2192: UINT8 u[2]; -: 2193: INT32 i[2]; -: 2194: FLOAT32 f[2]; -: 2195: UINT16 s[2]; -: 2196: } extrema; -: 2197: int status; -: 2198: 29: 2199: status = ImagingGetExtrema(self->image, &extrema); call 0 returned 100% 29: 2200: if (status < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2201: return NULL; -: 2202: } -: 2203: 29: 2204: if (status) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 29: 2205: switch (self->image->type) { branch 0 taken 62% branch 1 taken 14% branch 2 taken 17% branch 3 taken 7% branch 4 taken 0% -: 2206: case IMAGING_TYPE_UINT8: 18: 2207: return Py_BuildValue("BB", extrema.u[0], extrema.u[1]); call 0 returned 100% -: 2208: case IMAGING_TYPE_INT32: 4: 2209: return Py_BuildValue("ii", extrema.i[0], extrema.i[1]); call 0 returned 100% -: 2210: case IMAGING_TYPE_FLOAT32: 5: 2211: return Py_BuildValue("dd", extrema.f[0], extrema.f[1]); call 0 returned 100% -: 2212: case IMAGING_TYPE_SPECIAL: 2: 2213: if (strcmp(self->image->mode, "I;16") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 2: 2214: return Py_BuildValue("HH", extrema.s[0], extrema.s[1]); call 0 returned 100% -: 2215: } -: 2216: } -: 2217: } -: 2218: #####: 2219: Py_INCREF(Py_None); #####: 2220: return Py_None; -: 2221:} -: 2222: -: 2223:static PyObject* function _getprojection called 10 returned 100% blocks executed 86% 10: 2224:_getprojection(ImagingObject* self, PyObject* args) -: 2225:{ -: 2226: unsigned char* xprofile; -: 2227: unsigned char* yprofile; -: 2228: PyObject* result; -: 2229: -: 2230: /* malloc check ok */ 10: 2231: xprofile = malloc(self->image->xsize); 10: 2232: yprofile = malloc(self->image->ysize); -: 2233: 10: 2234: if (xprofile == NULL || yprofile == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 2235: free(xprofile); #####: 2236: free(yprofile); #####: 2237: return PyErr_NoMemory(); call 0 never executed -: 2238: } -: 2239: 10: 2240: ImagingGetProjection(self->image, (unsigned char *)xprofile, (unsigned char *)yprofile); call 0 returned 100% -: 2241: 20: 2242: result = Py_BuildValue("y#y#", call 0 returned 100% 10: 2243: xprofile, (Py_ssize_t)self->image->xsize, 10: 2244: yprofile, (Py_ssize_t)self->image->ysize); -: 2245: 10: 2246: free(xprofile); 10: 2247: free(yprofile); -: 2248: 10: 2249: return result; -: 2250:} -: 2251: -: 2252:/* -------------------------------------------------------------------- */ -: 2253: -: 2254:static PyObject* function _getband called 159 returned 100% blocks executed 100% 159: 2255:_getband(ImagingObject* self, PyObject* args) -: 2256:{ -: 2257: int band; -: 2258: 159: 2259: if (!PyArg_ParseTuple(args, "i", &band)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2260: return NULL; -: 2261: } -: 2262: 159: 2263: return PyImagingNew(ImagingGetBand(self->image, band)); call 0 returned 100% call 1 returned 100% -: 2264:} -: 2265: -: 2266:static PyObject* function _fillband called 9 returned 100% blocks executed 100% 9: 2267:_fillband(ImagingObject* self, PyObject* args) -: 2268:{ -: 2269: int band; -: 2270: int color; -: 2271: 9: 2272: if (!PyArg_ParseTuple(args, "ii", &band, &color)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2273: return NULL; -: 2274: } -: 2275: 9: 2276: if (!ImagingFillBand(self->image, band, color)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2277: return NULL; -: 2278: } -: 2279: 9: 2280: Py_INCREF(Py_None); 9: 2281: return Py_None; -: 2282:} -: 2283: -: 2284:static PyObject* function _putband called 61 returned 100% blocks executed 100% 61: 2285:_putband(ImagingObject* self, PyObject* args) -: 2286:{ -: 2287: ImagingObject* imagep; -: 2288: int band; 61: 2289: if (!PyArg_ParseTuple(args, "O!i", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2290: &Imaging_Type, &imagep, -: 2291: &band)) { -: 2292: return NULL; -: 2293: } -: 2294: 61: 2295: if (!ImagingPutBand(self->image, imagep->image, band)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2296: return NULL; -: 2297: } -: 2298: 61: 2299: Py_INCREF(Py_None); 61: 2300: return Py_None; -: 2301:} -: 2302: -: 2303:static PyObject* function _merge called 252 returned 100% blocks executed 100% 252: 2304:_merge(PyObject* self, PyObject* args) -: 2305:{ -: 2306: char* mode; 252: 2307: ImagingObject *band0 = NULL; 252: 2308: ImagingObject *band1 = NULL; 252: 2309: ImagingObject *band2 = NULL; 252: 2310: ImagingObject *band3 = NULL; 252: 2311: Imaging bands[4] = {NULL, NULL, NULL, NULL}; -: 2312: 252: 2313: if (!PyArg_ParseTuple(args, "sO!|O!O!O!", &mode, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2314: &Imaging_Type, &band0, &Imaging_Type, &band1, -: 2315: &Imaging_Type, &band2, &Imaging_Type, &band3)) { -: 2316: return NULL; -: 2317: } -: 2318: 252: 2319: if (band0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 252: 2320: bands[0] = band0->image; -: 2321: } 252: 2322: if (band1) { branch 0 taken 92% (fallthrough) branch 1 taken 8% 232: 2323: bands[1] = band1->image; -: 2324: } 252: 2325: if (band2) { branch 0 taken 81% (fallthrough) branch 1 taken 19% 204: 2326: bands[2] = band2->image; -: 2327: } 252: 2328: if (band3) { branch 0 taken 49% (fallthrough) branch 1 taken 51% 124: 2329: bands[3] = band3->image; -: 2330: } -: 2331: 252: 2332: return PyImagingNew(ImagingMerge(mode, bands)); call 0 returned 100% call 1 returned 100% -: 2333:} -: 2334: -: 2335:static PyObject* function _split called 1221 returned 100% blocks executed 77% 1221: 2336:_split(ImagingObject* self, PyObject* args) -: 2337:{ 1221: 2338: int fails = 0; -: 2339: Py_ssize_t i; -: 2340: PyObject* list; -: 2341: PyObject* imaging_object; 1221: 2342: Imaging bands[4] = {NULL, NULL, NULL, NULL}; -: 2343: 1221: 2344: if ( ! ImagingSplit(self->image, bands)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2345: return NULL; -: 2346: } -: 2347: 1221: 2348: list = PyTuple_New(self->image->bands); 5009: 2349: for (i = 0; i < self->image->bands; i++) { call 0 returned 100% branch 1 taken 76% branch 2 taken 24% (fallthrough) 3788: 2350: imaging_object = PyImagingNew(bands[i]); call 0 returned 100% 3788: 2351: if ( ! imaging_object) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 2352: fails += 1; -: 2353: } 3788: 2354: PyTuple_SET_ITEM(list, i, imaging_object); -: 2355: } 1221: 2356: if (fails) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 2357: Py_DECREF(list); branch 0 never executed branch 1 never executed call 2 never executed -: 2358: list = NULL; -: 2359: } -: 2360: return list; -: 2361:} -: 2362: -: 2363:/* -------------------------------------------------------------------- */ -: 2364: -: 2365:#ifdef WITH_IMAGECHOPS -: 2366: -: 2367:static PyObject* function _chop_invert called 2 returned 100% blocks executed 100% 2: 2368:_chop_invert(ImagingObject* self, PyObject* args) -: 2369:{ 2: 2370: return PyImagingNew(ImagingNegative(self->image)); call 0 returned 100% call 1 returned 100% -: 2371:} -: 2372: -: 2373:static PyObject* function _chop_lighter called 3 returned 100% blocks executed 100% 3: 2374:_chop_lighter(ImagingObject* self, PyObject* args) -: 2375:{ -: 2376: ImagingObject* imagep; -: 2377: 3: 2378: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2379: return NULL; -: 2380: } -: 2381: 3: 2382: return PyImagingNew(ImagingChopLighter(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2383:} -: 2384: -: 2385:static PyObject* function _chop_darker called 3 returned 100% blocks executed 100% 3: 2386:_chop_darker(ImagingObject* self, PyObject* args) -: 2387:{ -: 2388: ImagingObject* imagep; -: 2389: 3: 2390: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2391: return NULL; -: 2392: } -: 2393: 3: 2394: return PyImagingNew(ImagingChopDarker(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2395:} -: 2396: -: 2397:static PyObject* function _chop_difference called 3 returned 100% blocks executed 100% 3: 2398:_chop_difference(ImagingObject* self, PyObject* args) -: 2399:{ -: 2400: ImagingObject* imagep; -: 2401: 3: 2402: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2403: return NULL; -: 2404: } -: 2405: 3: 2406: return PyImagingNew(ImagingChopDifference(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2407:} -: 2408: -: 2409:static PyObject* function _chop_multiply called 4 returned 100% blocks executed 100% 4: 2410:_chop_multiply(ImagingObject* self, PyObject* args) -: 2411:{ -: 2412: ImagingObject* imagep; -: 2413: 4: 2414: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2415: return NULL; -: 2416: } -: 2417: 4: 2418: return PyImagingNew(ImagingChopMultiply(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2419:} -: 2420: -: 2421:static PyObject* function _chop_screen called 2 returned 100% blocks executed 100% 2: 2422:_chop_screen(ImagingObject* self, PyObject* args) -: 2423:{ -: 2424: ImagingObject* imagep; -: 2425: 2: 2426: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2427: return NULL; -: 2428: } -: 2429: 2: 2430: return PyImagingNew(ImagingChopScreen(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2431:} -: 2432: -: 2433:static PyObject* function _chop_add called 6 returned 100% blocks executed 100% 6: 2434:_chop_add(ImagingObject* self, PyObject* args) -: 2435:{ -: 2436: ImagingObject* imagep; -: 2437: float scale; -: 2438: int offset; -: 2439: 6: 2440: scale = 1.0; 6: 2441: offset = 0; -: 2442: 6: 2443: if (!PyArg_ParseTuple(args, "O!|fi", &Imaging_Type, &imagep, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2444: &scale, &offset)) { -: 2445: return NULL; -: 2446: } -: 2447: 6: 2448: return PyImagingNew(ImagingChopAdd(self->image, imagep->image, call 0 returned 100% call 1 returned 100% -: 2449: scale, offset)); -: 2450:} -: 2451: -: 2452:static PyObject* function _chop_subtract called 6 returned 100% blocks executed 100% 6: 2453:_chop_subtract(ImagingObject* self, PyObject* args) -: 2454:{ -: 2455: ImagingObject* imagep; -: 2456: float scale; -: 2457: int offset; -: 2458: 6: 2459: scale = 1.0; 6: 2460: offset = 0; -: 2461: 6: 2462: if (!PyArg_ParseTuple(args, "O!|fi", &Imaging_Type, &imagep, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2463: &scale, &offset)) { -: 2464: return NULL; -: 2465: } -: 2466: 6: 2467: return PyImagingNew(ImagingChopSubtract(self->image, imagep->image, call 0 returned 100% call 1 returned 100% -: 2468: scale, offset)); -: 2469:} -: 2470: -: 2471:static PyObject* function _chop_and called 12 returned 100% blocks executed 100% 12: 2472:_chop_and(ImagingObject* self, PyObject* args) -: 2473:{ -: 2474: ImagingObject* imagep; -: 2475: 12: 2476: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2477: return NULL; -: 2478: } -: 2479: 12: 2480: return PyImagingNew(ImagingChopAnd(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2481:} -: 2482: -: 2483:static PyObject* function _chop_or called 12 returned 100% blocks executed 100% 12: 2484:_chop_or(ImagingObject* self, PyObject* args) -: 2485:{ -: 2486: ImagingObject* imagep; -: 2487: 12: 2488: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2489: return NULL; -: 2490: } -: 2491: 12: 2492: return PyImagingNew(ImagingChopOr(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2493:} -: 2494: -: 2495:static PyObject* function _chop_xor called 12 returned 100% blocks executed 100% 12: 2496:_chop_xor(ImagingObject* self, PyObject* args) -: 2497:{ -: 2498: ImagingObject* imagep; -: 2499: 12: 2500: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2501: return NULL; -: 2502: } -: 2503: 12: 2504: return PyImagingNew(ImagingChopXor(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2505:} -: 2506: -: 2507:static PyObject* function _chop_add_modulo called 3 returned 100% blocks executed 100% 3: 2508:_chop_add_modulo(ImagingObject* self, PyObject* args) -: 2509:{ -: 2510: ImagingObject* imagep; -: 2511: 3: 2512: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2513: return NULL; -: 2514: } -: 2515: 3: 2516: return PyImagingNew(ImagingChopAddModulo(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2517:} -: 2518: -: 2519:static PyObject* function _chop_subtract_modulo called 74 returned 100% blocks executed 100% 74: 2520:_chop_subtract_modulo(ImagingObject* self, PyObject* args) -: 2521:{ -: 2522: ImagingObject* imagep; -: 2523: 74: 2524: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2525: return NULL; -: 2526: } -: 2527: 74: 2528: return PyImagingNew(ImagingChopSubtractModulo(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2529:} -: 2530: -: 2531:static PyObject* function _chop_soft_light called 2 returned 100% blocks executed 100% 2: 2532:_chop_soft_light(ImagingObject* self, PyObject* args) -: 2533:{ -: 2534: ImagingObject* imagep; -: 2535: 2: 2536: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2537: return NULL; -: 2538: } -: 2539: 2: 2540: return PyImagingNew(ImagingChopSoftLight(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2541:} -: 2542: -: 2543:static PyObject* function _chop_hard_light called 2 returned 100% blocks executed 100% 2: 2544:_chop_hard_light(ImagingObject* self, PyObject* args) -: 2545:{ -: 2546: ImagingObject* imagep; -: 2547: 2: 2548: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2549: return NULL; -: 2550: } -: 2551: 2: 2552: return PyImagingNew(ImagingChopHardLight(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2553:} -: 2554: -: 2555:static PyObject* function _chop_overlay called 2 returned 100% blocks executed 100% 2: 2556:_chop_overlay(ImagingObject* self, PyObject* args) -: 2557:{ -: 2558: ImagingObject* imagep; -: 2559: 2: 2560: if (!PyArg_ParseTuple(args, "O!", &Imaging_Type, &imagep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2561: return NULL; -: 2562: } -: 2563: 2: 2564: return PyImagingNew(ImagingOverlay(self->image, imagep->image)); call 0 returned 100% call 1 returned 100% -: 2565:} -: 2566:#endif -: 2567: -: 2568: -: 2569:/* -------------------------------------------------------------------- */ -: 2570: -: 2571:#ifdef WITH_IMAGEDRAW -: 2572: -: 2573:static PyObject* function _font_new called 16 returned 100% blocks executed 75% 16: 2574:_font_new(PyObject* self_, PyObject* args) -: 2575:{ -: 2576: ImagingFontObject *self; -: 2577: int i, y0, y1; -: 2578: static const char* wrong_length = "descriptor table has wrong size"; -: 2579: -: 2580: ImagingObject* imagep; -: 2581: unsigned char* glyphdata; -: 2582: Py_ssize_t glyphdata_length; 16: 2583: if (!PyArg_ParseTuple(args, "O!y#", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2584: &Imaging_Type, &imagep, -: 2585: &glyphdata, &glyphdata_length)) { -: 2586: return NULL; -: 2587: } -: 2588: 16: 2589: if (glyphdata_length != 256 * 20) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 2590: PyErr_SetString(PyExc_ValueError, wrong_length); call 0 never executed #####: 2591: return NULL; -: 2592: } -: 2593: 16: 2594: self = PyObject_New(ImagingFontObject, &ImagingFont_Type); call 0 returned 100% 16: 2595: if (self == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2596: return NULL; -: 2597: } -: 2598: -: 2599: /* glyph bitmap */ 16: 2600: self->bitmap = imagep->image; -: 2601: 16: 2602: y0 = y1 = 0; -: 2603: -: 2604: /* glyph glyphs */ 4112: 2605: for (i = 0; i < 256; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 4096: 2606: self->glyphs[i].dx = S16(B16(glyphdata, 0)); branch 0 taken 0% (fallthrough) branch 1 taken 100% 4096: 2607: self->glyphs[i].dy = S16(B16(glyphdata, 2)); branch 0 taken 0% (fallthrough) branch 1 taken 100% 4096: 2608: self->glyphs[i].dx0 = S16(B16(glyphdata, 4)); branch 0 taken 10% (fallthrough) branch 1 taken 90% 4096: 2609: self->glyphs[i].dy0 = S16(B16(glyphdata, 6)); branch 0 taken 83% (fallthrough) branch 1 taken 17% 4096: 2610: self->glyphs[i].dx1 = S16(B16(glyphdata, 8)); branch 0 taken 0% (fallthrough) branch 1 taken 100% 4096: 2611: self->glyphs[i].dy1 = S16(B16(glyphdata, 10)); branch 0 taken 4% (fallthrough) branch 1 taken 96% 4096: 2612: self->glyphs[i].sx0 = S16(B16(glyphdata, 12)); branch 0 taken 0% (fallthrough) branch 1 taken 100% 4096: 2613: self->glyphs[i].sy0 = S16(B16(glyphdata, 14)); branch 0 taken 0% (fallthrough) branch 1 taken 100% 4096: 2614: self->glyphs[i].sx1 = S16(B16(glyphdata, 16)); branch 0 taken 0% (fallthrough) branch 1 taken 100% 4096: 2615: self->glyphs[i].sy1 = S16(B16(glyphdata, 18)); branch 0 taken 0% (fallthrough) branch 1 taken 100% 4096: 2616: if (self->glyphs[i].dy0 < y0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 40: 2617: y0 = self->glyphs[i].dy0; -: 2618: } 4096: 2619: if (self->glyphs[i].dy1 > y1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 22: 2620: y1 = self->glyphs[i].dy1; -: 2621: } 4096: 2622: glyphdata += 20; -: 2623: } -: 2624: 16: 2625: self->baseline = -y0; 16: 2626: self->ysize = y1 - y0; -: 2627: -: 2628: /* keep a reference to the bitmap object */ 16: 2629: Py_INCREF(imagep); 16: 2630: self->ref = imagep; -: 2631: 16: 2632: return (PyObject*) self; -: 2633:} -: 2634: -: 2635:static void function _font_dealloc called 16 returned 100% blocks executed 100% 16: 2636:_font_dealloc(ImagingFontObject* self) -: 2637:{ 16: 2638: Py_XDECREF(self->ref); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% call 4 returned 100% 16: 2639: PyObject_Del(self); call 0 returned 100% 16: 2640:} -: 2641: -: 2642:static inline int -: 2643:textwidth(ImagingFontObject* self, const unsigned char* text) -: 2644:{ -: 2645: int xsize; -: 2646: 1025030: 2647: for (xsize = 0; *text; text++) { branch 0 taken 36% branch 1 taken 64% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) 1024922: 2648: xsize += self->glyphs[*text].dx; -: 2649: } -: 2650: -: 2651: return xsize; -: 2652:} -: 2653: function _font_text_asBytes called 1187 returned 100% blocks executed 92% 1187: 2654:void _font_text_asBytes(PyObject* encoded_string, unsigned char** text){ -: 2655: /* Allocates *text, returns a 'new reference'. Caller is required to free */ -: 2656: 1187: 2657: PyObject* bytes = NULL; 1187: 2658: Py_ssize_t len = 0; -: 2659: char *buffer; -: 2660: 1187: 2661: *text = NULL; -: 2662: 1187: 2663: if (PyUnicode_CheckExact(encoded_string)){ branch 0 taken 32% (fallthrough) branch 1 taken 68% 380: 2664: bytes = PyUnicode_AsLatin1String(encoded_string); call 0 returned 100% 380: 2665: if (!bytes) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 2666: return; -: 2667: } 378: 2668: PyBytes_AsStringAndSize(bytes, &buffer, &len); call 0 returned 100% 807: 2669: } else if (PyBytes_Check(encoded_string)) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 42: 2670: PyBytes_AsStringAndSize(encoded_string, &buffer, &len); call 0 returned 100% -: 2671: } -: 2672: 1185: 2673: *text = calloc(len+1,1); 1185: 2674: if (*text) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1185: 2675: memcpy(*text, buffer, len); -: 2676: } else { #####: 2677: ImagingError_MemoryError(); call 0 never executed -: 2678: } 1185: 2679: if (bytes) { branch 0 taken 32% (fallthrough) branch 1 taken 68% 378: 2680: Py_DECREF(bytes); branch 0 taken 31% (fallthrough) branch 1 taken 69% call 2 returned 100% -: 2681: } -: 2682: -: 2683: return; -: 2684:} -: 2685: -: 2686: -: 2687:static PyObject* function _font_getmask called 108 returned 100% blocks executed 83% 108: 2688:_font_getmask(ImagingFontObject* self, PyObject* args) -: 2689:{ -: 2690: Imaging im; -: 2691: Imaging bitmap; -: 2692: int x, b; 108: 2693: int i=0; -: 2694: int status; -: 2695: Glyph* glyph; -: 2696: -: 2697: PyObject* encoded_string; -: 2698: -: 2699: unsigned char* text; 108: 2700: char* mode = ""; -: 2701: 108: 2702: if (!PyArg_ParseTuple(args, "O|s:getmask", &encoded_string, &mode)){ call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2703: return NULL; -: 2704: } -: 2705: 108: 2706: _font_text_asBytes(encoded_string, &text); call 0 returned 100% 108: 2707: if (!text) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2708: return NULL; -: 2709: } -: 2710: 216: 2711: im = ImagingNew(self->bitmap->mode, textwidth(self, text), self->ysize); call 0 returned 100% 108: 2712: if (!im) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 2713: free(text); #####: 2714: ImagingError_MemoryError(); call 0 never executed #####: 2715: return NULL; -: 2716: } -: 2717: 108: 2718: b = 0; 108: 2719: (void) ImagingFill(im, &b); call 0 returned 100% -: 2720: 108: 2721: b = self->baseline; 1024432: 2722: for (x = 0; text[i]; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1024324: 2723: glyph = &self->glyphs[text[i]]; 1024324: 2724: bitmap = ImagingCrop( call 0 returned 100% -: 2725: self->bitmap, -: 2726: glyph->sx0, glyph->sy0, glyph->sx1, glyph->sy1 -: 2727: ); 1024324: 2728: if (!bitmap) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2729: goto failed; -: 2730: } 4097296: 2731: status = ImagingPaste( call 0 returned 100% -: 2732: im, bitmap, NULL, 4097296: 2733: glyph->dx0+x, glyph->dy0+b, glyph->dx1+x, glyph->dy1+b -: 2734: ); 1024324: 2735: ImagingDelete(bitmap); call 0 returned 100% 1024324: 2736: if (status < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2737: goto failed; -: 2738: } 1024324: 2739: x = x + glyph->dx; 1024324: 2740: b = b + glyph->dy; -: 2741: } 108: 2742: free(text); 108: 2743: return PyImagingNew(im); call 0 returned 100% -: 2744: -: 2745: failed: #####: 2746: free(text); #####: 2747: ImagingDelete(im); call 0 never executed #####: 2748: Py_RETURN_NONE; -: 2749:} -: 2750: -: 2751:static PyObject* function _font_getsize called 1079 returned 100% blocks executed 100% 1079: 2752:_font_getsize(ImagingFontObject* self, PyObject* args) -: 2753:{ -: 2754: unsigned char* text; -: 2755: PyObject* encoded_string; -: 2756: PyObject* val; -: 2757: 1079: 2758: if (!PyArg_ParseTuple(args, "O:getsize", &encoded_string)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2759: return NULL; -: 2760: } -: 2761: 1079: 2762: _font_text_asBytes(encoded_string, &text); call 0 returned 100% 1079: 2763: if (!text) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 2764: return NULL; -: 2765: } -: 2766: 1077: 2767: val = Py_BuildValue("ii", textwidth(self, text), self->ysize); call 0 returned 100% 1077: 2768: free(text); 1077: 2769: return val; -: 2770:} -: 2771: -: 2772:static struct PyMethodDef _font_methods[] = { -: 2773: {"getmask", (PyCFunction)_font_getmask, 1}, -: 2774: {"getsize", (PyCFunction)_font_getsize, 1}, -: 2775: {NULL, NULL} /* sentinel */ -: 2776:}; -: 2777: -: 2778:/* -------------------------------------------------------------------- */ -: 2779: -: 2780:static PyObject* function _draw_new called 400 returned 100% blocks executed 100% 400: 2781:_draw_new(PyObject* self_, PyObject* args) -: 2782:{ -: 2783: ImagingDrawObject *self; -: 2784: -: 2785: ImagingObject* imagep; 400: 2786: int blend = 0; 400: 2787: if (!PyArg_ParseTuple(args, "O!|i", &Imaging_Type, &imagep, &blend)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2788: return NULL; -: 2789: } -: 2790: 400: 2791: self = PyObject_New(ImagingDrawObject, &ImagingDraw_Type); call 0 returned 100% 400: 2792: if (self == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2793: return NULL; -: 2794: } -: 2795: -: 2796: /* keep a reference to the image object */ 400: 2797: Py_INCREF(imagep); 400: 2798: self->image = imagep; -: 2799: 400: 2800: self->ink[0] = self->ink[1] = self->ink[2] = self->ink[3] = 0; -: 2801: 400: 2802: self->blend = blend; -: 2803: 400: 2804: return (PyObject*) self; -: 2805:} -: 2806: -: 2807:static void function _draw_dealloc called 400 returned 100% blocks executed 100% 400: 2808:_draw_dealloc(ImagingDrawObject* self) -: 2809:{ 400: 2810: Py_XDECREF(self->image); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 90% (fallthrough) branch 3 taken 10% call 4 returned 100% 400: 2811: PyObject_Del(self); call 0 returned 100% 400: 2812:} -: 2813: -: 2814:extern Py_ssize_t PyPath_Flatten(PyObject* data, double **xy); -: 2815: -: 2816:static PyObject* function _draw_ink called 3290 returned 100% blocks executed 100% 3290: 2817:_draw_ink(ImagingDrawObject* self, PyObject* args) -: 2818:{ 3290: 2819: INT32 ink = 0; -: 2820: PyObject* color; 3290: 2821: if (!PyArg_ParseTuple(args, "O", &color)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2822: return NULL; -: 2823: } -: 2824: 3290: 2825: if (!getink(color, self->image->image, (char*) &ink)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2826: return NULL; -: 2827: } -: 2828: 3290: 2829: return PyLong_FromLong((int) ink); call 0 returned 100% -: 2830:} -: 2831: -: 2832:static PyObject* function _draw_arc called 12 returned 100% blocks executed 82% 12: 2833:_draw_arc(ImagingDrawObject* self, PyObject* args) -: 2834:{ -: 2835: double* xy; -: 2836: Py_ssize_t n; -: 2837: -: 2838: PyObject* data; -: 2839: int ink; 12: 2840: int width = 0; -: 2841: float start, end; 12: 2842: if (!PyArg_ParseTuple(args, "Offi|i", &data, &start, &end, &ink, &width)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2843: return NULL; -: 2844: } -: 2845: 12: 2846: n = PyPath_Flatten(data, &xy); call 0 returned 100% 12: 2847: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2848: return NULL; -: 2849: } 12: 2850: if (n != 2) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 2851: PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); call 0 never executed #####: 2852: free(xy); #####: 2853: return NULL; -: 2854: } -: 2855: 60: 2856: n = ImagingDrawArc(self->image->image, call 0 returned 100% 24: 2857: (int) xy[0], (int) xy[1], 24: 2858: (int) xy[2], (int) xy[3], -: 2859: start, end, &ink, width, self->blend -: 2860: ); -: 2861: 12: 2862: free(xy); -: 2863: 12: 2864: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2865: return NULL; -: 2866: } -: 2867: 12: 2868: Py_INCREF(Py_None); 12: 2869: return Py_None; -: 2870:} -: 2871: -: 2872:static PyObject* function _draw_bitmap called 350 returned 100% blocks executed 82% 350: 2873:_draw_bitmap(ImagingDrawObject* self, PyObject* args) -: 2874:{ -: 2875: double *xy; -: 2876: Py_ssize_t n; -: 2877: -: 2878: PyObject *data; -: 2879: ImagingObject* bitmap; -: 2880: int ink; 350: 2881: if (!PyArg_ParseTuple(args, "OO!i", &data, &Imaging_Type, &bitmap, &ink)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2882: return NULL; -: 2883: } -: 2884: 350: 2885: n = PyPath_Flatten(data, &xy); call 0 returned 100% 350: 2886: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2887: return NULL; -: 2888: } 350: 2889: if (n != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 2890: PyErr_SetString(PyExc_TypeError, call 0 never executed -: 2891: "coordinate list must contain exactly 1 coordinate" -: 2892: ); #####: 2893: free(xy); #####: 2894: return NULL; -: 2895: } -: 2896: 1400: 2897: n = ImagingDrawBitmap( call 0 returned 100% 1400: 2898: self->image->image, (int) xy[0], (int) xy[1], bitmap->image, -: 2899: &ink, self->blend -: 2900: ); -: 2901: 350: 2902: free(xy); -: 2903: 350: 2904: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2905: return NULL; -: 2906: } -: 2907: 350: 2908: Py_INCREF(Py_None); 350: 2909: return Py_None; -: 2910:} -: 2911: -: 2912:static PyObject* function _draw_chord called 20 returned 100% blocks executed 82% 20: 2913:_draw_chord(ImagingDrawObject* self, PyObject* args) -: 2914:{ -: 2915: double* xy; -: 2916: Py_ssize_t n; -: 2917: -: 2918: PyObject* data; -: 2919: int ink, fill; 20: 2920: int width = 0; -: 2921: float start, end; 20: 2922: if (!PyArg_ParseTuple(args, "Offii|i", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2923: &data, &start, &end, &ink, &fill, &width)) { -: 2924: return NULL; -: 2925: } -: 2926: 20: 2927: n = PyPath_Flatten(data, &xy); call 0 returned 100% 20: 2928: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2929: return NULL; -: 2930: } 20: 2931: if (n != 2) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 2932: PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); call 0 never executed #####: 2933: free(xy); #####: 2934: return NULL; -: 2935: } -: 2936: 100: 2937: n = ImagingDrawChord(self->image->image, call 0 returned 100% 40: 2938: (int) xy[0], (int) xy[1], 40: 2939: (int) xy[2], (int) xy[3], -: 2940: start, end, &ink, fill, width, self->blend -: 2941: ); -: 2942: 20: 2943: free(xy); -: 2944: 20: 2945: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2946: return NULL; -: 2947: } -: 2948: 20: 2949: Py_INCREF(Py_None); 20: 2950: return Py_None; -: 2951:} -: 2952: -: 2953:static PyObject* function _draw_ellipse called 2091 returned 100% blocks executed 82% 2091: 2954:_draw_ellipse(ImagingDrawObject* self, PyObject* args) -: 2955:{ -: 2956: double* xy; -: 2957: Py_ssize_t n; -: 2958: -: 2959: PyObject* data; -: 2960: int ink; 2091: 2961: int fill = 0; 2091: 2962: int width = 0; 2091: 2963: if (!PyArg_ParseTuple(args, "Oi|ii", &data, &ink, &fill, &width)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 2964: return NULL; -: 2965: } -: 2966: 2091: 2967: n = PyPath_Flatten(data, &xy); call 0 returned 100% 2091: 2968: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2969: return NULL; -: 2970: } 2091: 2971: if (n != 2) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 2972: PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); call 0 never executed #####: 2973: free(xy); #####: 2974: return NULL; -: 2975: } -: 2976: 10455: 2977: n = ImagingDrawEllipse(self->image->image, call 0 returned 100% 4182: 2978: (int) xy[0], (int) xy[1], 4182: 2979: (int) xy[2], (int) xy[3], -: 2980: &ink, fill, width, self->blend -: 2981: ); -: 2982: 2091: 2983: free(xy); -: 2984: 2091: 2985: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 2986: return NULL; -: 2987: } -: 2988: 2091: 2989: Py_INCREF(Py_None); 2091: 2990: return Py_None; -: 2991:} -: 2992: -: 2993:static PyObject* function _draw_lines called 221 returned 100% blocks executed 90% 221: 2994:_draw_lines(ImagingDrawObject* self, PyObject* args) -: 2995:{ -: 2996: double *xy; -: 2997: Py_ssize_t i, n; -: 2998: -: 2999: PyObject *data; -: 3000: int ink; 221: 3001: int width = 0; 221: 3002: if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &width)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3003: return NULL; -: 3004: } -: 3005: 221: 3006: n = PyPath_Flatten(data, &xy); call 0 returned 100% 221: 3007: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3008: return NULL; -: 3009: } -: 3010: 221: 3011: if (width <= 1) { branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 3012: double *p = NULL; 163: 3013: for (i = 0; i < n-1; i++) { branch 0 taken 50% branch 1 taken 50% (fallthrough) 163: 3014: p = &xy[i+i]; 815: 3015: if (ImagingDrawLine( call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% 163: 3016: self->image->image, 652: 3017: (int) p[0], (int) p[1], (int) p[2], (int) p[3], -: 3018: &ink, self->blend) < 0) { #####: 3019: free(xy); #####: 3020: return NULL; -: 3021: } -: 3022: } 161: 3023: if (p) {/* draw last point */ branch 0 taken 99% (fallthrough) branch 1 taken 1% 480: 3024: ImagingDrawPoint( call 0 returned 100% 160: 3025: self->image->image, 320: 3026: (int) p[2], (int) p[3], -: 3027: &ink, self->blend -: 3028: ); -: 3029: } -: 3030: } else { 140: 3031: for (i = 0; i < n-1; i++) { branch 0 taken 70% branch 1 taken 30% (fallthrough) 140: 3032: double *p = &xy[i+i]; 700: 3033: if (ImagingDrawWideLine( call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% 140: 3034: self->image->image, 560: 3035: (int) p[0], (int) p[1], (int) p[2], (int) p[3], -: 3036: &ink, width, self->blend) < 0) { #####: 3037: free(xy); #####: 3038: return NULL; -: 3039: } -: 3040: } -: 3041: } -: 3042: 221: 3043: free(xy); -: 3044: 221: 3045: Py_INCREF(Py_None); 221: 3046: return Py_None; -: 3047:} -: 3048: -: 3049:static PyObject* function _draw_points called 2 returned 100% blocks executed 92% 2: 3050:_draw_points(ImagingDrawObject* self, PyObject* args) -: 3051:{ -: 3052: double *xy; -: 3053: Py_ssize_t i, n; -: 3054: -: 3055: PyObject *data; -: 3056: int ink; 2: 3057: if (!PyArg_ParseTuple(args, "Oi", &data, &ink)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3058: return NULL; -: 3059: } -: 3060: 2: 3061: n = PyPath_Flatten(data, &xy); call 0 returned 100% 2: 3062: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3063: return NULL; -: 3064: } -: 3065: 6: 3066: for (i = 0; i < n; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 6: 3067: double *p = &xy[i+i]; 6: 3068: if (ImagingDrawPoint(self->image->image, (int) p[0], (int) p[1], call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 3069: &ink, self->blend) < 0) { #####: 3070: free(xy); #####: 3071: return NULL; -: 3072: } -: 3073: } -: 3074: 2: 3075: free(xy); -: 3076: 2: 3077: Py_INCREF(Py_None); 2: 3078: return Py_None; -: 3079:} -: 3080: -: 3081:#ifdef WITH_ARROW -: 3082: -: 3083:/* from outline.c */ -: 3084:extern ImagingOutline PyOutline_AsOutline(PyObject* outline); -: 3085: -: 3086:static PyObject* function _draw_outline called 8 returned 100% blocks executed 80% 8: 3087:_draw_outline(ImagingDrawObject* self, PyObject* args) -: 3088:{ -: 3089: ImagingOutline outline; -: 3090: -: 3091: PyObject* outline_; -: 3092: int ink; 8: 3093: int fill = 0; 8: 3094: if (!PyArg_ParseTuple(args, "Oi|i", &outline_, &ink, &fill)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3095: return NULL; -: 3096: } -: 3097: 8: 3098: outline = PyOutline_AsOutline(outline_); call 0 returned 100% 8: 3099: if (!outline) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 3100: PyErr_SetString(PyExc_TypeError, "expected outline object"); call 0 never executed #####: 3101: return NULL; -: 3102: } -: 3103: 8: 3104: if (ImagingDrawOutline(self->image->image, outline, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3105: &ink, fill, self->blend) < 0) { -: 3106: return NULL; -: 3107: } -: 3108: 8: 3109: Py_INCREF(Py_None); 8: 3110: return Py_None; -: 3111:} -: 3112: -: 3113:#endif -: 3114: -: 3115:static PyObject* function _draw_pieslice called 53 returned 100% blocks executed 82% 53: 3116:_draw_pieslice(ImagingDrawObject* self, PyObject* args) -: 3117:{ -: 3118: double* xy; -: 3119: Py_ssize_t n; -: 3120: -: 3121: PyObject* data; -: 3122: int ink, fill; 53: 3123: int width = 0; -: 3124: float start, end; 53: 3125: if (!PyArg_ParseTuple(args, "Offii|i", &data, &start, &end, &ink, &fill, &width)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3126: return NULL; -: 3127: } -: 3128: 53: 3129: n = PyPath_Flatten(data, &xy); call 0 returned 100% 53: 3130: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3131: return NULL; -: 3132: } 53: 3133: if (n != 2) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 3134: PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); call 0 never executed #####: 3135: free(xy); #####: 3136: return NULL; -: 3137: } -: 3138: 265: 3139: n = ImagingDrawPieslice(self->image->image, call 0 returned 100% 106: 3140: (int) xy[0], (int) xy[1], 106: 3141: (int) xy[2], (int) xy[3], -: 3142: start, end, &ink, fill, width, self->blend -: 3143: ); -: 3144: 53: 3145: free(xy); -: 3146: 53: 3147: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3148: return NULL; -: 3149: } -: 3150: 53: 3151: Py_INCREF(Py_None); 53: 3152: return Py_None; -: 3153:} -: 3154: -: 3155:static PyObject* function _draw_polygon called 26 returned 100% blocks executed 80% 26: 3156:_draw_polygon(ImagingDrawObject* self, PyObject* args) -: 3157:{ -: 3158: double *xy; -: 3159: int *ixy; -: 3160: Py_ssize_t n, i; -: 3161: -: 3162: PyObject* data; -: 3163: int ink; 26: 3164: int fill = 0; 26: 3165: if (!PyArg_ParseTuple(args, "Oi|i", &data, &ink, &fill)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3166: return NULL; -: 3167: } -: 3168: 26: 3169: n = PyPath_Flatten(data, &xy); call 0 returned 100% 26: 3170: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3171: return NULL; -: 3172: } 26: 3173: if (n < 2) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 3174: PyErr_SetString(PyExc_TypeError, call 0 never executed -: 3175: "coordinate list must contain at least 2 coordinates" -: 3176: ); #####: 3177: free(xy); #####: 3178: return NULL; -: 3179: } -: 3180: -: 3181: /* Copy list of vertices to array */ 26: 3182: ixy = (int*) calloc(n, 2 * sizeof(int)); -: 3183: 169: 3184: for (i = 0; i < n; i++) { branch 0 taken 85% branch 1 taken 15% (fallthrough) 143: 3185: ixy[i+i] = (int) xy[i+i]; 143: 3186: ixy[i+i+1] = (int) xy[i+i+1]; -: 3187: } -: 3188: 26: 3189: free(xy); -: 3190: 26: 3191: if (ImagingDrawPolygon(self->image->image, n, ixy, call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 3192: &ink, fill, self->blend) < 0) { #####: 3193: free(ixy); #####: 3194: return NULL; -: 3195: } -: 3196: 26: 3197: free(ixy); -: 3198: 26: 3199: Py_INCREF(Py_None); 26: 3200: return Py_None; -: 3201:} -: 3202: -: 3203:static PyObject* function _draw_rectangle called 147 returned 100% blocks executed 82% 147: 3204:_draw_rectangle(ImagingDrawObject* self, PyObject* args) -: 3205:{ -: 3206: double* xy; -: 3207: Py_ssize_t n; -: 3208: -: 3209: PyObject* data; -: 3210: int ink; 147: 3211: int fill = 0; 147: 3212: int width = 0; 147: 3213: if (!PyArg_ParseTuple(args, "Oi|ii", &data, &ink, &fill, &width)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3214: return NULL; -: 3215: } -: 3216: 147: 3217: n = PyPath_Flatten(data, &xy); call 0 returned 100% 147: 3218: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3219: return NULL; -: 3220: } 147: 3221: if (n != 2) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 3222: PyErr_SetString(PyExc_TypeError, must_be_two_coordinates); call 0 never executed #####: 3223: free(xy); #####: 3224: return NULL; -: 3225: } -: 3226: 735: 3227: n = ImagingDrawRectangle(self->image->image, call 0 returned 100% 294: 3228: (int) xy[0], (int) xy[1], 294: 3229: (int) xy[2], (int) xy[3], -: 3230: &ink, fill, width, self->blend -: 3231: ); -: 3232: 147: 3233: free(xy); -: 3234: 147: 3235: if (n < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3236: return NULL; -: 3237: } -: 3238: 147: 3239: Py_INCREF(Py_None); 147: 3240: return Py_None; -: 3241:} -: 3242: -: 3243:static struct PyMethodDef _draw_methods[] = { -: 3244:#ifdef WITH_IMAGEDRAW -: 3245: /* Graphics (ImageDraw) */ -: 3246: {"draw_lines", (PyCFunction)_draw_lines, 1}, -: 3247:#ifdef WITH_ARROW -: 3248: {"draw_outline", (PyCFunction)_draw_outline, 1}, -: 3249:#endif -: 3250: {"draw_polygon", (PyCFunction)_draw_polygon, 1}, -: 3251: {"draw_rectangle", (PyCFunction)_draw_rectangle, 1}, -: 3252: {"draw_points", (PyCFunction)_draw_points, 1}, -: 3253: {"draw_arc", (PyCFunction)_draw_arc, 1}, -: 3254: {"draw_bitmap", (PyCFunction)_draw_bitmap, 1}, -: 3255: {"draw_chord", (PyCFunction)_draw_chord, 1}, -: 3256: {"draw_ellipse", (PyCFunction)_draw_ellipse, 1}, -: 3257: {"draw_pieslice", (PyCFunction)_draw_pieslice, 1}, -: 3258: {"draw_ink", (PyCFunction)_draw_ink, 1}, -: 3259:#endif -: 3260: {NULL, NULL} /* sentinel */ -: 3261:}; -: 3262: -: 3263:#endif -: 3264: -: 3265: -: 3266:static PyObject* function pixel_access_new called 232282 returned 100% blocks executed 100% 232282: 3267:pixel_access_new(ImagingObject* imagep, PyObject* args) -: 3268:{ -: 3269: PixelAccessObject *self; -: 3270: 232282: 3271: int readonly = 0; 232282: 3272: if (!PyArg_ParseTuple(args, "|i", &readonly)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3273: return NULL; -: 3274: } -: 3275: 232282: 3276: self = PyObject_New(PixelAccessObject, &PixelAccess_Type); call 0 returned 100% 232282: 3277: if (self == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3278: return NULL; -: 3279: } -: 3280: -: 3281: /* keep a reference to the image object */ 232282: 3282: Py_INCREF(imagep); 232282: 3283: self->image = imagep; -: 3284: 232282: 3285: self->readonly = readonly; -: 3286: 232282: 3287: return (PyObject*) self; -: 3288:} -: 3289: -: 3290:static void function pixel_access_dealloc called 232282 returned 100% blocks executed 100% 232282: 3291:pixel_access_dealloc(PixelAccessObject* self) -: 3292:{ 232282: 3293: Py_XDECREF(self->image); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 1% (fallthrough) branch 3 taken 99% call 4 returned 100% 232282: 3294: PyObject_Del(self); call 0 returned 100% 232282: 3295:} -: 3296: -: 3297:static PyObject * function pixel_access_getitem called 219391 returned 100% blocks executed 100% 219391: 3298:pixel_access_getitem(PixelAccessObject *self, PyObject *xy) -: 3299:{ -: 3300: int x, y; 219391: 3301: if (_getxy(xy, &x, &y)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3302: return NULL; -: 3303: } -: 3304: 219391: 3305: return getpixel(self->image->image, self->image->access, x, y); call 0 returned 100% -: 3306:} -: 3307: -: 3308:static int function pixel_access_setitem called 266269 returned 100% blocks executed 81% 266269: 3309:pixel_access_setitem(PixelAccessObject *self, PyObject *xy, PyObject *color) -: 3310:{ 266269: 3311: Imaging im = self->image->image; -: 3312: char ink[4]; -: 3313: int x, y; -: 3314: 266269: 3315: if (self->readonly) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 3316: (void) ImagingError_ValueError(readonly); call 0 never executed #####: 3317: return -1; -: 3318: } -: 3319: 266269: 3320: if (_getxy(xy, &x, &y)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3321: return -1; -: 3322: } -: 3323: 266269: 3324: if (x < 0) { branch 0 taken 6% (fallthrough) branch 1 taken 94% 16384: 3325: x = im->xsize + x; -: 3326: } 266269: 3327: if (y < 0) { branch 0 taken 6% (fallthrough) branch 1 taken 94% 16384: 3328: y = im->ysize + y; -: 3329: } -: 3330: 266269: 3331: if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 3332: PyErr_SetString(PyExc_IndexError, outside_image); call 0 never executed #####: 3333: return -1; -: 3334: } -: 3335: 266269: 3336: if (!color) {/* FIXME: raise exception? */ branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3337: return 0; -: 3338: } -: 3339: 266269: 3340: if (!getink(color, im, ink)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3341: return -1; -: 3342: } -: 3343: 266269: 3344: self->image->access->put_pixel(im, x, y, ink); call 0 returned 100% -: 3345: 266269: 3346: return 0; -: 3347:} -: 3348: -: 3349:/* -------------------------------------------------------------------- */ -: 3350:/* EFFECTS (experimental) */ -: 3351:/* -------------------------------------------------------------------- */ -: 3352: -: 3353:#ifdef WITH_EFFECTS -: 3354: -: 3355:static PyObject* function _effect_mandelbrot called 2 returned 100% blocks executed 100% 2: 3356:_effect_mandelbrot(ImagingObject* self, PyObject* args) -: 3357:{ 2: 3358: int xsize = 512; 2: 3359: int ysize = 512; -: 3360: double extent[4]; 2: 3361: int quality = 100; -: 3362: 2: 3363: extent[0] = -3; extent[1] = -2.5; 2: 3364: extent[2] = 2; extent[3] = 2.5; -: 3365: 2: 3366: if (!PyArg_ParseTuple(args, "|(ii)(dddd)i", &xsize, &ysize, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3367: &extent[0], &extent[1], &extent[2], &extent[3], -: 3368: &quality)) { -: 3369: return NULL; -: 3370: } -: 3371: 2: 3372: return PyImagingNew(ImagingEffectMandelbrot(xsize, ysize, extent, quality)); call 0 returned 100% call 1 returned 100% -: 3373:} -: 3374: -: 3375:static PyObject* function _effect_noise called 1 returned 100% blocks executed 100% 1: 3376:_effect_noise(ImagingObject* self, PyObject* args) -: 3377:{ -: 3378: int xsize, ysize; 1: 3379: float sigma = 128; 1: 3380: if (!PyArg_ParseTuple(args, "(ii)|f", &xsize, &ysize, &sigma)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3381: return NULL; -: 3382: } -: 3383: 1: 3384: return PyImagingNew(ImagingEffectNoise(xsize, ysize, sigma)); call 0 returned 100% call 1 returned 100% -: 3385:} -: 3386: -: 3387:static PyObject* function _effect_spread called 2 returned 100% blocks executed 100% 2: 3388:_effect_spread(ImagingObject* self, PyObject* args) -: 3389:{ -: 3390: int dist; -: 3391: 2: 3392: if (!PyArg_ParseTuple(args, "i", &dist)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3393: return NULL; -: 3394: } -: 3395: 2: 3396: return PyImagingNew(ImagingEffectSpread(self->image, dist)); call 0 returned 100% call 1 returned 100% -: 3397:} -: 3398: -: 3399:#endif -: 3400: -: 3401:/* -------------------------------------------------------------------- */ -: 3402:/* UTILITIES */ -: 3403:/* -------------------------------------------------------------------- */ -: 3404: -: 3405: -: 3406:static PyObject* function _getcodecstatus called 15 returned 100% blocks executed 80% 15: 3407:_getcodecstatus(PyObject* self, PyObject* args) -: 3408:{ -: 3409: int status; -: 3410: char* msg; -: 3411: 15: 3412: if (!PyArg_ParseTuple(args, "i", &status)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3413: return NULL; -: 3414: } -: 3415: 15: 3416: switch (status) { branch 0 taken 0% branch 1 taken 13% branch 2 taken 7% branch 3 taken 0% branch 4 taken 13% branch 5 taken 67% -: 3417: case IMAGING_CODEC_OVERRUN: -: 3418: msg = "buffer overrun"; break; -: 3419: case IMAGING_CODEC_BROKEN: #####: 3420: msg = "broken data stream"; break; -: 3421: case IMAGING_CODEC_UNKNOWN: 2: 3422: msg = "unrecognized data stream contents"; break; -: 3423: case IMAGING_CODEC_CONFIG: 1: 3424: msg = "codec configuration error"; break; -: 3425: case IMAGING_CODEC_MEMORY: #####: 3426: msg = "out of memory"; break; -: 3427: default: 2: 3428: Py_RETURN_NONE; -: 3429: } -: 3430: 13: 3431: return PyUnicode_FromString(msg); call 0 returned 100% -: 3432:} -: 3433: -: 3434:/* -------------------------------------------------------------------- */ -: 3435:/* DEBUGGING HELPERS */ -: 3436:/* -------------------------------------------------------------------- */ -: 3437: -: 3438: -: 3439:static PyObject* function _save_ppm called 21 returned 100% blocks executed 100% 21: 3440:_save_ppm(ImagingObject* self, PyObject* args) -: 3441:{ -: 3442: char* filename; -: 3443: 21: 3444: if (!PyArg_ParseTuple(args, "s", &filename)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3445: return NULL; -: 3446: } -: 3447: 21: 3448: if (!ImagingSavePPM(self->image, filename)) { call 0 returned 100% branch 1 taken 95% (fallthrough) branch 2 taken 5% -: 3449: return NULL; -: 3450: } -: 3451: 20: 3452: Py_INCREF(Py_None); 20: 3453: return Py_None; -: 3454:} -: 3455: -: 3456: -: 3457:/* -------------------------------------------------------------------- */ -: 3458: -: 3459:/* methods */ -: 3460: -: 3461:static struct PyMethodDef methods[] = { -: 3462: -: 3463: /* Put commonly used methods first */ -: 3464: {"getpixel", (PyCFunction)_getpixel, 1}, -: 3465: {"putpixel", (PyCFunction)_putpixel, 1}, -: 3466: -: 3467: {"pixel_access", (PyCFunction)pixel_access_new, 1}, -: 3468: -: 3469: /* Standard processing methods (Image) */ -: 3470: {"color_lut_3d", (PyCFunction)_color_lut_3d, 1}, -: 3471: {"convert", (PyCFunction)_convert, 1}, -: 3472: {"convert2", (PyCFunction)_convert2, 1}, -: 3473: {"convert_matrix", (PyCFunction)_convert_matrix, 1}, -: 3474: {"convert_transparent", (PyCFunction)_convert_transparent, 1}, -: 3475: {"copy", (PyCFunction)_copy, 1}, -: 3476: {"crop", (PyCFunction)_crop, 1}, -: 3477: {"expand", (PyCFunction)_expand_image, 1}, -: 3478: {"filter", (PyCFunction)_filter, 1}, -: 3479: {"histogram", (PyCFunction)_histogram, 1}, -: 3480: {"entropy", (PyCFunction)_entropy, 1}, -: 3481:#ifdef WITH_MODEFILTER -: 3482: {"modefilter", (PyCFunction)_modefilter, 1}, -: 3483:#endif -: 3484: {"offset", (PyCFunction)_offset, 1}, -: 3485: {"paste", (PyCFunction)_paste, 1}, -: 3486: {"point", (PyCFunction)_point, 1}, -: 3487: {"point_transform", (PyCFunction)_point_transform, 1}, -: 3488: {"putdata", (PyCFunction)_putdata, 1}, -: 3489:#ifdef WITH_QUANTIZE -: 3490: {"quantize", (PyCFunction)_quantize, 1}, -: 3491:#endif -: 3492:#ifdef WITH_RANKFILTER -: 3493: {"rankfilter", (PyCFunction)_rankfilter, 1}, -: 3494:#endif -: 3495: {"resize", (PyCFunction)_resize, 1}, -: 3496: {"reduce", (PyCFunction)_reduce, 1}, -: 3497: {"transpose", (PyCFunction)_transpose, 1}, -: 3498: {"transform2", (PyCFunction)_transform2, 1}, -: 3499: -: 3500: {"isblock", (PyCFunction)_isblock, 1}, -: 3501: -: 3502: {"getbbox", (PyCFunction)_getbbox, 1}, -: 3503: {"getcolors", (PyCFunction)_getcolors, 1}, -: 3504: {"getextrema", (PyCFunction)_getextrema, 1}, -: 3505: {"getprojection", (PyCFunction)_getprojection, 1}, -: 3506: -: 3507: {"getband", (PyCFunction)_getband, 1}, -: 3508: {"putband", (PyCFunction)_putband, 1}, -: 3509: {"split", (PyCFunction)_split, 1}, -: 3510: {"fillband", (PyCFunction)_fillband, 1}, -: 3511: -: 3512: {"setmode", (PyCFunction)im_setmode, 1}, -: 3513: -: 3514: {"getpalette", (PyCFunction)_getpalette, 1}, -: 3515: {"getpalettemode", (PyCFunction)_getpalettemode, 1}, -: 3516: {"putpalette", (PyCFunction)_putpalette, 1}, -: 3517: {"putpalettealpha", (PyCFunction)_putpalettealpha, 1}, -: 3518: {"putpalettealphas", (PyCFunction)_putpalettealphas, 1}, -: 3519: -: 3520:#ifdef WITH_IMAGECHOPS -: 3521: /* Channel operations (ImageChops) */ -: 3522: {"chop_invert", (PyCFunction)_chop_invert, 1}, -: 3523: {"chop_lighter", (PyCFunction)_chop_lighter, 1}, -: 3524: {"chop_darker", (PyCFunction)_chop_darker, 1}, -: 3525: {"chop_difference", (PyCFunction)_chop_difference, 1}, -: 3526: {"chop_multiply", (PyCFunction)_chop_multiply, 1}, -: 3527: {"chop_screen", (PyCFunction)_chop_screen, 1}, -: 3528: {"chop_add", (PyCFunction)_chop_add, 1}, -: 3529: {"chop_subtract", (PyCFunction)_chop_subtract, 1}, -: 3530: {"chop_add_modulo", (PyCFunction)_chop_add_modulo, 1}, -: 3531: {"chop_subtract_modulo", (PyCFunction)_chop_subtract_modulo, 1}, -: 3532: {"chop_and", (PyCFunction)_chop_and, 1}, -: 3533: {"chop_or", (PyCFunction)_chop_or, 1}, -: 3534: {"chop_xor", (PyCFunction)_chop_xor, 1}, -: 3535: {"chop_soft_light", (PyCFunction)_chop_soft_light, 1}, -: 3536: {"chop_hard_light", (PyCFunction)_chop_hard_light, 1}, -: 3537: {"chop_overlay", (PyCFunction)_chop_overlay, 1}, -: 3538: -: 3539:#endif -: 3540: -: 3541:#ifdef WITH_UNSHARPMASK -: 3542: /* Kevin Cazabon's unsharpmask extension */ -: 3543: {"gaussian_blur", (PyCFunction)_gaussian_blur, 1}, -: 3544: {"unsharp_mask", (PyCFunction)_unsharp_mask, 1}, -: 3545:#endif -: 3546: -: 3547: {"box_blur", (PyCFunction)_box_blur, 1}, -: 3548: -: 3549:#ifdef WITH_EFFECTS -: 3550: /* Special effects */ -: 3551: {"effect_spread", (PyCFunction)_effect_spread, 1}, -: 3552:#endif -: 3553: -: 3554: /* Misc. */ -: 3555: {"new_block", (PyCFunction)_new_block, 1}, -: 3556: -: 3557: {"save_ppm", (PyCFunction)_save_ppm, 1}, -: 3558: -: 3559: {NULL, NULL} /* sentinel */ -: 3560:}; -: 3561: -: 3562: -: 3563:/* attributes */ -: 3564: -: 3565:static PyObject* function _getattr_mode called 197101 returned 100% blocks executed 100% 197101: 3566:_getattr_mode(ImagingObject* self, void* closure) -: 3567:{ 197101: 3568: return PyUnicode_FromString(self->image->mode); call 0 returned 100% -: 3569:} -: 3570: -: 3571:static PyObject* function _getattr_size called 49421 returned 100% blocks executed 100% 49421: 3572:_getattr_size(ImagingObject* self, void* closure) -: 3573:{ 49421: 3574: return Py_BuildValue("ii", self->image->xsize, self->image->ysize); call 0 returned 100% -: 3575:} -: 3576: -: 3577:static PyObject* function _getattr_bands called 1706 returned 100% blocks executed 100% 1706: 3578:_getattr_bands(ImagingObject* self, void* closure) -: 3579:{ 1706: 3580: return PyLong_FromLong(self->image->bands); call 0 returned 100% -: 3581:} -: 3582: -: 3583:static PyObject* function _getattr_id called 9130 returned 100% blocks executed 100% 9130: 3584:_getattr_id(ImagingObject* self, void* closure) -: 3585:{ 9130: 3586: return PyLong_FromSsize_t((Py_ssize_t) self->image); call 0 returned 100% -: 3587:} -: 3588: -: 3589:static PyObject* function _getattr_ptr called 1 returned 100% blocks executed 100% 1: 3590:_getattr_ptr(ImagingObject* self, void* closure) -: 3591:{ 1: 3592: return PyCapsule_New(self->image, IMAGING_MAGIC, NULL); call 0 returned 100% -: 3593:} -: 3594: -: 3595:static PyObject* function _getattr_unsafe_ptrs called 118 returned 100% blocks executed 100% 118: 3596:_getattr_unsafe_ptrs(ImagingObject* self, void* closure) -: 3597:{ 118: 3598: return Py_BuildValue("(sn)(sn)(sn)", call 0 returned 100% 118: 3599: "image8", self->image->image8, -: 3600: "image32", self->image->image32, -: 3601: "image", self->image->image -: 3602: ); -: 3603:}; -: 3604: -: 3605: -: 3606:static struct PyGetSetDef getsetters[] = { -: 3607: { "mode", (getter) _getattr_mode }, -: 3608: { "size", (getter) _getattr_size }, -: 3609: { "bands", (getter) _getattr_bands }, -: 3610: { "id", (getter) _getattr_id }, -: 3611: { "ptr", (getter) _getattr_ptr }, -: 3612: { "unsafe_ptrs", (getter) _getattr_unsafe_ptrs }, -: 3613: { NULL } -: 3614:}; -: 3615: -: 3616:/* basic sequence semantics */ -: 3617: -: 3618:static Py_ssize_t function image_length called 730833 returned 100% blocks executed 100% 730833: 3619:image_length(ImagingObject *self) -: 3620:{ 730833: 3621: Imaging im = self->image; -: 3622: 730833: 3623: return (Py_ssize_t) im->xsize * im->ysize; -: 3624:} -: 3625: -: 3626:static PyObject * function image_item called 4304159 returned 100% blocks executed 100% 4304159: 3627:image_item(ImagingObject *self, Py_ssize_t i) -: 3628:{ -: 3629: int x, y; 4304159: 3630: Imaging im = self->image; -: 3631: 4304159: 3632: if (im->xsize > 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 4304158: 3633: x = i % im->xsize; 4304158: 3634: y = i / im->xsize; -: 3635: } else { -: 3636: x = y = 0; /* leave it to getpixel to raise an exception */ -: 3637: } -: 3638: 4304159: 3639: return getpixel(im, self->access, x, y); call 0 returned 100% -: 3640:} -: 3641: -: 3642:static PySequenceMethods image_as_sequence = { -: 3643: (lenfunc) image_length, /*sq_length*/ -: 3644: (binaryfunc) NULL, /*sq_concat*/ -: 3645: (ssizeargfunc) NULL, /*sq_repeat*/ -: 3646: (ssizeargfunc) image_item, /*sq_item*/ -: 3647: (ssizessizeargfunc) NULL, /*sq_slice*/ -: 3648: (ssizeobjargproc) NULL, /*sq_ass_item*/ -: 3649: (ssizessizeobjargproc) NULL, /*sq_ass_slice*/ -: 3650:}; -: 3651: -: 3652: -: 3653:/* type description */ -: 3654: -: 3655:static PyTypeObject Imaging_Type = { -: 3656: PyVarObject_HEAD_INIT(NULL, 0) -: 3657: "ImagingCore", /*tp_name*/ -: 3658: sizeof(ImagingObject), /*tp_size*/ -: 3659: 0, /*tp_itemsize*/ -: 3660: /* methods */ -: 3661: (destructor)_dealloc, /*tp_dealloc*/ -: 3662: 0, /*tp_print*/ -: 3663: 0, /*tp_getattr*/ -: 3664: 0, /*tp_setattr*/ -: 3665: 0, /*tp_compare*/ -: 3666: 0, /*tp_repr*/ -: 3667: 0, /*tp_as_number */ -: 3668: &image_as_sequence, /*tp_as_sequence */ -: 3669: 0, /*tp_as_mapping */ -: 3670: 0, /*tp_hash*/ -: 3671: 0, /*tp_call*/ -: 3672: 0, /*tp_str*/ -: 3673: 0, /*tp_getattro*/ -: 3674: 0, /*tp_setattro*/ -: 3675: 0, /*tp_as_buffer*/ -: 3676: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 3677: 0, /*tp_doc*/ -: 3678: 0, /*tp_traverse*/ -: 3679: 0, /*tp_clear*/ -: 3680: 0, /*tp_richcompare*/ -: 3681: 0, /*tp_weaklistoffset*/ -: 3682: 0, /*tp_iter*/ -: 3683: 0, /*tp_iternext*/ -: 3684: methods, /*tp_methods*/ -: 3685: 0, /*tp_members*/ -: 3686: getsetters, /*tp_getset*/ -: 3687:}; -: 3688: -: 3689:#ifdef WITH_IMAGEDRAW -: 3690: -: 3691:static PyTypeObject ImagingFont_Type = { -: 3692: PyVarObject_HEAD_INIT(NULL, 0) -: 3693: "ImagingFont", /*tp_name*/ -: 3694: sizeof(ImagingFontObject), /*tp_size*/ -: 3695: 0, /*tp_itemsize*/ -: 3696: /* methods */ -: 3697: (destructor)_font_dealloc, /*tp_dealloc*/ -: 3698: 0, /*tp_print*/ -: 3699: 0, /*tp_getattr*/ -: 3700: 0, /*tp_setattr*/ -: 3701: 0, /*tp_compare*/ -: 3702: 0, /*tp_repr*/ -: 3703: 0, /*tp_as_number */ -: 3704: 0, /*tp_as_sequence */ -: 3705: 0, /*tp_as_mapping */ -: 3706: 0, /*tp_hash*/ -: 3707: 0, /*tp_call*/ -: 3708: 0, /*tp_str*/ -: 3709: 0, /*tp_getattro*/ -: 3710: 0, /*tp_setattro*/ -: 3711: 0, /*tp_as_buffer*/ -: 3712: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 3713: 0, /*tp_doc*/ -: 3714: 0, /*tp_traverse*/ -: 3715: 0, /*tp_clear*/ -: 3716: 0, /*tp_richcompare*/ -: 3717: 0, /*tp_weaklistoffset*/ -: 3718: 0, /*tp_iter*/ -: 3719: 0, /*tp_iternext*/ -: 3720: _font_methods, /*tp_methods*/ -: 3721: 0, /*tp_members*/ -: 3722: 0, /*tp_getset*/ -: 3723:}; -: 3724: -: 3725:static PyTypeObject ImagingDraw_Type = { -: 3726: PyVarObject_HEAD_INIT(NULL, 0) -: 3727: "ImagingDraw", /*tp_name*/ -: 3728: sizeof(ImagingDrawObject), /*tp_size*/ -: 3729: 0, /*tp_itemsize*/ -: 3730: /* methods */ -: 3731: (destructor)_draw_dealloc, /*tp_dealloc*/ -: 3732: 0, /*tp_print*/ -: 3733: 0, /*tp_getattr*/ -: 3734: 0, /*tp_setattr*/ -: 3735: 0, /*tp_compare*/ -: 3736: 0, /*tp_repr*/ -: 3737: 0, /*tp_as_number */ -: 3738: 0, /*tp_as_sequence */ -: 3739: 0, /*tp_as_mapping */ -: 3740: 0, /*tp_hash*/ -: 3741: 0, /*tp_call*/ -: 3742: 0, /*tp_str*/ -: 3743: 0, /*tp_getattro*/ -: 3744: 0, /*tp_setattro*/ -: 3745: 0, /*tp_as_buffer*/ -: 3746: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 3747: 0, /*tp_doc*/ -: 3748: 0, /*tp_traverse*/ -: 3749: 0, /*tp_clear*/ -: 3750: 0, /*tp_richcompare*/ -: 3751: 0, /*tp_weaklistoffset*/ -: 3752: 0, /*tp_iter*/ -: 3753: 0, /*tp_iternext*/ -: 3754: _draw_methods, /*tp_methods*/ -: 3755: 0, /*tp_members*/ -: 3756: 0, /*tp_getset*/ -: 3757:}; -: 3758: -: 3759:#endif -: 3760: -: 3761:static PyMappingMethods pixel_access_as_mapping = { -: 3762: (lenfunc) NULL, /*mp_length*/ -: 3763: (binaryfunc) pixel_access_getitem, /*mp_subscript*/ -: 3764: (objobjargproc) pixel_access_setitem, /*mp_ass_subscript*/ -: 3765:}; -: 3766: -: 3767:/* type description */ -: 3768: -: 3769:static PyTypeObject PixelAccess_Type = { -: 3770: PyVarObject_HEAD_INIT(NULL, 0) -: 3771: "PixelAccess", sizeof(PixelAccessObject), 0, -: 3772: /* methods */ -: 3773: (destructor)pixel_access_dealloc, /*tp_dealloc*/ -: 3774: 0, /*tp_print*/ -: 3775: 0, /*tp_getattr*/ -: 3776: 0, /*tp_setattr*/ -: 3777: 0, /*tp_compare*/ -: 3778: 0, /*tp_repr*/ -: 3779: 0, /*tp_as_number */ -: 3780: 0, /*tp_as_sequence */ -: 3781: &pixel_access_as_mapping, /*tp_as_mapping */ -: 3782: 0 /*tp_hash*/ -: 3783:}; -: 3784: -: 3785:/* -------------------------------------------------------------------- */ -: 3786: -: 3787:static PyObject* function _get_stats called 20 returned 100% blocks executed 100% 20: 3788:_get_stats(PyObject* self, PyObject* args) -: 3789:{ -: 3790: PyObject* d; 20: 3791: ImagingMemoryArena arena = &ImagingDefaultArena; -: 3792: 20: 3793: if (!PyArg_ParseTuple(args, ":get_stats")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3794: return NULL; -: 3795: } -: 3796: 20: 3797: d = PyDict_New(); call 0 returned 100% 20: 3798: if ( ! d) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 3799: return NULL; -: 3800: } 20: 3801: PyDict_SetItemString(d, "new_count", call 0 returned 100% call 1 returned 100% 20: 3802: PyLong_FromLong(arena->stats_new_count)); 20: 3803: PyDict_SetItemString(d, "allocated_blocks", call 0 returned 100% call 1 returned 100% 20: 3804: PyLong_FromLong(arena->stats_allocated_blocks)); 20: 3805: PyDict_SetItemString(d, "reused_blocks", call 0 returned 100% call 1 returned 100% 20: 3806: PyLong_FromLong(arena->stats_reused_blocks)); 20: 3807: PyDict_SetItemString(d, "reallocated_blocks", call 0 returned 100% call 1 returned 100% 20: 3808: PyLong_FromLong(arena->stats_reallocated_blocks)); 20: 3809: PyDict_SetItemString(d, "freed_blocks", call 0 returned 100% call 1 returned 100% 20: 3810: PyLong_FromLong(arena->stats_freed_blocks)); 20: 3811: PyDict_SetItemString(d, "blocks_cached", call 0 returned 100% call 1 returned 100% 20: 3812: PyLong_FromLong(arena->blocks_cached)); 20: 3813: return d; -: 3814:} -: 3815: -: 3816:static PyObject* function _reset_stats called 5 returned 100% blocks executed 100% 5: 3817:_reset_stats(PyObject* self, PyObject* args) -: 3818:{ 5: 3819: ImagingMemoryArena arena = &ImagingDefaultArena; -: 3820: 5: 3821: if (!PyArg_ParseTuple(args, ":reset_stats")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3822: return NULL; -: 3823: } -: 3824: 5: 3825: arena->stats_new_count = 0; 5: 3826: arena->stats_allocated_blocks = 0; 5: 3827: arena->stats_reused_blocks = 0; 5: 3828: arena->stats_reallocated_blocks = 0; 5: 3829: arena->stats_freed_blocks = 0; -: 3830: 5: 3831: Py_INCREF(Py_None); 5: 3832: return Py_None; -: 3833:} -: 3834: -: 3835:static PyObject* function _get_alignment called 7 returned 100% blocks executed 100% 7: 3836:_get_alignment(PyObject* self, PyObject* args) -: 3837:{ 7: 3838: if (!PyArg_ParseTuple(args, ":get_alignment")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3839: return NULL; -: 3840: } -: 3841: 7: 3842: return PyLong_FromLong(ImagingDefaultArena.alignment); call 0 returned 100% -: 3843:} -: 3844: -: 3845:static PyObject* function _get_block_size called 5 returned 100% blocks executed 100% 5: 3846:_get_block_size(PyObject* self, PyObject* args) -: 3847:{ 5: 3848: if (!PyArg_ParseTuple(args, ":get_block_size")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3849: return NULL; -: 3850: } -: 3851: 5: 3852: return PyLong_FromLong(ImagingDefaultArena.block_size); call 0 returned 100% -: 3853:} -: 3854: -: 3855:static PyObject* function _get_blocks_max called 5 returned 100% blocks executed 100% 5: 3856:_get_blocks_max(PyObject* self, PyObject* args) -: 3857:{ 5: 3858: if (!PyArg_ParseTuple(args, ":get_blocks_max")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3859: return NULL; -: 3860: } -: 3861: 5: 3862: return PyLong_FromLong(ImagingDefaultArena.blocks_max); call 0 returned 100% -: 3863:} -: 3864: -: 3865:static PyObject* function _set_alignment called 22 returned 100% blocks executed 100% 22: 3866:_set_alignment(PyObject* self, PyObject* args) -: 3867:{ -: 3868: int alignment; 22: 3869: if (!PyArg_ParseTuple(args, "i:set_alignment", &alignment)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3870: return NULL; -: 3871: } -: 3872: 22: 3873: if (alignment < 1 || alignment > 128) { branch 0 taken 9% (fallthrough) branch 1 taken 91% 2: 3874: PyErr_SetString(PyExc_ValueError, "alignment should be from 1 to 128"); call 0 returned 100% 2: 3875: return NULL; -: 3876: } -: 3877: /* Is power of two */ 20: 3878: if (alignment & (alignment - 1)) { branch 0 taken 10% (fallthrough) branch 1 taken 90% 2: 3879: PyErr_SetString(PyExc_ValueError, "alignment should be power of two"); call 0 returned 100% 2: 3880: return NULL; -: 3881: } -: 3882: 18: 3883: ImagingDefaultArena.alignment = alignment; -: 3884: 18: 3885: Py_INCREF(Py_None); 18: 3886: return Py_None; -: 3887:} -: 3888: -: 3889:static PyObject* function _set_block_size called 24 returned 100% blocks executed 100% 24: 3890:_set_block_size(PyObject* self, PyObject* args) -: 3891:{ -: 3892: int block_size; 24: 3893: if (!PyArg_ParseTuple(args, "i:set_block_size", &block_size)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3894: return NULL; -: 3895: } -: 3896: 24: 3897: if (block_size <= 0) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 2: 3898: PyErr_SetString(PyExc_ValueError, call 0 returned 100% -: 3899: "block_size should be greater than 0"); 2: 3900: return NULL; -: 3901: } -: 3902: 22: 3903: if (block_size & 0xfff) { branch 0 taken 9% (fallthrough) branch 1 taken 91% 2: 3904: PyErr_SetString(PyExc_ValueError, call 0 returned 100% -: 3905: "block_size should be multiple of 4096"); 2: 3906: return NULL; -: 3907: } -: 3908: 20: 3909: ImagingDefaultArena.block_size = block_size; -: 3910: 20: 3911: Py_INCREF(Py_None); 20: 3912: return Py_None; -: 3913:} -: 3914: -: 3915:static PyObject* function _set_blocks_max called 21 returned 100% blocks executed 71% 21: 3916:_set_blocks_max(PyObject* self, PyObject* args) -: 3917:{ -: 3918: int blocks_max; 21: 3919: if (!PyArg_ParseTuple(args, "i:set_blocks_max", &blocks_max)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3920: return NULL; -: 3921: } -: 3922: 21: 3923: if (blocks_max < 0) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 1: 3924: PyErr_SetString(PyExc_ValueError, call 0 returned 100% -: 3925: "blocks_max should be greater than 0"); 1: 3926: return NULL; -: 3927: } 20: 3928: else if ( blocks_max > SIZE_MAX/sizeof(ImagingDefaultArena.blocks_pool[0])) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 3929: PyErr_SetString(PyExc_ValueError, call 0 never executed -: 3930: "blocks_max is too large"); #####: 3931: return NULL; -: 3932: } -: 3933: -: 3934: 20: 3935: if ( ! ImagingMemorySetBlocksMax(&ImagingDefaultArena, blocks_max)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 3936: ImagingError_MemoryError(); call 0 never executed #####: 3937: return NULL; -: 3938: } -: 3939: 20: 3940: Py_INCREF(Py_None); 20: 3941: return Py_None; -: 3942:} -: 3943: -: 3944:static PyObject* function _clear_cache called 18 returned 100% blocks executed 100% 18: 3945:_clear_cache(PyObject* self, PyObject* args) -: 3946:{ 18: 3947: int i = 0; -: 3948: 18: 3949: if (!PyArg_ParseTuple(args, "|i:clear_cache", &i)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 3950: return NULL; -: 3951: } -: 3952: 18: 3953: ImagingMemoryClearCache(&ImagingDefaultArena, i); call 0 returned 100% -: 3954: 18: 3955: Py_INCREF(Py_None); 18: 3956: return Py_None; -: 3957:} -: 3958: -: 3959:/* -------------------------------------------------------------------- */ -: 3960: -: 3961:/* FIXME: this is something of a mess. Should replace this with -: 3962: pluggable codecs, but not before PIL 1.2 */ -: 3963: -: 3964:/* Decoders (in decode.c) */ -: 3965:extern PyObject* PyImaging_BcnDecoderNew(PyObject* self, PyObject* args); -: 3966:extern PyObject* PyImaging_BitDecoderNew(PyObject* self, PyObject* args); -: 3967:extern PyObject* PyImaging_FliDecoderNew(PyObject* self, PyObject* args); -: 3968:extern PyObject* PyImaging_GifDecoderNew(PyObject* self, PyObject* args); -: 3969:extern PyObject* PyImaging_HexDecoderNew(PyObject* self, PyObject* args); -: 3970:extern PyObject* PyImaging_JpegDecoderNew(PyObject* self, PyObject* args); -: 3971:extern PyObject* PyImaging_Jpeg2KDecoderNew(PyObject* self, PyObject* args); -: 3972:extern PyObject* PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args); -: 3973:extern PyObject* PyImaging_PackbitsDecoderNew(PyObject* self, PyObject* args); -: 3974:extern PyObject* PyImaging_PcdDecoderNew(PyObject* self, PyObject* args); -: 3975:extern PyObject* PyImaging_PcxDecoderNew(PyObject* self, PyObject* args); -: 3976:extern PyObject* PyImaging_RawDecoderNew(PyObject* self, PyObject* args); -: 3977:extern PyObject* PyImaging_SgiRleDecoderNew(PyObject* self, PyObject* args); -: 3978:extern PyObject* PyImaging_SunRleDecoderNew(PyObject* self, PyObject* args); -: 3979:extern PyObject* PyImaging_TgaRleDecoderNew(PyObject* self, PyObject* args); -: 3980:extern PyObject* PyImaging_XbmDecoderNew(PyObject* self, PyObject* args); -: 3981:extern PyObject* PyImaging_ZipDecoderNew(PyObject* self, PyObject* args); -: 3982: -: 3983:/* Encoders (in encode.c) */ -: 3984:extern PyObject* PyImaging_EpsEncoderNew(PyObject* self, PyObject* args); -: 3985:extern PyObject* PyImaging_GifEncoderNew(PyObject* self, PyObject* args); -: 3986:extern PyObject* PyImaging_JpegEncoderNew(PyObject* self, PyObject* args); -: 3987:extern PyObject* PyImaging_Jpeg2KEncoderNew(PyObject* self, PyObject* args); -: 3988:extern PyObject* PyImaging_PcxEncoderNew(PyObject* self, PyObject* args); -: 3989:extern PyObject* PyImaging_RawEncoderNew(PyObject* self, PyObject* args); -: 3990:extern PyObject* PyImaging_TgaRleEncoderNew(PyObject* self, PyObject* args); -: 3991:extern PyObject* PyImaging_XbmEncoderNew(PyObject* self, PyObject* args); -: 3992:extern PyObject* PyImaging_ZipEncoderNew(PyObject* self, PyObject* args); -: 3993:extern PyObject* PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args); -: 3994: -: 3995:/* Display support etc (in display.c) */ -: 3996:#ifdef _WIN32 -: 3997:extern PyObject* PyImaging_CreateWindowWin32(PyObject* self, PyObject* args); -: 3998:extern PyObject* PyImaging_DisplayWin32(PyObject* self, PyObject* args); -: 3999:extern PyObject* PyImaging_DisplayModeWin32(PyObject* self, PyObject* args); -: 4000:extern PyObject* PyImaging_GrabScreenWin32(PyObject* self, PyObject* args); -: 4001:extern PyObject* PyImaging_GrabClipboardWin32(PyObject* self, PyObject* args); -: 4002:extern PyObject* PyImaging_ListWindowsWin32(PyObject* self, PyObject* args); -: 4003:extern PyObject* PyImaging_EventLoopWin32(PyObject* self, PyObject* args); -: 4004:extern PyObject* PyImaging_DrawWmf(PyObject* self, PyObject* args); -: 4005:#endif -: 4006:#ifdef HAVE_XCB -: 4007:extern PyObject* PyImaging_GrabScreenX11(PyObject* self, PyObject* args); -: 4008:#endif -: 4009: -: 4010:/* Experimental path stuff (in path.c) */ -: 4011:extern PyObject* PyPath_Create(ImagingObject* self, PyObject* args); -: 4012: -: 4013:/* Experimental outline stuff (in outline.c) */ -: 4014:extern PyObject* PyOutline_Create(ImagingObject* self, PyObject* args); -: 4015: -: 4016:extern PyObject* PyImaging_Mapper(PyObject* self, PyObject* args); -: 4017:extern PyObject* PyImaging_MapBuffer(PyObject* self, PyObject* args); -: 4018: -: 4019:static PyMethodDef functions[] = { -: 4020: -: 4021: /* Object factories */ -: 4022: {"alpha_composite", (PyCFunction)_alpha_composite, 1}, -: 4023: {"blend", (PyCFunction)_blend, 1}, -: 4024: {"fill", (PyCFunction)_fill, 1}, -: 4025: {"new", (PyCFunction)_new, 1}, -: 4026: {"merge", (PyCFunction)_merge, 1}, -: 4027: -: 4028: /* Functions */ -: 4029: {"convert", (PyCFunction)_convert2, 1}, -: 4030: -: 4031: /* Codecs */ -: 4032: {"bcn_decoder", (PyCFunction)PyImaging_BcnDecoderNew, 1}, -: 4033: {"bit_decoder", (PyCFunction)PyImaging_BitDecoderNew, 1}, -: 4034: {"eps_encoder", (PyCFunction)PyImaging_EpsEncoderNew, 1}, -: 4035: {"fli_decoder", (PyCFunction)PyImaging_FliDecoderNew, 1}, -: 4036: {"gif_decoder", (PyCFunction)PyImaging_GifDecoderNew, 1}, -: 4037: {"gif_encoder", (PyCFunction)PyImaging_GifEncoderNew, 1}, -: 4038: {"hex_decoder", (PyCFunction)PyImaging_HexDecoderNew, 1}, -: 4039: {"hex_encoder", (PyCFunction)PyImaging_EpsEncoderNew, 1}, /* EPS=HEX! */ -: 4040:#ifdef HAVE_LIBJPEG -: 4041: {"jpeg_decoder", (PyCFunction)PyImaging_JpegDecoderNew, 1}, -: 4042: {"jpeg_encoder", (PyCFunction)PyImaging_JpegEncoderNew, 1}, -: 4043:#endif -: 4044:#ifdef HAVE_OPENJPEG -: 4045: {"jpeg2k_decoder", (PyCFunction)PyImaging_Jpeg2KDecoderNew, 1}, -: 4046: {"jpeg2k_encoder", (PyCFunction)PyImaging_Jpeg2KEncoderNew, 1}, -: 4047:#endif -: 4048:#ifdef HAVE_LIBTIFF -: 4049: {"libtiff_decoder", (PyCFunction)PyImaging_LibTiffDecoderNew, 1}, -: 4050: {"libtiff_encoder", (PyCFunction)PyImaging_LibTiffEncoderNew, 1}, -: 4051:#endif -: 4052: {"packbits_decoder", (PyCFunction)PyImaging_PackbitsDecoderNew, 1}, -: 4053: {"pcd_decoder", (PyCFunction)PyImaging_PcdDecoderNew, 1}, -: 4054: {"pcx_decoder", (PyCFunction)PyImaging_PcxDecoderNew, 1}, -: 4055: {"pcx_encoder", (PyCFunction)PyImaging_PcxEncoderNew, 1}, -: 4056: {"raw_decoder", (PyCFunction)PyImaging_RawDecoderNew, 1}, -: 4057: {"raw_encoder", (PyCFunction)PyImaging_RawEncoderNew, 1}, -: 4058: {"sgi_rle_decoder", (PyCFunction)PyImaging_SgiRleDecoderNew, 1}, -: 4059: {"sun_rle_decoder", (PyCFunction)PyImaging_SunRleDecoderNew, 1}, -: 4060: {"tga_rle_decoder", (PyCFunction)PyImaging_TgaRleDecoderNew, 1}, -: 4061: {"tga_rle_encoder", (PyCFunction)PyImaging_TgaRleEncoderNew, 1}, -: 4062: {"xbm_decoder", (PyCFunction)PyImaging_XbmDecoderNew, 1}, -: 4063: {"xbm_encoder", (PyCFunction)PyImaging_XbmEncoderNew, 1}, -: 4064:#ifdef HAVE_LIBZ -: 4065: {"zip_decoder", (PyCFunction)PyImaging_ZipDecoderNew, 1}, -: 4066: {"zip_encoder", (PyCFunction)PyImaging_ZipEncoderNew, 1}, -: 4067:#endif -: 4068: -: 4069: /* Memory mapping */ -: 4070:#ifdef WITH_MAPPING -: 4071:#ifdef _WIN32 -: 4072: {"map", (PyCFunction)PyImaging_Mapper, 1}, -: 4073:#endif -: 4074: {"map_buffer", (PyCFunction)PyImaging_MapBuffer, 1}, -: 4075:#endif -: 4076: -: 4077: /* Display support */ -: 4078:#ifdef _WIN32 -: 4079: {"display", (PyCFunction)PyImaging_DisplayWin32, 1}, -: 4080: {"display_mode", (PyCFunction)PyImaging_DisplayModeWin32, 1}, -: 4081: {"grabscreen_win32", (PyCFunction)PyImaging_GrabScreenWin32, 1}, -: 4082: {"grabclipboard_win32", (PyCFunction)PyImaging_GrabClipboardWin32, 1}, -: 4083: {"createwindow", (PyCFunction)PyImaging_CreateWindowWin32, 1}, -: 4084: {"eventloop", (PyCFunction)PyImaging_EventLoopWin32, 1}, -: 4085: {"listwindows", (PyCFunction)PyImaging_ListWindowsWin32, 1}, -: 4086: {"drawwmf", (PyCFunction)PyImaging_DrawWmf, 1}, -: 4087:#endif -: 4088:#ifdef HAVE_XCB -: 4089: {"grabscreen_x11", (PyCFunction)PyImaging_GrabScreenX11, 1}, -: 4090:#endif -: 4091: -: 4092: /* Utilities */ -: 4093: {"getcodecstatus", (PyCFunction)_getcodecstatus, 1}, -: 4094: -: 4095: /* Special effects (experimental) */ -: 4096:#ifdef WITH_EFFECTS -: 4097: {"effect_mandelbrot", (PyCFunction)_effect_mandelbrot, 1}, -: 4098: {"effect_noise", (PyCFunction)_effect_noise, 1}, -: 4099: {"linear_gradient", (PyCFunction)_linear_gradient, 1}, -: 4100: {"radial_gradient", (PyCFunction)_radial_gradient, 1}, -: 4101: {"wedge", (PyCFunction)_linear_gradient, 1}, /* Compatibility */ -: 4102:#endif -: 4103: -: 4104: /* Drawing support stuff */ -: 4105:#ifdef WITH_IMAGEDRAW -: 4106: {"font", (PyCFunction)_font_new, 1}, -: 4107: {"draw", (PyCFunction)_draw_new, 1}, -: 4108:#endif -: 4109: -: 4110: /* Experimental path stuff */ -: 4111:#ifdef WITH_IMAGEPATH -: 4112: {"path", (PyCFunction)PyPath_Create, 1}, -: 4113:#endif -: 4114: -: 4115: /* Experimental arrow graphics stuff */ -: 4116:#ifdef WITH_ARROW -: 4117: {"outline", (PyCFunction)PyOutline_Create, 1}, -: 4118:#endif -: 4119: -: 4120: /* Resource management */ -: 4121: {"get_stats", (PyCFunction)_get_stats, 1}, -: 4122: {"reset_stats", (PyCFunction)_reset_stats, 1}, -: 4123: {"get_alignment", (PyCFunction)_get_alignment, 1}, -: 4124: {"get_block_size", (PyCFunction)_get_block_size, 1}, -: 4125: {"get_blocks_max", (PyCFunction)_get_blocks_max, 1}, -: 4126: {"set_alignment", (PyCFunction)_set_alignment, 1}, -: 4127: {"set_block_size", (PyCFunction)_set_block_size, 1}, -: 4128: {"set_blocks_max", (PyCFunction)_set_blocks_max, 1}, -: 4129: {"clear_cache", (PyCFunction)_clear_cache, 1}, -: 4130: -: 4131: {NULL, NULL} /* sentinel */ -: 4132:}; -: 4133: -: 4134:static int function setup_module called 3 returned 100% blocks executed 100% 3: 4135:setup_module(PyObject* m) { 3: 4136: PyObject* d = PyModule_GetDict(m); call 0 returned 100% 3: 4137: const char* version = (char*)PILLOW_VERSION; -: 4138: -: 4139: /* Ready object types */ 3: 4140: if (PyType_Ready(&Imaging_Type) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 4141: return -1; -: 4142: } -: 4143: -: 4144:#ifdef WITH_IMAGEDRAW 3: 4145: if (PyType_Ready(&ImagingFont_Type) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 4146: return -1; -: 4147: } -: 4148: 3: 4149: if (PyType_Ready(&ImagingDraw_Type) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 4150: return -1; -: 4151: } -: 4152:#endif 3: 4153: if (PyType_Ready(&PixelAccess_Type) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 4154: return -1; -: 4155: } -: 4156: 3: 4157: ImagingAccessInit(); call 0 returned 100% -: 4158: -: 4159:#ifdef HAVE_LIBJPEG -: 4160: { -: 4161: extern const char* ImagingJpegVersion(void); 3: 4162: PyDict_SetItemString(d, "jpeglib_version", PyUnicode_FromString(ImagingJpegVersion())); call 0 returned 100% call 1 returned 100% call 2 returned 100% -: 4163: } -: 4164:#endif -: 4165: -: 4166:#ifdef HAVE_OPENJPEG -: 4167: { -: 4168: extern const char *ImagingJpeg2KVersion(void); 3: 4169: PyDict_SetItemString(d, "jp2klib_version", PyUnicode_FromString(ImagingJpeg2KVersion())); call 0 returned 100% call 1 returned 100% call 2 returned 100% -: 4170: } -: 4171:#endif -: 4172: -: 4173:#ifdef LIBJPEG_TURBO_VERSION 3: 4174: PyModule_AddObject(m, "HAVE_LIBJPEGTURBO", Py_True); call 0 returned 100% -: 4175: #define tostr1(a) #a -: 4176: #define tostr(a) tostr1(a) 3: 4177: PyDict_SetItemString(d, "libjpeg_turbo_version", PyUnicode_FromString(tostr(LIBJPEG_TURBO_VERSION))); call 0 returned 100% call 1 returned 100% -: 4178: #undef tostr -: 4179: #undef tostr1 -: 4180:#else -: 4181: PyModule_AddObject(m, "HAVE_LIBJPEGTURBO", Py_False); -: 4182:#endif -: 4183: -: 4184:#ifdef HAVE_LIBIMAGEQUANT 3: 4185: PyModule_AddObject(m, "HAVE_LIBIMAGEQUANT", Py_True); call 0 returned 100% -: 4186: { -: 4187: extern const char* ImagingImageQuantVersion(void); 3: 4188: PyDict_SetItemString(d, "imagequant_version", PyUnicode_FromString(ImagingImageQuantVersion())); call 0 returned 100% call 1 returned 100% call 2 returned 100% -: 4189: } -: 4190:#else -: 4191: PyModule_AddObject(m, "HAVE_LIBIMAGEQUANT", Py_False); -: 4192:#endif -: 4193: -: 4194:#ifdef HAVE_LIBZ -: 4195: /* zip encoding strategies */ 3: 4196: PyModule_AddIntConstant(m, "DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY); call 0 returned 100% 3: 4197: PyModule_AddIntConstant(m, "FILTERED", Z_FILTERED); call 0 returned 100% 3: 4198: PyModule_AddIntConstant(m, "HUFFMAN_ONLY", Z_HUFFMAN_ONLY); call 0 returned 100% 3: 4199: PyModule_AddIntConstant(m, "RLE", Z_RLE); call 0 returned 100% 3: 4200: PyModule_AddIntConstant(m, "FIXED", Z_FIXED); call 0 returned 100% -: 4201: { -: 4202: extern const char* ImagingZipVersion(void); 3: 4203: PyDict_SetItemString(d, "zlib_version", PyUnicode_FromString(ImagingZipVersion())); call 0 returned 100% call 1 returned 100% call 2 returned 100% -: 4204: } -: 4205:#endif -: 4206: -: 4207:#ifdef HAVE_LIBTIFF -: 4208: { -: 4209: extern const char * ImagingTiffVersion(void); -: 4210: PyDict_SetItemString(d, "libtiff_version", PyUnicode_FromString(ImagingTiffVersion())); -: 4211: -: 4212: // Test for libtiff 4.0 or later, excluding libtiff 3.9.6 and 3.9.7 -: 4213: PyObject* support_custom_tags; -: 4214:#if TIFFLIB_VERSION >= 20111221 && TIFFLIB_VERSION != 20120218 && TIFFLIB_VERSION != 20120922 -: 4215: support_custom_tags = Py_True; -: 4216:#else -: 4217: support_custom_tags = Py_False; -: 4218:#endif -: 4219: PyDict_SetItemString(d, "libtiff_support_custom_tags", support_custom_tags); -: 4220: } -: 4221:#endif -: 4222: -: 4223:#ifdef HAVE_XCB 3: 4224: PyModule_AddObject(m, "HAVE_XCB", Py_True); call 0 returned 100% -: 4225:#else -: 4226: PyModule_AddObject(m, "HAVE_XCB", Py_False); -: 4227:#endif -: 4228: 3: 4229: PyDict_SetItemString(d, "PILLOW_VERSION", PyUnicode_FromString(version)); call 0 returned 100% call 1 returned 100% -: 4230: 3: 4231: return 0; -: 4232:} -: 4233: -: 4234:PyMODINIT_FUNC function PyInit__imaging called 3 returned 100% blocks executed 100% 3: 4235:PyInit__imaging(void) { -: 4236: PyObject* m; -: 4237: -: 4238: static PyModuleDef module_def = { -: 4239: PyModuleDef_HEAD_INIT, -: 4240: "_imaging", /* m_name */ -: 4241: NULL, /* m_doc */ -: 4242: -1, /* m_size */ -: 4243: functions, /* m_methods */ -: 4244: }; -: 4245: 3: 4246: m = PyModule_Create(&module_def); call 0 returned 100% -: 4247: 3: 4248: if (setup_module(m) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 4249: return NULL; -: 4250: } -: 4251: 3: 4252: return m; -: 4253:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Quant.c.gcov -: 0:Source:src/libImaging/Quant.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Quant.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Quant.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * image quantizer -: 6: * -: 7: * history: -: 8: * 1998-09-10 tjs Contributed -: 9: * 1998-12-29 fl Added to PIL 1.0b1 -: 10: * 2004-02-21 fl Fixed bogus free() on quantization error -: 11: * 2005-02-07 fl Limit number of colors to 256 -: 12: * -: 13: * Written by Toby J Sargeant . -: 14: * -: 15: * Copyright (c) 1998 by Toby J Sargeant -: 16: * Copyright (c) 1998-2004 by Secret Labs AB. All rights reserved. -: 17: * -: 18: * See the README file for information on usage and redistribution. -: 19: */ -: 20: -: 21:#include "Imaging.h" -: 22: -: 23:#include -: 24:#include -: 25:#include -: 26:#include -: 27: -: 28:#include "QuantTypes.h" -: 29:#include "QuantOctree.h" -: 30:#include "QuantPngQuant.h" -: 31:#include "QuantHash.h" -: 32:#include "QuantHeap.h" -: 33: -: 34:/* MSVC9.0 */ -: 35:#ifndef UINT32_MAX -: 36:#define UINT32_MAX 0xffffffff -: 37:#endif -: 38: -: 39:#define NO_OUTPUT -: 40: -: 41:typedef struct { -: 42: uint32_t scale; -: 43:} PixelHashData; -: 44: -: 45:typedef struct _PixelList { -: 46: struct _PixelList *next[3],*prev[3]; -: 47: Pixel p; -: 48: unsigned int flag:1; -: 49: int count; -: 50:} PixelList; -: 51: -: 52:typedef struct _BoxNode { -: 53: struct _BoxNode *l,*r; -: 54: PixelList *head[3],*tail[3]; -: 55: int axis; -: 56: int volume; -: 57: uint32_t pixelCount; -: 58:} BoxNode; -: 59: -: 60:#define _SQR(x) ((x)*(x)) -: 61:#define _DISTSQR(p1,p2) \ -: 62: _SQR((int)((p1)->c.r)-(int)((p2)->c.r))+ \ -: 63: _SQR((int)((p1)->c.g)-(int)((p2)->c.g))+ \ -: 64: _SQR((int)((p1)->c.b)-(int)((p2)->c.b)) -: 65: -: 66:#define MAX_HASH_ENTRIES 65536 -: 67: -: 68:#define PIXEL_HASH(r,g,b) \ -: 69: (((unsigned int)(r) )*463 ^ \ -: 70: ((unsigned int)(g)<< 8)*10069 ^ \ -: 71: ((unsigned int)(b)<<16)*64997) -: 72: -: 73:#define PIXEL_UNSCALE(p,q,s) \ -: 74: ((q)->c.r=(p)->c.r<<(s)), \ -: 75: ((q)->c.g=(p)->c.g<<(s)), \ -: 76: ((q)->c.b=(p)->c.b<<(s)) -: 77: -: 78:#define PIXEL_SCALE(p,q,s)\ -: 79: ((q)->c.r=(p)->c.r>>(s)), \ -: 80: ((q)->c.g=(p)->c.g>>(s)), \ -: 81: ((q)->c.b=(p)->c.b>>(s)) -: 82: -: 83:static uint32_t function unshifted_pixel_hash called 865738 returned 100% blocks executed 100% 865738: 84:unshifted_pixel_hash(const HashTable *h, const Pixel pixel) -: 85:{ 865738: 86: return PIXEL_HASH(pixel.c.r, pixel.c.g, pixel.c.b); -: 87:} -: 88: -: 89:static int function unshifted_pixel_cmp called 1131632 returned 100% blocks executed 100% 1131632: 90:unshifted_pixel_cmp(const HashTable *h, const Pixel pixel1, const Pixel pixel2) -: 91:{ 1131632: 92: if (pixel1.c.r==pixel2.c.r) { branch 0 taken 55% (fallthrough) branch 1 taken 45% 625746: 93: if (pixel1.c.g==pixel2.c.g) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 618838: 94: if (pixel1.c.b==pixel2.c.b) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 95: return 0; -: 96: } else { 8088: 97: return (int)(pixel1.c.b)-(int)(pixel2.c.b); -: 98: } -: 99: } else { 6908: 100: return (int)(pixel1.c.g)-(int)(pixel2.c.g); -: 101: } -: 102: } else { 505886: 103: return (int)(pixel1.c.r)-(int)(pixel2.c.r); -: 104: } -: 105:} -: 106: -: 107:static uint32_t function pixel_hash called 1613524 returned 100% blocks executed 100% 1613524: 108:pixel_hash(const HashTable *h,const Pixel pixel) -: 109:{ 1613524: 110: PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); call 0 returned 100% 1613524: 111: return PIXEL_HASH(pixel.c.r>>d->scale, pixel.c.g>>d->scale, pixel.c.b>>d->scale); -: 112:} -: 113: -: 114:static int function pixel_cmp called 2414222 returned 100% blocks executed 100% 2414222: 115:pixel_cmp(const HashTable *h,const Pixel pixel1, const Pixel pixel2) -: 116:{ 2414222: 117: PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); call 0 returned 100% -: 118: uint32_t A,B; 2414222: 119: A=PIXEL_HASH(pixel1.c.r>>d->scale, pixel1.c.g>>d->scale, pixel1.c.b>>d->scale); 2414222: 120: B=PIXEL_HASH(pixel2.c.r>>d->scale, pixel2.c.g>>d->scale, pixel2.c.b>>d->scale); 2414222: 121: return (A==B)?0:((Ascale=0; -: 166:#ifndef NO_OUTPUT -: 167: timer=timer3=clock(); -: 168:#endif 679280: 169: for (i=0;iMAX_HASH_ENTRIES) { call 0 returned 100% branch 1 taken 0% branch 2 taken 100% (fallthrough) #####: 176: d->scale++; -: 177:#ifndef NO_OUTPUT -: 178: printf ("rehashing - new scale: %d\n",(int)d->scale); -: 179: timer2=clock(); -: 180:#endif #####: 181: hashtable_rehash_compute(hash,rehash_collide); call 0 never executed -: 182:#ifndef NO_OUTPUT -: 183: timer2=clock()-timer2; -: 184: printf ("rehash took %f sec\n",timer2/(double)CLOCKS_PER_SEC); -: 185: timer+=timer2; -: 186:#endif -: 187: } -: 188: } -: 189:#ifndef NO_OUTPUT -: 190: printf ("inserts took %f sec\n",(clock()-timer)/(double)CLOCKS_PER_SEC); -: 191:#endif -: 192:#ifndef NO_OUTPUT -: 193: printf ("total %f sec\n",(clock()-timer3)/(double)CLOCKS_PER_SEC); -: 194:#endif -: 195: return hash; -: 196:} -: 197: -: 198:static void function destroy_pixel_hash called 12 returned 100% blocks executed 100% 12: 199:destroy_pixel_hash(HashTable *hash) -: 200:{ 12: 201: PixelHashData *d=(PixelHashData *)hashtable_get_user_data(hash); call 0 returned 100% 12: 202: if (d) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 12: 203: free(d); -: 204: } 12: 205: hashtable_free(hash); call 0 returned 100% 12: 206:} -: 207: -: 208: -: 209:/* 1. hash quantized pixels. */ -: 210:/* 2. create R,G,B lists of sorted quantized pixels. */ -: 211:/* 3. median cut. */ -: 212:/* 4. build hash table from median cut boxes. */ -: 213:/* 5. for each pixel, compute entry in hash table, and hence median cut box. */ -: 214:/* 6. compute median cut box pixel averages. */ -: 215:/* 7. map each pixel to nearest average. */ -: 216: -: 217:static int function compute_box_volume called 2363 returned 100% blocks executed 83% 2363: 218:compute_box_volume(BoxNode *b) -: 219:{ -: 220: unsigned char rl,rh,gl,gh,bl,bh; 2363: 221: if (b->volume>=0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 222: return b->volume; -: 223: } 2363: 224: if (!b->head[0]) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 225: b->volume=0; -: 226: } else { 2363: 227: rh=b->head[0]->p.c.r; 2363: 228: rl=b->tail[0]->p.c.r; 2363: 229: gh=b->head[1]->p.c.g; 2363: 230: gl=b->tail[1]->p.c.g; 2363: 231: bh=b->head[2]->p.c.b; 2363: 232: bl=b->tail[2]->p.c.b; 2363: 233: b->volume=(rh-rl+1)*(gh-gl+1)*(bh-bl+1); -: 234: } 2363: 235: return b->volume; -: 236:} -: 237: -: 238:static void function hash_to_list called 68518 returned 100% blocks executed 90% 68518: 239:hash_to_list(const HashTable *h, const Pixel pixel, const uint32_t count, void *u) -: 240:{ 68518: 241: PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); call 0 returned 100% 68518: 242: PixelList **pl=(PixelList **)u; -: 243: PixelList *p; -: 244: int i; -: 245: Pixel q; -: 246: 68518: 247: PIXEL_SCALE(&pixel,&q,d->scale); -: 248: -: 249: /* malloc check ok, small constant allocation */ 68518: 250: p=malloc(sizeof(PixelList)); 68518: 251: if (!p) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 252: return; -: 253: } -: 254: 68518: 255: p->flag=0; 68518: 256: p->p=q; 68518: 257: p->count=count; 274072: 258: for (i=0;i<3;i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 205554: 259: p->next[i]=pl[i]; 205554: 260: p->prev[i]=NULL; 205554: 261: if (pl[i]) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 205518: 262: pl[i]->prev[i]=p; -: 263: } 205554: 264: pl[i]=p; -: 265: } -: 266:} -: 267: -: 268:static PixelList * function mergesort_pixels called 411072 returned 100% blocks executed 100% 411072: 269:mergesort_pixels(PixelList *head, int i) -: 270:{ -: 271: PixelList *c,*t,*a,*b,*p; 411072: 272: if (!head||!head->next[i]) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 50% (fallthrough) branch 3 taken 50% 205554: 273: if (head) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 205554: 274: head->next[i]=NULL; 205554: 275: head->prev[i]=NULL; -: 276: } -: 277: return head; -: 278: } 1394181: 279: for (c=t=head;c&&t;c=c->next[i],t=(t->next[i])?t->next[i]->next[i]:NULL); branch 0 taken 95% (fallthrough) branch 1 taken 5% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 87% branch 5 taken 13% (fallthrough) 205518: 280: if (c) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 205518: 281: if (c->prev[i]) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 205518: 282: c->prev[i]->next[i]=NULL; -: 283: } 205518: 284: c->prev[i]=NULL; -: 285: } 205518: 286: a=mergesort_pixels(head,i); call 0 returned 100% 205518: 287: b=mergesort_pixels(c,i); 205518: 288: head=NULL; 205518: 289: p=NULL; call 0 returned 100% 2857215: 290: while (a&&b) { branch 0 taken 97% (fallthrough) branch 1 taken 3% branch 2 taken 95% branch 3 taken 5% (fallthrough) 2446179: 291: if (a->p.a.v[i]>b->p.a.v[i]) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 1234257: 292: c=a; 1234257: 293: a=a->next[i]; -: 294: } else { 1211922: 295: c=b; 1211922: 296: b=b->next[i]; -: 297: } 2446179: 298: c->prev[i]=p; 2446179: 299: c->next[i]=NULL; 2446179: 300: if (p) { branch 0 taken 92% (fallthrough) branch 1 taken 8% 2240661: 301: p->next[i]=c; -: 302: } 2446179: 303: p=c; 2446179: 304: if (!head) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 205518: 305: head=c; -: 306: } -: 307: } 205518: 308: if (a) { branch 0 taken 56% (fallthrough) branch 1 taken 44% 115455: 309: c->next[i]=a; 115455: 310: a->prev[i]=c; 90063: 311: } else if (b) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 90063: 312: c->next[i]=b; 90063: 313: b->prev[i]=c; -: 314: } -: 315: return head; -: 316:} -: 317: -: 318:#if defined(TEST_MERGESORT) || defined(TEST_SORTED) -: 319:static int -: 320:test_sorted(PixelList *pl[3]) -: 321:{ -: 322: int i,n,l; -: 323: PixelList *t; -: 324: -: 325: for(i=0;i<3;i++) { -: 326: n=0; -: 327: l=256; -: 328: for (t=pl[i];t;t=t->next[i]) { -: 329: if (lp.a.v[i]) return 0; -: 330: l=t->p.a.v[i]; -: 331: } -: 332: } -: 333: return 1; -: 334:} -: 335:#endif -: 336: -: 337:static int function box_heap_cmp called 31474 returned 100% blocks executed 100% 31474: 338:box_heap_cmp(const Heap *h, const void *A, const void *B) -: 339:{ 31474: 340: BoxNode *a=(BoxNode *)A; 31474: 341: BoxNode *b=(BoxNode *)B; 31474: 342: return (int)a->pixelCount-(int)b->pixelCount; -: 343:} -: 344: -: 345:#define LUMINANCE(p) (77*(p)->c.r+150*(p)->c.g+29*(p)->c.b) -: 346: -: 347:static int function splitlists called 2048 returned 100% blocks executed 100% 2048: 348:splitlists(PixelList *h[3], -: 349: PixelList *t[3], -: 350: PixelList *nh[2][3], -: 351: PixelList *nt[2][3], -: 352: uint32_t nCount[2], -: 353: int axis, -: 354: uint32_t pixelCount) -: 355:{ -: 356: uint32_t left; -: 357: -: 358: PixelList *l,*r,*c,*n; -: 359: int i; -: 360: int nRight,nLeft; -: 361: int splitColourVal; -: 362: -: 363:#ifdef TEST_SPLIT -: 364: { -: 365: PixelList *_prevTest,*_nextTest; -: 366: int _i,_nextCount[3],_prevCount[3]; -: 367: for (_i=0;_i<3;_i++) { -: 368: for (_nextCount[_i]=0,_nextTest=h[_i];_nextTest&&_nextTest->next[_i];_nextTest=_nextTest->next[_i],_nextCount[_i]++); -: 369: for (_prevCount[_i]=0,_prevTest=t[_i];_prevTest&&_prevTest->prev[_i];_prevTest=_prevTest->prev[_i],_prevCount[_i]++); -: 370: if (_nextTest!=t[_i]) { -: 371: printf ("next-list of axis %d does not end at tail\n",_i); -: 372: exit(1); -: 373: } -: 374: if (_prevTest!=h[_i]) { -: 375: printf ("prev-list of axis %d does not end at head\n",_i); -: 376: exit(1); -: 377: } -: 378: for (;_nextTest&&_nextTest->prev[_i];_nextTest=_nextTest->prev[_i]); -: 379: for (;_prevTest&&_prevTest->next[_i];_prevTest=_prevTest->next[_i]); -: 380: if (_nextTest!=h[_i]) { -: 381: printf ("next-list of axis %d does not loop back to head\n",_i); -: 382: exit(1); -: 383: } -: 384: if (_prevTest!=t[_i]) { -: 385: printf ("prev-list of axis %d does not loop back to tail\n",_i); -: 386: exit(1); -: 387: } -: 388: } -: 389: for (_i=1;_i<3;_i++) { -: 390: if (_prevCount[_i]!=_prevCount[_i-1] || -: 391: _nextCount[_i]!=_nextCount[_i-1] || -: 392: _prevCount[_i]!=_nextCount[_i]) { -: 393: printf ("{%d %d %d} {%d %d %d}\n", -: 394: _prevCount[0], -: 395: _prevCount[1], -: 396: _prevCount[2], -: 397: _nextCount[0], -: 398: _nextCount[1], -: 399: _nextCount[2]); -: 400: exit(1); -: 401: } -: 402: } -: 403: } -: 404:#endif 2048: 405: nCount[0]=nCount[1]=0; 2048: 406: nLeft=nRight=0; 266883: 407: for (left=0,c=h[axis];c;) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 264835: 408: left=left+c->count; 264835: 409: nCount[0]+=c->count; 264835: 410: c->flag=0; 264835: 411: nLeft++; 264835: 412: c=c->next[axis]; 264835: 413: if (left*2>pixelCount) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 414: break; -: 415: } -: 416: } 2048: 417: if (c) { branch 0 taken 96% (fallthrough) branch 1 taken 4% 1960: 418: splitColourVal=c->prev[axis]->p.a.v[axis]; 11346: 419: for (;c;c=c->next[axis]) { branch 0 taken 99% branch 1 taken 1% 11292: 420: if (splitColourVal!=c->p.a.v[axis]) { branch 0 taken 17% (fallthrough) branch 1 taken 83% -: 421: break; -: 422: } 9386: 423: c->flag=0; 9386: 424: nLeft++; 9386: 425: nCount[0]+=c->count; -: 426: } -: 427: } 211308: 428: for (;c;c=c->next[axis]) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 211308: 429: c->flag=1; 211308: 430: nRight++; 211308: 431: nCount[1]+=c->count; -: 432: } 2048: 433: if (!nRight) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 514: 434: for (c=t[axis],splitColourVal=t[axis]->p.a.v[axis];c;c=c->prev[axis]) { branch 0 taken 100% branch 1 taken 0% 514: 435: if (splitColourVal!=c->p.a.v[axis]) { branch 0 taken 28% (fallthrough) branch 1 taken 72% -: 436: break; -: 437: } 372: 438: c->flag=1; 372: 439: nRight++; 372: 440: nLeft--; 372: 441: nCount[0]-=c->count; 372: 442: nCount[1]+=c->count; -: 443: } -: 444: } -: 445:#ifndef NO_OUTPUT -: 446: if (!nLeft) { -: 447: for (c=h[axis];c;c=c->next[axis]) { -: 448: printf ("[%d %d %d]\n",c->p.c.r,c->p.c.g,c->p.c.b); -: 449: } -: 450: printf ("warning... trivial split\n"); -: 451: } -: 452:#endif -: 453: 6144: 454: for (i=0;i<3;i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 6144: 455: l=r=NULL; 6144: 456: nh[0][i]=nt[0][i]=NULL; 6144: 457: nh[1][i]=nt[1][i]=NULL; 1468875: 458: for (c=h[i];c;c=n) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1456587: 459: n=c->next[i]; 1456587: 460: if (c->flag) { /* move pixel to right list*/ branch 0 taken 44% (fallthrough) branch 1 taken 56% 635040: 461: if (r) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 628896: 462: r->next[i]=c; -: 463: } else { 6144: 464: nh[1][i]=c; -: 465: } 635040: 466: c->prev[i]=r; 635040: 467: r=c; -: 468: } else { /* move pixel to left list */ 821547: 469: if (l) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 815403: 470: l->next[i]=c; -: 471: } else { 6144: 472: nh[0][i]=c; -: 473: } 821547: 474: c->prev[i]=l; 821547: 475: l=c; -: 476: } -: 477: } 6144: 478: if (l) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 6144: 479: l->next[i]=NULL; -: 480: } 6144: 481: if (r) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 6144: 482: r->next[i]=NULL; -: 483: } 6144: 484: nt[0][i]=l; 6144: 485: nt[1][i]=r; -: 486: } 2048: 487: return 1; -: 488:} -: 489: -: 490:static int function split called 2048 returned 100% blocks executed 93% 2048: 491:split(BoxNode *node) -: 492:{ -: 493: unsigned char rl,rh,gl,gh,bl,bh; -: 494: int f[3]; -: 495: int best,axis; -: 496: int i; -: 497: PixelList *heads[2][3]; -: 498: PixelList *tails[2][3]; -: 499: uint32_t newCounts[2]; -: 500: BoxNode *left,*right; -: 501: 2048: 502: rh=node->head[0]->p.c.r; 2048: 503: rl=node->tail[0]->p.c.r; 2048: 504: gh=node->head[1]->p.c.g; 2048: 505: gl=node->tail[1]->p.c.g; 2048: 506: bh=node->head[2]->p.c.b; 2048: 507: bl=node->tail[2]->p.c.b; -: 508:#ifdef TEST_SPLIT -: 509: printf ("splitting node [%d %d %d] [%d %d %d] ",rl,gl,bl,rh,gh,bh); -: 510:#endif 2048: 511: f[0]=(rh-rl)*77; 2048: 512: f[1]=(gh-gl)*150; 2048: 513: f[2]=(bh-bl)*29; -: 514: 2048: 515: best=f[0]; 2048: 516: axis=0; 6144: 517: for (i=1;i<3;i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 4096: 518: if (besttail[_i]->next[_i]) { -: 530: printf ("tail is not tail\n"); -: 531: printf ("node->tail[%d]->next[%d]=%p\n",_i,_i,node->tail[_i]->next[_i]); -: 532: } -: 533: if (node->head[_i]->prev[_i]) { -: 534: printf ("head is not head\n"); -: 535: printf ("node->head[%d]->prev[%d]=%p\n",_i,_i,node->head[_i]->prev[_i]); -: 536: } -: 537: } -: 538: -: 539: for (_i=0;_i<3;_i++) { -: 540: for (_nextCount[_i]=0,_nextTest=node->head[_i];_nextTest&&_nextTest->next[_i];_nextTest=_nextTest->next[_i],_nextCount[_i]++); -: 541: for (_prevCount[_i]=0,_prevTest=node->tail[_i];_prevTest&&_prevTest->prev[_i];_prevTest=_prevTest->prev[_i],_prevCount[_i]++); -: 542: if (_nextTest!=node->tail[_i]) { -: 543: printf ("next-list of axis %d does not end at tail\n",_i); -: 544: } -: 545: if (_prevTest!=node->head[_i]) { -: 546: printf ("prev-list of axis %d does not end at head\n",_i); -: 547: } -: 548: for (;_nextTest&&_nextTest->prev[_i];_nextTest=_nextTest->prev[_i]); -: 549: for (;_prevTest&&_prevTest->next[_i];_prevTest=_prevTest->next[_i]); -: 550: if (_nextTest!=node->head[_i]) { -: 551: printf ("next-list of axis %d does not loop back to head\n",_i); -: 552: } -: 553: if (_prevTest!=node->tail[_i]) { -: 554: printf ("prev-list of axis %d does not loop back to tail\n",_i); -: 555: } -: 556: } -: 557: for (_i=1;_i<3;_i++) { -: 558: if (_prevCount[_i]!=_prevCount[_i-1] || -: 559: _nextCount[_i]!=_nextCount[_i-1] || -: 560: _prevCount[_i]!=_nextCount[_i]) { -: 561: printf ("{%d %d %d} {%d %d %d}\n", -: 562: _prevCount[0], -: 563: _prevCount[1], -: 564: _prevCount[2], -: 565: _nextCount[0], -: 566: _nextCount[1], -: 567: _nextCount[2]); -: 568: } -: 569: } -: 570: } -: 571:#endif 2048: 572: node->axis=axis; 4096: 573: if (!splitlists(node->head, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 2048: 574: node->tail, -: 575: heads, -: 576: tails, -: 577: newCounts, -: 578: axis, -: 579: node->pixelCount)) { -: 580:#ifndef NO_OUTPUT -: 581: printf ("list split failed.\n"); -: 582:#endif -: 583: return 0; -: 584: } -: 585:#ifdef TEST_SPLIT -: 586: if (!test_sorted(heads[0])) { -: 587: printf ("bug in split"); -: 588: exit(1); -: 589: } -: 590: if (!test_sorted(heads[1])) { -: 591: printf ("bug in split"); -: 592: exit(1); -: 593: } -: 594:#endif -: 595: /* malloc check ok, small constant allocation */ 2048: 596: left=malloc(sizeof(BoxNode)); 2048: 597: right=malloc(sizeof(BoxNode)); 2048: 598: if (!left||!right) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% #####: 599: free(left); #####: 600: free(right); #####: 601: return 0; -: 602: } 6144: 603: for(i=0;i<3;i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 6144: 604: left->head[i]=heads[0][i]; 6144: 605: left->tail[i]=tails[0][i]; 6144: 606: right->head[i]=heads[1][i]; 6144: 607: right->tail[i]=tails[1][i]; 6144: 608: node->head[i]=NULL; 6144: 609: node->tail[i]=NULL; -: 610: } -: 611:#ifdef TEST_SPLIT -: 612: if (left->head[0]) { -: 613: rh=left->head[0]->p.c.r; -: 614: rl=left->tail[0]->p.c.r; -: 615: gh=left->head[1]->p.c.g; -: 616: gl=left->tail[1]->p.c.g; -: 617: bh=left->head[2]->p.c.b; -: 618: bl=left->tail[2]->p.c.b; -: 619: printf (" left node [%3d %3d %3d] [%3d %3d %3d]\n",rl,gl,bl,rh,gh,bh); -: 620: } -: 621: if (right->head[0]) { -: 622: rh=right->head[0]->p.c.r; -: 623: rl=right->tail[0]->p.c.r; -: 624: gh=right->head[1]->p.c.g; -: 625: gl=right->tail[1]->p.c.g; -: 626: bh=right->head[2]->p.c.b; -: 627: bl=right->tail[2]->p.c.b; -: 628: printf (" right node [%3d %3d %3d] [%3d %3d %3d]\n",rl,gl,bl,rh,gh,bh); -: 629: } -: 630:#endif 2048: 631: left->l=left->r=NULL; 2048: 632: right->l=right->r=NULL; 2048: 633: left->axis=right->axis=-1; 2048: 634: left->volume=right->volume=-1; 2048: 635: left->pixelCount=newCounts[0]; 2048: 636: right->pixelCount=newCounts[1]; 2048: 637: node->l=left; 2048: 638: node->r=right; 2048: 639: return 1; -: 640:} -: 641: -: 642:static BoxNode * function median_cut called 12 returned 100% blocks executed 92% 12: 643:median_cut(PixelList *hl[3], -: 644: uint32_t imPixelCount, -: 645: int nPixels) -: 646:{ -: 647: PixelList *tl[3]; -: 648: int i; -: 649: BoxNode *root; -: 650: Heap* h; -: 651: BoxNode *thisNode; -: 652: 12: 653: h=ImagingQuantHeapNew(box_heap_cmp); call 0 returned 100% -: 654: /* malloc check ok, small constant allocation */ 12: 655: root=malloc(sizeof(BoxNode)); 12: 656: if (!root) { ImagingQuantHeapFree(h); return NULL; } branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 never executed 36: 657: for(i=0;i<3;i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 36: 658: for (tl[i]=hl[i];tl[i]&&tl[i]->next[i];tl[i]=tl[i]->next[i]); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 99% branch 3 taken 1% (fallthrough) 36: 659: root->head[i]=hl[i]; 36: 660: root->tail[i]=tl[i]; -: 661: } 12: 662: root->l=root->r=NULL; 12: 663: root->axis=-1; 12: 664: root->volume=-1; 12: 665: root->pixelCount=imPixelCount; -: 666: 12: 667: ImagingQuantHeapAdd(h,(void *)root); call 0 returned 100% 2072: 668: while (--nPixels) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 669: do { 2367: 670: if (!ImagingQuantHeapRemove(h,(void **)&thisNode)) { call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 671: goto done; -: 672: } 2363: 673: } while (compute_box_volume(thisNode)==1); call 0 returned 100% branch 1 taken 13% branch 2 taken 87% (fallthrough) 2048: 674: if (!split(thisNode)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 675:#ifndef NO_OUTPUT -: 676: printf ("Oops, split failed...\n"); -: 677:#endif #####: 678: exit (1); call 0 never executed -: 679: } 2048: 680: ImagingQuantHeapAdd(h,(void *)(thisNode->l)); call 0 returned 100% 2048: 681: ImagingQuantHeapAdd(h,(void *)(thisNode->r)); call 0 returned 100% -: 682: } -: 683:done: 12: 684: ImagingQuantHeapFree(h); call 0 returned 100% 12: 685: return root; -: 686:} -: 687: -: 688:static void function free_box_tree called 4108 returned 100% blocks executed 100% 4108: 689:free_box_tree(BoxNode *n) -: 690:{ -: 691: PixelList *p,*pp; 4108: 692: if (n->l) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 2048: 693: free_box_tree(n->l); call 0 returned 100% -: 694: } 4108: 695: if (n->r) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 2048: 696: free_box_tree(n->r); call 0 returned 100% -: 697: } 72626: 698: for (p=n->head[0];p;p=pp) { branch 0 taken 94% branch 1 taken 6% (fallthrough) 68518: 699: pp=p->next[0]; 68518: 700: free(p); -: 701: } 4108: 702: free(n); 4108: 703:} -: 704: -: 705:#ifdef TEST_SPLIT_INTEGRITY -: 706:static int -: 707:checkContained(BoxNode *n,Pixel *pp) -: 708:{ -: 709: if (n->l&&n->r) { -: 710: return checkContained(n->l,pp)+checkContained(n->r,pp); -: 711: } -: 712: if (n->l||n->r) { -: 713:#ifndef NO_OUTPUT -: 714: printf ("box tree is dead\n"); -: 715:#endif -: 716: return 0; -: 717: } -: 718: if ( -: 719: pp->c.r<=n->head[0]->p.c.r && -: 720: pp->c.r>=n->tail[0]->p.c.r && -: 721: pp->c.g<=n->head[1]->p.c.g && -: 722: pp->c.g>=n->tail[1]->p.c.g && -: 723: pp->c.b<=n->head[2]->p.c.b && -: 724: pp->c.b>=n->tail[2]->p.c.b) { -: 725: return 1; -: 726: } -: 727: return 0; -: 728:} -: 729:#endif -: 730: -: 731:static int function annotate_hash_table called 4108 returned 100% blocks executed 94% 4108: 732:annotate_hash_table(BoxNode *n,HashTable *h,uint32_t *box) -: 733:{ -: 734: PixelList *p; 4108: 735: PixelHashData *d=(PixelHashData *)hashtable_get_user_data(h); call 0 returned 100% -: 736: Pixel q; 4108: 737: if (n->l&&n->r) { branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 100% (fallthrough) branch 3 taken 0% 2048: 738: return annotate_hash_table(n->l,h,box) && annotate_hash_table(n->r,h,box); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% call 3 returned 100% branch 4 taken 0% (fallthrough) branch 5 taken 100% -: 739: } 2060: 740: if (n->l||n->r) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 741:#ifndef NO_OUTPUT -: 742: printf ("box tree is dead\n"); -: 743:#endif -: 744: return 0; -: 745: } 70578: 746: for (p=n->head[0];p;p=p->next[0]) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 68518: 747: PIXEL_UNSCALE(&(p->p),&q,d->scale); 68518: 748: if (!hashtable_insert(h,q,*box)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 749:#ifndef NO_OUTPUT -: 750: printf ("hashtable insert failed\n"); -: 751:#endif -: 752: return 0; -: 753: } -: 754: } 2060: 755: if (n->head[0]) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 2060: 756: (*box)++; -: 757: } -: 758: return 1; -: 759:} -: 760: -: 761:static int function _sort_ulong_ptr_keys called 2802385 returned 100% blocks executed 100% 2802385: 762:_sort_ulong_ptr_keys(const void *a, const void *b) -: 763:{ 2802385: 764: uint32_t A=**(uint32_t **)a; 2802385: 765: uint32_t B=**(uint32_t **)b; 2802385: 766: return (A==B)?0:((A*(skRow[k]));k--) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 791: skRow[k]=skRow[k-1]; -: 792: } #####: 793: if (k!=j) { branch 0 never executed branch 1 never executed #####: 794: skRow[k]=skElt; -: 795: } -: 796: } -: 797: } #####: 798: return 1; -: 799:} -: 800: -: 801:static int function build_distance_tables called 12 returned 100% blocks executed 100% 12: 802:build_distance_tables(uint32_t *avgDist, -: 803: uint32_t **avgDistSortKey, -: 804: Pixel *p, -: 805: uint32_t nEntries) -: 806:{ -: 807: uint32_t i,j; -: 808: 2072: 809: for (i=0;i1) { -: 1027: printf ("pixel in two boxes\n"); -: 1028: for(i=0;i<3;i++) { -: 1029: free (avg[i]); -: 1030: } -: 1031: free(count); -: 1032: return 0; -: 1033: } -: 1034:#endif 679268: 1035: if (!hashtable_lookup(medianBoxHash,pixelData[i],&paletteEntry)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 1036:#ifndef NO_OUTPUT -: 1037: printf ("pixel lookup failed\n"); -: 1038:#endif #####: 1039: for(i=0;i<3;i++) { branch 0 never executed branch 1 never executed #####: 1040: free (avg[i]); -: 1041: } #####: 1042: free(count); #####: 1043: return 0; -: 1044: } 679268: 1045: if (paletteEntry>=nPaletteEntries) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 1046:#ifndef NO_OUTPUT -: 1047: printf ("panic - paletteEntry>=nPaletteEntries (%d>=%d)\n",(int)paletteEntry,(int)nPaletteEntries); -: 1048:#endif #####: 1049: for(i=0;i<3;i++) { branch 0 never executed branch 1 never executed #####: 1050: free (avg[i]); -: 1051: } #####: 1052: free(count); #####: 1053: return 0; -: 1054: } 679268: 1055: avg[0][paletteEntry]+=pixelData[i].c.r; 679268: 1056: avg[1][paletteEntry]+=pixelData[i].c.g; 679268: 1057: avg[2][paletteEntry]+=pixelData[i].c.b; 679268: 1058: count[paletteEntry]++; -: 1059: } -: 1060: /* malloc check ok, using calloc */ 12: 1061: p=calloc(nPaletteEntries, sizeof(Pixel)); 12: 1062: if (!p) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 1063: for(i=0;i<3;i++) { branch 0 never executed branch 1 never executed #####: 1064: free (avg[i]); -: 1065: } #####: 1066: free(count); #####: 1067: return 0; -: 1068: } 2060: 1069: for (i=0;i=nPaletteEntries) { branch 0 never executed branch 1 never executed -: 1117:#ifndef NO_OUTPUT -: 1118: printf ("scream\n"); -: 1119:#endif -: 1120: return 0; -: 1121: } #####: 1122: avg[0][qp[i]]+=pixelData[i].c.r; #####: 1123: avg[1][qp[i]]+=pixelData[i].c.g; #####: 1124: avg[2][qp[i]]+=pixelData[i].c.b; #####: 1125: count[qp[i]]++; -: 1126: } #####: 1127: for (i=0;i UINT32_MAX / (sizeof(uint32_t))) { branch 0 never executed branch 1 never executed -: 1152: return 0; -: 1153: } -: 1154: /* malloc check ok, using calloc */ #####: 1155: if (!(count=calloc(nPaletteEntries, sizeof(uint32_t)))) { branch 0 never executed branch 1 never executed -: 1156: return 0; -: 1157: } #####: 1158: for(i=0;i<3;i++) { branch 0 never executed branch 1 never executed #####: 1159: avg[i]=NULL; -: 1160: } #####: 1161: for(i=0;i<3;i++) { branch 0 never executed branch 1 never executed -: 1162: /* malloc check ok, using calloc */ #####: 1163: if (!(avg[i]=calloc(nPaletteEntries, sizeof(uint32_t)))) { branch 0 never executed branch 1 never executed -: 1164: goto error_1; -: 1165: } -: 1166: } -: 1167: -: 1168: /* this is enough of a check, since the multiplication n*size is done above */ #####: 1169: if (nPaletteEntries > UINT32_MAX / nPaletteEntries) { branch 0 never executed branch 1 never executed -: 1170: goto error_1; -: 1171: } -: 1172: /* malloc check ok, using calloc, checking n*n above */ #####: 1173: avgDist=calloc(nPaletteEntries*nPaletteEntries, sizeof(uint32_t)); #####: 1174: if (!avgDist) { goto error_1; } branch 0 never executed branch 1 never executed -: 1175: -: 1176: /* malloc check ok, using calloc, checking n*n above */ #####: 1177: avgDistSortKey=calloc(nPaletteEntries*nPaletteEntries, sizeof(uint32_t *)); #####: 1178: if (!avgDistSortKey) { goto error_2; } branch 0 never executed branch 1 never executed -: 1179: -: 1180:#ifndef NO_OUTPUT -: 1181: printf("[");fflush(stdout); -: 1182:#endif -: 1183: while (1) { #####: 1184: if (!built) { branch 0 never executed branch 1 never executed #####: 1185: compute_palette_from_quantized_pixels(pixelData,nPixels,paletteData,nPaletteEntries,avg,count,qp); call 0 never executed #####: 1186: build_distance_tables(avgDist,avgDistSortKey,paletteData,nPaletteEntries); #####: 1187: built=1; call 0 never executed -: 1188: } else { #####: 1189: recompute_palette_from_averages(paletteData,nPaletteEntries,avg,count); call 0 never executed #####: 1190: resort_distance_tables(avgDist,avgDistSortKey,paletteData,nPaletteEntries); call 0 never executed -: 1191: } #####: 1192: changes=map_image_pixels_from_quantized_pixels(pixelData, call 0 never executed -: 1193: nPixels, -: 1194: paletteData, -: 1195: nPaletteEntries, -: 1196: avgDist, -: 1197: avgDistSortKey, -: 1198: qp, -: 1199: avg, -: 1200: count); #####: 1201: if (changes<0) { branch 0 never executed branch 1 never executed -: 1202: goto error_3; -: 1203: } -: 1204:#ifndef NO_OUTPUT -: 1205: printf (".(%d)",changes);fflush(stdout); -: 1206:#endif #####: 1207: if (changes<=threshold) { branch 0 never executed branch 1 never executed -: 1208: break; -: 1209: } -: 1210: } -: 1211:#ifndef NO_OUTPUT -: 1212: printf("]\n"); -: 1213:#endif #####: 1214: if (avgDistSortKey) { branch 0 never executed branch 1 never executed #####: 1215: free(avgDistSortKey); -: 1216: } #####: 1217: if (avgDist) { branch 0 never executed branch 1 never executed #####: 1218: free(avgDist); -: 1219: } #####: 1220: for(i=0;i<3;i++) { branch 0 never executed branch 1 never executed #####: 1221: if (avg[i]) { branch 0 never executed branch 1 never executed #####: 1222: free (avg[i]); -: 1223: } -: 1224: } #####: 1225: if (count) { branch 0 never executed branch 1 never executed #####: 1226: free(count); -: 1227: } -: 1228: return 1; -: 1229: -: 1230:error_3: #####: 1231: if (avgDistSortKey) { branch 0 never executed branch 1 never executed #####: 1232: free(avgDistSortKey); -: 1233: } -: 1234:error_2: #####: 1235: if (avgDist) { branch 0 never executed branch 1 never executed #####: 1236: free(avgDist); -: 1237: } -: 1238:error_1: #####: 1239: for(i=0;i<3;i++) { branch 0 never executed branch 1 never executed #####: 1240: if (avg[i]) { branch 0 never executed branch 1 never executed #####: 1241: free (avg[i]); -: 1242: } -: 1243: } #####: 1244: if (count) { branch 0 never executed branch 1 never executed #####: 1245: free(count); -: 1246: } -: 1247: return 0; -: 1248:} -: 1249: -: 1250:int function quantize called 12 returned 100% blocks executed 70% 12: 1251:quantize(Pixel *pixelData, -: 1252: uint32_t nPixels, -: 1253: uint32_t nQuantPixels, -: 1254: Pixel **palette, -: 1255: uint32_t *paletteLength, -: 1256: uint32_t **quantizedPixels, -: 1257: int kmeans) -: 1258:{ -: 1259: PixelList *hl[3]; -: 1260: HashTable *h; -: 1261: BoxNode *root; -: 1262: uint32_t i; -: 1263: uint32_t *qp; -: 1264: uint32_t nPaletteEntries; -: 1265: -: 1266: uint32_t *avgDist; -: 1267: uint32_t **avgDistSortKey; -: 1268: Pixel *p; -: 1269: -: 1270:#ifndef NO_OUTPUT -: 1271: uint32_t timer,timer2; -: 1272:#endif -: 1273: -: 1274:#ifndef NO_OUTPUT -: 1275: timer2=clock(); -: 1276: printf ("create hash table..."); fflush(stdout); timer=clock(); -: 1277:#endif 12: 1278: h=create_pixel_hash(pixelData,nPixels); call 0 returned 100% -: 1279:#ifndef NO_OUTPUT -: 1280: printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); -: 1281:#endif 12: 1282: if (!h) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1283: goto error_0; -: 1284: } -: 1285: -: 1286:#ifndef NO_OUTPUT -: 1287: printf ("create lists from hash table..."); fflush(stdout); timer=clock(); -: 1288:#endif 12: 1289: hl[0]=hl[1]=hl[2]=NULL; 12: 1290: hashtable_foreach(h,hash_to_list,hl); call 0 returned 100% -: 1291:#ifndef NO_OUTPUT -: 1292: printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); -: 1293:#endif -: 1294: 12: 1295: if (!hl[0]) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1296: goto error_1; -: 1297: } -: 1298: -: 1299:#ifndef NO_OUTPUT -: 1300: printf ("mergesort lists..."); fflush(stdout); timer=clock(); -: 1301:#endif 36: 1302: for(i=0;i<3;i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 36: 1303: hl[i]=mergesort_pixels(hl[i],i); call 0 returned 100% -: 1304: } -: 1305:#ifdef TEST_MERGESORT -: 1306: if (!test_sorted(hl)) { -: 1307: printf ("bug in mergesort\n"); -: 1308: goto error_1; -: 1309: } -: 1310:#endif -: 1311:#ifndef NO_OUTPUT -: 1312: printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); -: 1313:#endif -: 1314: -: 1315:#ifndef NO_OUTPUT -: 1316: printf ("median cut..."); fflush(stdout); timer=clock(); -: 1317:#endif 12: 1318: root=median_cut(hl,nPixels,nQuantPixels); call 0 returned 100% -: 1319:#ifndef NO_OUTPUT -: 1320: printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); -: 1321:#endif 12: 1322: if (!root) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1323: goto error_1; -: 1324: } 12: 1325: nPaletteEntries=0; -: 1326:#ifndef NO_OUTPUT -: 1327: printf ("median cut tree to hash table..."); fflush(stdout); timer=clock(); -: 1328:#endif 12: 1329: annotate_hash_table(root,h,&nPaletteEntries); call 0 returned 100% -: 1330:#ifndef NO_OUTPUT -: 1331: printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); -: 1332:#endif -: 1333:#ifndef NO_OUTPUT -: 1334: printf ("compute palette...\n"); fflush(stdout); timer=clock(); -: 1335:#endif 12: 1336: if (!compute_palette_from_median_cut(pixelData,nPixels,h,&p,nPaletteEntries)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1337: goto error_3; -: 1338: } -: 1339:#ifndef NO_OUTPUT -: 1340: printf ("done (%f)\n",(clock()-timer)/(double)CLOCKS_PER_SEC); -: 1341:#endif -: 1342: 12: 1343: free_box_tree(root); call 0 returned 100% 12: 1344: root=NULL; -: 1345: -: 1346: /* malloc check ok, using calloc for overflow */ 12: 1347: qp=calloc(nPixels, sizeof(uint32_t)); 12: 1348: if (!qp) { goto error_4; } branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1349: 12: 1350: if (nPaletteEntries > UINT32_MAX / nPaletteEntries ) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1351: goto error_5; -: 1352: } -: 1353: /* malloc check ok, using calloc for overflow, check of n*n above */ 12: 1354: avgDist=calloc(nPaletteEntries*nPaletteEntries, sizeof(uint32_t)); 12: 1355: if (!avgDist) { goto error_5; } branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1356: -: 1357: /* malloc check ok, using calloc for overflow, check of n*n above */ 12: 1358: avgDistSortKey=calloc(nPaletteEntries*nPaletteEntries, sizeof(uint32_t *)); 12: 1359: if (!avgDistSortKey) { goto error_6; } branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1360: 12: 1361: if (!build_distance_tables(avgDist,avgDistSortKey,p,nPaletteEntries)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1362: goto error_7; -: 1363: } -: 1364: 12: 1365: if (!map_image_pixels_from_median_box(pixelData,nPixels,p,nPaletteEntries,h,avgDist,avgDistSortKey,qp)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1366: goto error_7; -: 1367: } -: 1368: -: 1369:#ifdef TEST_NEAREST_NEIGHBOUR -: 1370:#include -: 1371: { -: 1372: uint32_t bestmatch,bestdist,dist; -: 1373: HashTable *h2; -: 1374: printf ("nearest neighbour search (full search)..."); fflush(stdout); timer=clock(); -: 1375: h2=hashtable_new(unshifted_pixel_hash,unshifted_pixel_cmp); -: 1376: for (i=0;inew),&pixel); #####: 1488: if (data->secondPixel || newDistdata->furthestDistance) { branch 0 never executed branch 1 never executed #####: 1493: data->furthestDistance=oldDist; #####: 1494: data->furthest.v=pixel.v; -: 1495: } #####: 1496:} -: 1497: -: 1498:int function quantize2 called 0 returned 0% blocks executed 0% #####: 1499:quantize2(Pixel *pixelData, -: 1500: uint32_t nPixels, -: 1501: uint32_t nQuantPixels, -: 1502: Pixel **palette, -: 1503: uint32_t *paletteLength, -: 1504: uint32_t **quantizedPixels, -: 1505: int kmeans) -: 1506:{ -: 1507: HashTable *h; -: 1508: uint32_t i; -: 1509: uint32_t mean[3]; -: 1510: Pixel *p; -: 1511: DistanceData data; -: 1512: -: 1513: uint32_t *qp; -: 1514: uint32_t *avgDist; -: 1515: uint32_t **avgDistSortKey; -: 1516: -: 1517: /* malloc check ok, using calloc */ #####: 1518: p=calloc(nQuantPixels, sizeof(Pixel)); #####: 1519: if (!p) { branch 0 never executed branch 1 never executed -: 1520: return 0; -: 1521: } #####: 1522: mean[0]=mean[1]=mean[2]=0; #####: 1523: h=hashtable_new(unshifted_pixel_hash,unshifted_pixel_cmp); #####: 1524: for (i=0;i UINT32_MAX / nQuantPixels ) { branch 0 never executed branch 1 never executed -: 1547: goto error_2; -: 1548: } -: 1549: -: 1550: /* malloc check ok, using calloc for overflow, check of n*n above */ #####: 1551: avgDist=calloc(nQuantPixels*nQuantPixels, sizeof(uint32_t)); #####: 1552: if (!avgDist) { goto error_2; } branch 0 never executed branch 1 never executed -: 1553: -: 1554: /* malloc check ok, using calloc for overflow, check of n*n above */ #####: 1555: avgDistSortKey=calloc(nQuantPixels*nQuantPixels, sizeof(uint32_t *)); #####: 1556: if (!avgDistSortKey) { goto error_3; } branch 0 never executed branch 1 never executed -: 1557: #####: 1558: if (!build_distance_tables(avgDist,avgDistSortKey,p,nQuantPixels)) { call 0 never executed branch 1 never executed branch 2 never executed -: 1559: goto error_4; -: 1560: } -: 1561: #####: 1562: if (!map_image_pixels(pixelData,nPixels,p,nQuantPixels,avgDist,avgDistSortKey,qp)) { call 0 never executed branch 1 never executed branch 2 never executed -: 1563: goto error_4; -: 1564: } #####: 1565: if (kmeans) { branch 0 never executed branch 1 never executed #####: 1566: k_means(pixelData,nPixels,p,nQuantPixels,qp,kmeans-1); call 0 never executed -: 1567: } -: 1568: #####: 1569: *paletteLength=nQuantPixels; #####: 1570: *palette=p; #####: 1571: *quantizedPixels=qp; #####: 1572: free(avgDistSortKey); #####: 1573: free(avgDist); #####: 1574: return 1; -: 1575: -: 1576:error_4: #####: 1577: free(avgDistSortKey); -: 1578:error_3: #####: 1579: free(avgDist); -: 1580:error_2: #####: 1581: free(qp); -: 1582:error_1: #####: 1583: free(p); #####: 1584: return 0; -: 1585:} -: 1586: -: 1587:Imaging function ImagingQuantize called 25 returned 100% blocks executed 77% 25: 1588:ImagingQuantize(Imaging im, int colors, int mode, int kmeans) -: 1589:{ -: 1590: int i, j; -: 1591: int x, y, v; -: 1592: UINT8* pp; -: 1593: Pixel* p; -: 1594: Pixel* palette; -: 1595: uint32_t paletteLength; -: 1596: int result; -: 1597: uint32_t* newData; -: 1598: Imaging imOut; 25: 1599: int withAlpha = 0; -: 1600: ImagingSectionCookie cookie; -: 1601: 25: 1602: if (!im) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1603: return ImagingError_ModeError(); call 0 never executed -: 1604: } 25: 1605: if (colors < 1 || colors > 256) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 1606: /* FIXME: for colors > 256, consider returning an RGB image -: 1607: instead (see @PIL205) */ #####: 1608: return (Imaging) ImagingError_ValueError("bad number of colors"); call 0 never executed -: 1609: } -: 1610: 49: 1611: if (strcmp(im->mode, "L") != 0 && strcmp(im->mode, "P") != 0 && branch 0 taken 4% (fallthrough) branch 1 taken 96% branch 2 taken 96% (fallthrough) branch 3 taken 4% branch 4 taken 0% (fallthrough) branch 5 taken 100% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 46% (fallthrough) branch 9 taken 54% 35: 1612: strcmp(im->mode, "RGB") != 0 && strcmp(im->mode, "RGBA") !=0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 1613: return ImagingError_ModeError(); call 0 never executed -: 1614: } -: 1615: -: 1616: /* only octree and imagequant supports RGBA */ 25: 1617: if (!strcmp(im->mode, "RGBA") && mode != 2 && mode != 3) { branch 0 taken 44% (fallthrough) branch 1 taken 56% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 never executed branch 5 never executed #####: 1618: return ImagingError_ModeError(); call 0 never executed -: 1619: } -: 1620: 25: 1621: if (im->xsize > INT_MAX / im->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1622: return ImagingError_MemoryError(); call 0 never executed -: 1623: } -: 1624: /* malloc check ok, using calloc for final overflow, x*y above */ 25: 1625: p = calloc(im->xsize * im->ysize, sizeof(Pixel)); 25: 1626: if (!p) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1627: return ImagingError_MemoryError(); call 0 never executed -: 1628: } -: 1629: -: 1630: /* collect statistics */ -: 1631: -: 1632: /* FIXME: maybe we could load the hash tables directly from the -: 1633: image data? */ -: 1634: 25: 1635: if (!strcmp(im->mode, "L")) { branch 0 taken 4% (fallthrough) branch 1 taken 96% branch 2 taken 4% (fallthrough) branch 3 taken 96% -: 1636: /* greyscale */ -: 1637: -: 1638: /* FIXME: converting a "L" image to "P" with 256 colors -: 1639: should be done by a simple copy... */ -: 1640: 128: 1641: for (i = y = 0; y < im->ysize; y++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 16384: 1642: for (x = 0; x < im->xsize; x++, i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1643: p[i].c.r = p[i].c.g = p[i].c.b = im->image8[y][x]; 16384: 1644: p[i].c.a = 255; -: 1645: } -: 1646: } -: 1647: 24: 1648: } else if (!strcmp(im->mode, "P")) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 1649: /* palette */ -: 1650: #####: 1651: pp = im->palette->palette; -: 1652: #####: 1653: for (i = y = 0; y < im->ysize; y++) { branch 0 never executed branch 1 never executed #####: 1654: for (x = 0; x < im->xsize; x++, i++) { branch 0 never executed branch 1 never executed #####: 1655: v = im->image8[y][x]; #####: 1656: p[i].c.r = pp[v*4+0]; #####: 1657: p[i].c.g = pp[v*4+1]; #####: 1658: p[i].c.b = pp[v*4+2]; #####: 1659: p[i].c.a = pp[v*4+3]; -: 1660: } -: 1661: } -: 1662: 24: 1663: } else if (!strcmp(im->mode, "RGB") || !strcmp(im->mode, "RGBA")) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 46% (fallthrough) branch 7 taken 54% branch 8 taken 100% (fallthrough) branch 9 taken 0% -: 1664: /* true colour */ -: 1665: 3207: 1666: for (i = y = 0; y < im->ysize; y++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 881337: 1667: for (x = 0; x < im->xsize; x++, i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 881337: 1668: p[i].v = im->image32[y][x]; -: 1669: } -: 1670: } -: 1671: -: 1672: } else { #####: 1673: free(p); #####: 1674: return (Imaging) ImagingError_ValueError("internal error"); call 0 never executed -: 1675: } -: 1676: 25: 1677: ImagingSectionEnter(&cookie); call 0 returned 100% -: 1678: 25: 1679: switch (mode) { branch 0 taken 48% branch 1 taken 0% branch 2 taken 48% branch 3 taken 4% branch 4 taken 0% -: 1680: case 0: -: 1681: /* median cut */ 12: 1682: result = quantize( call 0 returned 100% -: 1683: p, 12: 1684: im->xsize*im->ysize, -: 1685: colors, -: 1686: &palette, -: 1687: &paletteLength, -: 1688: &newData, -: 1689: kmeans -: 1690: ); 12: 1691: break; -: 1692: case 1: -: 1693: /* maximum coverage */ #####: 1694: result = quantize2( call 0 never executed -: 1695: p, #####: 1696: im->xsize*im->ysize, -: 1697: colors, -: 1698: &palette, -: 1699: &paletteLength, -: 1700: &newData, -: 1701: kmeans -: 1702: ); #####: 1703: break; -: 1704: case 2: 12: 1705: if (!strcmp(im->mode, "RGBA")) { branch 0 taken 92% (fallthrough) branch 1 taken 8% 11: 1706: withAlpha = 1; -: 1707: } 12: 1708: result = quantize_octree( call 0 returned 100% -: 1709: p, 12: 1710: im->xsize*im->ysize, -: 1711: colors, -: 1712: &palette, -: 1713: &paletteLength, -: 1714: &newData, -: 1715: withAlpha -: 1716: ); 12: 1717: break; -: 1718: case 3: -: 1719:#ifdef HAVE_LIBIMAGEQUANT 1: 1720: if (!strcmp(im->mode, "RGBA")) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1721: withAlpha = 1; -: 1722: } 2: 1723: result = quantize_pngquant( call 0 returned 100% -: 1724: p, 1: 1725: im->xsize, 1: 1726: im->ysize, -: 1727: colors, -: 1728: &palette, -: 1729: &paletteLength, -: 1730: &newData, -: 1731: withAlpha -: 1732: ); -: 1733:#else -: 1734: result = -1; -: 1735:#endif 1: 1736: break; -: 1737: default: -: 1738: result = 0; -: 1739: break; -: 1740: } -: 1741: 25: 1742: free(p); 25: 1743: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1744: 25: 1745: if (result > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 25: 1746: imOut = ImagingNewDirty("P", im->xsize, im->ysize); call 0 returned 100% 25: 1747: ImagingSectionEnter(&cookie); -: 1748: 3360: 1749: for (i = y = 0; y < im->ysize; y++) { call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% 897721: 1750: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 897721: 1751: imOut->image8[y][x] = (unsigned char) newData[i++]; -: 1752: } -: 1753: } -: 1754: 25: 1755: free(newData); -: 1756: 25: 1757: pp = imOut->palette->palette; -: 1758: 5101: 1759: for (i = j = 0; i < (int) paletteLength; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5076: 1760: *pp++ = palette[i].c.r; 5076: 1761: *pp++ = palette[i].c.g; 5076: 1762: *pp++ = palette[i].c.b; 5076: 1763: if (withAlpha) { branch 0 taken 55% (fallthrough) branch 1 taken 45% 2816: 1764: *pp++ = palette[i].c.a; -: 1765: } else { 2260: 1766: *pp++ = 255; -: 1767: } -: 1768: } 1324: 1769: for (; i < 256; i++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 1324: 1770: *pp++ = 0; 1324: 1771: *pp++ = 0; 1324: 1772: *pp++ = 0; 1324: 1773: *pp++ = 255; -: 1774: } -: 1775: 25: 1776: if (withAlpha) { branch 0 taken 44% (fallthrough) branch 1 taken 56% 11: 1777: strcpy(imOut->palette->mode, "RGBA"); -: 1778: } -: 1779: 25: 1780: free(palette); 25: 1781: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1782: 25: 1783: return imOut; -: 1784: -: 1785: } else { -: 1786: #####: 1787: if (result == -1) { branch 0 never executed branch 1 never executed #####: 1788: return (Imaging) ImagingError_ValueError( call 0 never executed -: 1789: "dependency required by this method was not " -: 1790: "enabled at compile time"); -: 1791: } -: 1792: #####: 1793: return (Imaging) ImagingError_ValueError("quantization error"); call 0 never executed -: 1794: -: 1795: } -: 1796:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Chops.c.gcov -: 0:Source:src/libImaging/Chops.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Chops.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Chops.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * basic channel operations -: 6: * -: 7: * history: -: 8: * 1996-03-28 fl Created -: 9: * 1996-08-13 fl Added and/or/xor for "1" images -: 10: * 1996-12-14 fl Added add_modulo, sub_modulo -: 11: * 2005-09-10 fl Fixed output values from and/or/xor -: 12: * -: 13: * Copyright (c) 1996 by Fredrik Lundh. -: 14: * Copyright (c) 1997 by Secret Labs AB. -: 15: * -: 16: * See the README file for details on usage and redistribution. -: 17: */ -: 18: -: 19: -: 20:#include "Imaging.h" -: 21: -: 22:#define CHOP(operation)\ -: 23: int x, y;\ -: 24: Imaging imOut;\ -: 25: imOut = create(imIn1, imIn2, NULL);\ -: 26: if (!imOut) {\ -: 27: return NULL;\ -: 28: }\ -: 29: for (y = 0; y < imOut->ysize; y++) {\ -: 30: UINT8* out = (UINT8*) imOut->image[y];\ -: 31: UINT8* in1 = (UINT8*) imIn1->image[y];\ -: 32: UINT8* in2 = (UINT8*) imIn2->image[y];\ -: 33: for (x = 0; x < imOut->linesize; x++) {\ -: 34: int temp = operation;\ -: 35: if (temp <= 0) {\ -: 36: out[x] = 0;\ -: 37: } else if (temp >= 255) {\ -: 38: out[x] = 255;\ -: 39: } else {\ -: 40: out[x] = temp;\ -: 41: }\ -: 42: }\ -: 43: }\ -: 44: return imOut; -: 45: -: 46:#define CHOP2(operation, mode)\ -: 47: int x, y;\ -: 48: Imaging imOut;\ -: 49: imOut = create(imIn1, imIn2, mode);\ -: 50: if (!imOut) {\ -: 51: return NULL;\ -: 52: }\ -: 53: for (y = 0; y < imOut->ysize; y++) {\ -: 54: UINT8* out = (UINT8*) imOut->image[y];\ -: 55: UINT8* in1 = (UINT8*) imIn1->image[y];\ -: 56: UINT8* in2 = (UINT8*) imIn2->image[y];\ -: 57: for (x = 0; x < imOut->linesize; x++) {\ -: 58: out[x] = operation;\ -: 59: }\ -: 60: }\ -: 61: return imOut; -: 62: -: 63:static Imaging function create called 146 returned 100% blocks executed 88% 146: 64:create(Imaging im1, Imaging im2, char* mode) -: 65:{ -: 66: int xsize, ysize; -: 67: 146: 68: if (!im1 || !im2 || im1->type != IMAGING_TYPE_UINT8 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 25% (fallthrough) branch 7 taken 75% 36: 69: (mode != NULL && (strcmp(im1->mode, "1") || strcmp(im2->mode, "1")))) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 70: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 71: } 292: 72: if (im1->type != im2->type || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% 146: 73: im1->bands != im2->bands) { #####: 74: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 75: } -: 76: 146: 77: xsize = (im1->xsize < im2->xsize) ? im1->xsize : im2->xsize; 146: 78: ysize = (im1->ysize < im2->ysize) ? im1->ysize : im2->ysize; -: 79: 146: 80: return ImagingNewDirty(im1->mode, xsize, ysize); call 0 returned 100% -: 81:} -: 82: -: 83:Imaging function ImagingChopLighter called 3 returned 100% blocks executed 100% 3: 84:ImagingChopLighter(Imaging imIn1, Imaging imIn2) -: 85:{ 3: 86: CHOP((in1[x] > in2[x]) ? in1[x] : in2[x]); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 30% (fallthrough) branch 4 taken 70% branch 5 taken 30% (fallthrough) branch 6 taken 70% branch 7 taken 34% (fallthrough) branch 8 taken 66% branch 9 taken 99% branch 10 taken 1% (fallthrough) branch 11 taken 99% branch 12 taken 1% (fallthrough) -: 87:} -: 88: -: 89:Imaging function ImagingChopDarker called 3 returned 100% blocks executed 100% 3: 90:ImagingChopDarker(Imaging imIn1, Imaging imIn2) -: 91:{ 3: 92: CHOP((in1[x] < in2[x]) ? in1[x] : in2[x]); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 1% (fallthrough) branch 4 taken 99% branch 5 taken 60% (fallthrough) branch 6 taken 40% branch 7 taken 55% (fallthrough) branch 8 taken 45% branch 9 taken 99% branch 10 taken 1% (fallthrough) branch 11 taken 99% branch 12 taken 1% (fallthrough) -: 93:} -: 94: -: 95:Imaging function ImagingChopDifference called 3 returned 100% blocks executed 100% 3: 96:ImagingChopDifference(Imaging imIn1, Imaging imIn2) -: 97:{ 3: 98: CHOP(abs((int) in1[x] - (int) in2[x])); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 69% (fallthrough) branch 4 taken 31% branch 5 taken 2% (fallthrough) branch 6 taken 98% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 99:} -: 100: -: 101:Imaging function ImagingChopMultiply called 4 returned 100% blocks executed 100% 4: 102:ImagingChopMultiply(Imaging imIn1, Imaging imIn2) -: 103:{ 4: 104: CHOP((int) in1[x] * (int) in2[x] / 255); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 44% (fallthrough) branch 4 taken 56% branch 5 taken 41% (fallthrough) branch 6 taken 59% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 105:} -: 106: -: 107:Imaging function ImagingChopScreen called 2 returned 100% blocks executed 100% 2: 108:ImagingChopScreen(Imaging imIn1, Imaging imIn2) -: 109:{ 2: 110: CHOP(255 - ((int) (255 - in1[x]) * (int) (255 - in2[x])) / 255); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 45% (fallthrough) branch 4 taken 55% branch 5 taken 42% (fallthrough) branch 6 taken 58% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 111:} -: 112: -: 113:Imaging function ImagingChopAdd called 6 returned 100% blocks executed 100% 6: 114:ImagingChopAdd(Imaging imIn1, Imaging imIn2, float scale, int offset) -: 115:{ 6: 116: CHOP(((int) in1[x] + (int) in2[x]) / scale + offset); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 13% (fallthrough) branch 4 taken 87% branch 5 taken 39% (fallthrough) branch 6 taken 61% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 117:} -: 118: -: 119:Imaging function ImagingChopSubtract called 6 returned 100% blocks executed 100% 6: 120:ImagingChopSubtract(Imaging imIn1, Imaging imIn2, float scale, int offset) -: 121:{ 6: 122: CHOP(((int) in1[x] - (int) in2[x]) / scale + offset); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 1% (fallthrough) branch 6 taken 99% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 123:} -: 124: -: 125:Imaging function ImagingChopAnd called 12 returned 100% blocks executed 100% 12: 126:ImagingChopAnd(Imaging imIn1, Imaging imIn2) -: 127:{ 12: 128: CHOP2((in1[x] && in2[x]) ? 255 : 0, "1"); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 50% (fallthrough) branch 6 taken 50% branch 7 taken 50% branch 8 taken 50% (fallthrough) branch 9 taken 50% branch 10 taken 50% (fallthrough) -: 129:} -: 130: -: 131:Imaging function ImagingChopOr called 12 returned 100% blocks executed 100% 12: 132:ImagingChopOr(Imaging imIn1, Imaging imIn2) -: 133:{ 12: 134: CHOP2((in1[x] || in2[x]) ? 255 : 0, "1"); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 50% (fallthrough) branch 6 taken 50% branch 7 taken 50% branch 8 taken 50% (fallthrough) branch 9 taken 50% branch 10 taken 50% (fallthrough) -: 135:} -: 136: -: 137:Imaging function ImagingChopXor called 12 returned 100% blocks executed 100% 12: 138:ImagingChopXor(Imaging imIn1, Imaging imIn2) -: 139:{ 12: 140: CHOP2(((in1[x] != 0) ^ (in2[x] != 0)) ? 255 : 0, "1"); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 50% branch 6 taken 50% (fallthrough) branch 7 taken 50% branch 8 taken 50% (fallthrough) -: 141:} -: 142: -: 143:Imaging function ImagingChopAddModulo called 3 returned 100% blocks executed 100% 3: 144:ImagingChopAddModulo(Imaging imIn1, Imaging imIn2) -: 145:{ 3: 146: CHOP2(in1[x] + in2[x], NULL); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 99% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 1% (fallthrough) -: 147:} -: 148: -: 149:Imaging function ImagingChopSubtractModulo called 74 returned 100% blocks executed 100% 74: 150:ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2) -: 151:{ 74: 152: CHOP2(in1[x] - in2[x], NULL); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 99% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 1% (fallthrough) -: 153:} -: 154: -: 155:Imaging function ImagingChopSoftLight called 2 returned 100% blocks executed 100% 2: 156:ImagingChopSoftLight(Imaging imIn1, Imaging imIn2) -: 157:{ 2: 158: CHOP2( (((255-in1[x]) * (in1[x]*in2[x]) ) / 65536) + call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 99% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 1% (fallthrough) -: 159: (in1[x] * ( 255 - ( (255 - in1[x]) * (255 - in2[x] ) / 255) )) / 255 -: 160: , NULL ); -: 161:} -: 162: -: 163:Imaging function ImagingChopHardLight called 2 returned 100% blocks executed 100% 2: 164:ImagingChopHardLight(Imaging imIn1, Imaging imIn2) -: 165:{ 2: 166: CHOP2( (in2[x]<128) ? ( (in1[x]*in2[x])/127) call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 53% (fallthrough) branch 4 taken 47% branch 5 taken 99% branch 6 taken 1% (fallthrough) branch 7 taken 99% branch 8 taken 1% (fallthrough) -: 167: : 255 - ( ((255-in2[x]) * (255-in1[x])) / 127) -: 168: , NULL); -: 169:} -: 170: -: 171:Imaging function ImagingOverlay called 2 returned 100% blocks executed 100% 2: 172:ImagingOverlay(Imaging imIn1, Imaging imIn2) -: 173:{ 2: 174: CHOP2( (in1[x]<128) ? ( (in1[x]*in2[x])/127) call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 55% (fallthrough) branch 4 taken 45% branch 5 taken 99% branch 6 taken 1% (fallthrough) branch 7 taken 99% branch 8 taken 1% (fallthrough) -: 175: : 255 - ( ((255-in1[x]) * (255-in2[x])) / 127) -: 176: , NULL); -: 177:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Offset.c.gcov -: 0:Source:src/libImaging/Offset.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Offset.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Offset.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * offset an image in x and y directions -: 6: * -: 7: * history: -: 8: * 96-07-22 fl: Created -: 9: * 98-11-01 cgw@pgt.com: Fixed negative-array index bug -: 10: * -: 11: * Copyright (c) Fredrik Lundh 1996. -: 12: * Copyright (c) Secret Labs AB 1997. -: 13: * -: 14: * See the README file for information on usage and redistribution. -: 15: */ -: 16: -: 17: -: 18:#include "Imaging.h" -: 19: -: 20: -: 21:Imaging function ImagingOffset called 5 returned 100% blocks executed 87% 5: 22:ImagingOffset(Imaging im, int xoffset, int yoffset) -: 23:{ -: 24: int x, y; -: 25: Imaging imOut; -: 26: 5: 27: if (!im) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 28: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 29: } -: 30: 5: 31: imOut = ImagingNewDirty(im->mode, im->xsize, im->ysize); call 0 returned 100% 5: 32: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 33: return NULL; -: 34: } -: 35: 5: 36: ImagingCopyPalette(imOut, im); call 0 returned 100% -: 37: -: 38: /* make offsets positive to avoid negative coordinates */ 5: 39: xoffset %= im->xsize; 5: 40: xoffset = im->xsize - xoffset; 5: 41: if (xoffset < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 42: xoffset += im->xsize; -: 43: } -: 44: 5: 45: yoffset %= im->ysize; 5: 46: yoffset = im->ysize - yoffset; 5: 47: if (yoffset < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 48: yoffset += im->ysize; -: 49: } -: 50: -: 51:#define OFFSET(image)\ -: 52: for (y = 0; y < im->ysize; y++) {\ -: 53: for (x = 0; x < im->xsize; x++) {\ -: 54: int yi = (y + yoffset) % im->ysize;\ -: 55: int xi = (x + xoffset) % im->xsize;\ -: 56: imOut->image[y][x] = im->image[yi][xi];\ -: 57: }\ -: 58: } -: 59: 5: 60: if (im->image8) { branch 0 taken 60% (fallthrough) branch 1 taken 40% 32768: 61: OFFSET(image8) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% (fallthrough) branch 3 taken 1% -: 62: } else { 30000: 63: OFFSET(image32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% (fallthrough) branch 3 taken 1% -: 64: } -: 65: -: 66: return imOut; -: 67:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#EpsEncode.c.gcov -: 0:Source:src/libImaging/EpsEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/EpsEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/EpsEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * encoder for EPS hex data -: 6: * -: 7: * history: -: 8: * 96-04-19 fl created -: 9: * 96-06-27 fl don't drop last block of encoded data -: 10: * -: 11: * notes: -: 12: * FIXME: rename to HexEncode.c ?? -: 13: * -: 14: * Copyright (c) Fredrik Lundh 1996. -: 15: * Copyright (c) Secret Labs AB 1997. -: 16: * -: 17: * See the README file for information on usage and redistribution. -: 18: */ -: 19: -: 20: -: 21:#include "Imaging.h" -: 22: -: 23: -: 24:int function ImagingEpsEncode called 81 returned 100% blocks executed 100% 81: 25:ImagingEpsEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 26:{ -: 27: enum { HEXBYTE=1, NEWLINE }; 81: 28: const char *hex = "0123456789abcdef"; -: 29: 81: 30: UINT8* ptr = buf; -: 31: UINT8* in, i; -: 32: 81: 33: if (!state->state) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 20: 34: state->state = HEXBYTE; 20: 35: state->xsize *= im->pixelsize; /* Hack! */ -: 36: } -: 37: 81: 38: in = (UINT8*) im->image[state->y]; -: 39: -: 40: for (;;) { -: 41: 2206269: 42: if (state->state == NEWLINE) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 56563: 43: if (bytes < 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 44: break; -: 45: } 56563: 46: *ptr++ = '\n'; 56563: 47: bytes--; 56563: 48: state->state = HEXBYTE; -: 49: } -: 50: 2206269: 51: if (bytes < 2) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 52: break; -: 53: } -: 54: 2206208: 55: i = in[state->x++]; 2206208: 56: *ptr++ = hex[(i>>4)&15]; 2206208: 57: *ptr++ = hex[i&15]; 2206208: 58: bytes -= 2; -: 59: -: 60: /* Skip junk bytes */ 2206208: 61: if (im->bands == 3 && (state->x & 3) == 3) { branch 0 taken 46% (fallthrough) branch 1 taken 54% branch 2 taken 33% (fallthrough) branch 3 taken 67% 340224: 62: state->x++; -: 63: } -: 64: 2206208: 65: if (++state->count >= 79/2) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 56563: 66: state->state = NEWLINE; 56563: 67: state->count = 0; -: 68: } -: 69: 2206208: 70: if (state->x >= state->xsize) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3544: 71: state->x = 0; 3544: 72: if (++state->y >= state->ysize) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 20: 73: state->errcode = IMAGING_CODEC_END; 20: 74: break; -: 75: } 3524: 76: in = (UINT8*) im->image[state->y]; -: 77: } -: 78: -: 79: } -: 80: 81: 81: return ptr - buf; -: 82: -: 83:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#path.c.gcov -: 0:Source:src/path.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/path.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/path.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * -: 4: * 2D path utilities -: 5: * -: 6: * history: -: 7: * 1996-11-04 fl Added to PIL (incomplete) -: 8: * 1996-11-05 fl Added sequence semantics -: 9: * 1997-02-28 fl Fixed getbbox -: 10: * 1997-06-12 fl Added id attribute -: 11: * 1997-06-14 fl Added slicing and setitem -: 12: * 1998-12-29 fl Improved sequence handling (from Richard Jones) -: 13: * 1999-01-10 fl Fixed IndexError test for 1.5 (from Fred Drake) -: 14: * 2000-10-12 fl Added special cases for tuples and lists -: 15: * 2002-10-27 fl Added clipping boilerplate -: 16: * 2004-09-19 fl Added tolist(flat) variant -: 17: * 2005-05-06 fl Added buffer interface support to path constructor -: 18: * -: 19: * notes: -: 20: * FIXME: fill in remaining slots in the sequence api -: 21: * -: 22: * Copyright (c) 1997-2005 by Secret Labs AB -: 23: * Copyright (c) 1997-2005 by Fredrik Lundh -: 24: * -: 25: * See the README file for information on usage and redistribution. -: 26: */ -: 27: -: 28: -: 29:#include "Python.h" -: 30:#include "libImaging/Imaging.h" -: 31: -: 32:#include -: 33: -: 34:/* compatibility wrappers (defined in _imaging.c) */ -: 35:extern int PyImaging_CheckBuffer(PyObject* buffer); -: 36:extern int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view); -: 37: -: 38:/* -------------------------------------------------------------------- */ -: 39:/* Class */ -: 40:/* -------------------------------------------------------------------- */ -: 41: -: 42:typedef struct { -: 43: PyObject_HEAD -: 44: Py_ssize_t count; -: 45: double *xy; -: 46: int index; /* temporary use, e.g. in decimate */ -: 47:} PyPathObject; -: 48: -: 49:static PyTypeObject PyPathType; -: 50: -: 51:static double* function alloc_array called 2934 returned 100% blocks executed 67% 2934: 52:alloc_array(Py_ssize_t count) -: 53:{ -: 54: double* xy; 2934: 55: if (count < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 56: PyErr_NoMemory(); call 0 never executed #####: 57: return NULL; -: 58: } 2934: 59: if ((unsigned long long)count > (SIZE_MAX / (2 * sizeof(double))) - 1 ) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 60: PyErr_NoMemory(); call 0 returned 100% 1: 61: return NULL; -: 62: } 2933: 63: xy = malloc(2 * count * sizeof(double) + 1); 2933: 64: if (!xy) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 65: PyErr_NoMemory(); call 0 never executed -: 66: } -: 67: return xy; -: 68:} -: 69: -: 70:static PyPathObject* function path_new called 11 returned 100% blocks executed 83% 11: 71:path_new(Py_ssize_t count, double* xy, int duplicate) -: 72:{ -: 73: PyPathObject *path; -: 74: 11: 75: if (duplicate) { branch 0 taken 9% (fallthrough) branch 1 taken 91% -: 76: /* duplicate path */ 1: 77: double* p = alloc_array(count); call 0 returned 100% 1: 78: if (!p) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 79: return NULL; -: 80: } 2: 81: memcpy(p, xy, count * 2 * sizeof(double)); 1: 82: xy = p; -: 83: } -: 84: 11: 85: if (PyType_Ready(&PyPathType) < 0) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 86: free(xy); #####: 87: return NULL; -: 88: } -: 89: 11: 90: path = PyObject_New(PyPathObject, &PyPathType); call 0 returned 100% 11: 91: if (path == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 92: free(xy); #####: 93: return NULL; -: 94: } -: 95: 11: 96: path->count = count; 11: 97: path->xy = xy; -: 98: 11: 99: return path; -: 100:} -: 101: -: 102:static void function path_dealloc called 11 returned 100% blocks executed 100% 11: 103:path_dealloc(PyPathObject* path) -: 104:{ 11: 105: free(path->xy); 11: 106: PyObject_Del(path); call 0 returned 100% 11: 107:} -: 108: -: 109:/* -------------------------------------------------------------------- */ -: 110:/* Helpers */ -: 111:/* -------------------------------------------------------------------- */ -: 112: -: 113:#define PyPath_Check(op) (Py_TYPE(op) == &PyPathType) -: 114: -: 115:Py_ssize_t function PyPath_Flatten called 2932 returned 100% blocks executed 57% 2932: 116:PyPath_Flatten(PyObject* data, double **pxy) -: 117:{ -: 118: Py_ssize_t i, j, n; -: 119: double *xy; -: 120: 2932: 121: if (PyPath_Check(data)) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 122: /* This was another path object. */ 1: 123: PyPathObject *path = (PyPathObject*) data; 1: 124: xy = alloc_array(path->count); call 0 returned 100% 1: 125: if (!xy) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 126: return -1; -: 127: } 2: 128: memcpy(xy, path->xy, 2 * path->count * sizeof(double)); 1: 129: *pxy = xy; 1: 130: return path->count; -: 131: } -: 132: 2931: 133: if (PyImaging_CheckBuffer(data)) { call 0 returned 100% branch 1 taken 1% (fallthrough) branch 2 taken 99% -: 134: /* Assume the buffer contains floats */ -: 135: Py_buffer buffer; 2: 136: if (PyImaging_GetBuffer(data, &buffer) == 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 2: 137: float *ptr = (float*) buffer.buf; 2: 138: n = buffer.len / (2 * sizeof(float)); 2: 139: xy = alloc_array(n); call 0 returned 100% 2: 140: if (!xy) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 2: 141: return -1; -: 142: } 4: 143: for (i = 0; i < n+n; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 4: 144: xy[i] = ptr[i]; -: 145: } 2: 146: *pxy = xy; 2: 147: PyBuffer_Release(&buffer); call 0 returned 100% 2: 148: return n; -: 149: } #####: 150: PyErr_Clear(); call 0 never executed -: 151: } -: 152: 2929: 153: if (!PySequence_Check(data)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 154: PyErr_SetString(PyExc_TypeError, "argument must be sequence"); call 0 never executed #####: 155: return -1; -: 156: } -: 157: 2929: 158: j = 0; 2929: 159: n = PyObject_Length(data); call 0 returned 100% -: 160: /* Just in case __len__ breaks (or doesn't exist) */ 2929: 161: if (PyErr_Occurred()) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 162: return -1; -: 163: } -: 164: -: 165: /* Allocate for worst case */ 2929: 166: xy = alloc_array(n); call 0 returned 100% 2929: 167: if (!xy) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 168: return -1; -: 169: } -: 170: -: 171: /* Copy table to path array */ 2929: 172: if (PyList_Check(data)) { branch 0 taken 78% (fallthrough) branch 1 taken 22% 9014: 173: for (i = 0; i < n; i++) { branch 0 taken 80% branch 1 taken 20% -: 174: double x, y; 9014: 175: PyObject *op = PyList_GET_ITEM(data, i); 9014: 176: if (PyFloat_Check(op)) { branch 0 taken 99% (fallthrough) branch 1 taken 1% call 2 returned 100% branch 3 taken 0% (fallthrough) branch 4 taken 100% 4: 177: xy[j++] = PyFloat_AS_DOUBLE(op); 9010: 178: } else if (PyLong_Check(op)) { branch 0 taken 95% (fallthrough) branch 1 taken 5% 8558: 179: xy[j++] = (float) PyLong_AS_LONG(op); call 0 returned 100% 452: 180: } else if (PyNumber_Check(op)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 181: xy[j++] = PyFloat_AsDouble(op); call 0 never executed 452: 182: } else if (PyArg_ParseTuple(op, "dd", &x, &y)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 452: 183: xy[j++] = x; 452: 184: xy[j++] = y; -: 185: } else { #####: 186: free(xy); #####: 187: return -1; -: 188: } -: 189: } 643: 190: } else if (PyTuple_Check(data)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% 1582: 191: for (i = 0; i < n; i++) { branch 0 taken 71% branch 1 taken 29% -: 192: double x, y; 1582: 193: PyObject *op = PyTuple_GET_ITEM(data, i); 1582: 194: if (PyFloat_Check(op)) { branch 0 taken 87% (fallthrough) branch 1 taken 13% call 2 returned 100% branch 3 taken 0% (fallthrough) branch 4 taken 100% 200: 195: xy[j++] = PyFloat_AS_DOUBLE(op); 1382: 196: } else if (PyLong_Check(op)) { branch 0 taken 77% (fallthrough) branch 1 taken 23% 1070: 197: xy[j++] = (float) PyLong_AS_LONG(op); call 0 returned 100% 312: 198: } else if (PyNumber_Check(op)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 199: xy[j++] = PyFloat_AsDouble(op); call 0 never executed 312: 200: } else if (PyArg_ParseTuple(op, "dd", &x, &y)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 312: 201: xy[j++] = x; 312: 202: xy[j++] = y; -: 203: } else { #####: 204: free(xy); #####: 205: return -1; -: 206: } -: 207: } -: 208: } else { #####: 209: for (i = 0; i < n; i++) { branch 0 never executed branch 1 never executed -: 210: double x, y; #####: 211: PyObject *op = PySequence_GetItem(data, i); call 0 never executed #####: 212: if (!op) { branch 0 never executed branch 1 never executed -: 213: /* treat IndexError as end of sequence */ #####: 214: if (PyErr_Occurred() && call 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed #####: 215: PyErr_ExceptionMatches(PyExc_IndexError)) { call 0 never executed #####: 216: PyErr_Clear(); call 0 never executed #####: 217: break; -: 218: } else { #####: 219: free(xy); #####: 220: return -1; -: 221: } -: 222: } #####: 223: if (PyFloat_Check(op)) { branch 0 never executed branch 1 never executed call 2 never executed branch 3 never executed branch 4 never executed #####: 224: xy[j++] = PyFloat_AS_DOUBLE(op); #####: 225: } else if (PyLong_Check(op)) { branch 0 never executed branch 1 never executed #####: 226: xy[j++] = (float) PyLong_AS_LONG(op); call 0 never executed #####: 227: } else if (PyNumber_Check(op)) { call 0 never executed branch 1 never executed branch 2 never executed #####: 228: xy[j++] = PyFloat_AsDouble(op); call 0 never executed #####: 229: } else if (PyArg_ParseTuple(op, "dd", &x, &y)) { call 0 never executed branch 1 never executed branch 2 never executed #####: 230: xy[j++] = x; #####: 231: xy[j++] = y; -: 232: } else { #####: 233: Py_DECREF(op); branch 0 never executed branch 1 never executed call 2 never executed #####: 234: free(xy); #####: 235: return -1; -: 236: } #####: 237: Py_DECREF(op); branch 0 never executed branch 1 never executed call 2 never executed -: 238: } -: 239: } -: 240: 2929: 241: if (j & 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 242: PyErr_SetString(PyExc_ValueError, "wrong number of coordinates"); call 0 never executed #####: 243: free(xy); #####: 244: return -1; -: 245: } -: 246: 2929: 247: *pxy = xy; 2929: 248: return j/2; -: 249:} -: 250: -: 251: -: 252:/* -------------------------------------------------------------------- */ -: 253:/* Factories */ -: 254:/* -------------------------------------------------------------------- */ -: 255: -: 256:PyObject* function PyPath_Create called 11 returned 100% blocks executed 100% 11: 257:PyPath_Create(PyObject* self, PyObject* args) -: 258:{ -: 259: PyObject* data; -: 260: Py_ssize_t count; -: 261: double *xy; -: 262: 11: 263: if (PyArg_ParseTuple(args, "n:Path", &count)) { call 0 returned 100% branch 1 taken 9% (fallthrough) branch 2 taken 91% -: 264: -: 265: /* number of vertices */ 1: 266: xy = alloc_array(count); call 0 returned 100% 1: 267: if (!xy) { branch 0 taken 0% branch 1 taken 100% -: 268: return NULL; -: 269: } -: 270: -: 271: } else { -: 272: -: 273: /* sequence or other path */ 10: 274: PyErr_Clear(); call 0 returned 100% 10: 275: if (!PyArg_ParseTuple(args, "O", &data)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 276: return NULL; -: 277: } -: 278: 10: 279: count = PyPath_Flatten(data, &xy); call 0 returned 100% 10: 280: if (count < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 281: return NULL; -: 282: } -: 283: } -: 284: 10: 285: return (PyObject*) path_new(count, xy, 0); call 0 returned 100% -: 286:} -: 287: -: 288: -: 289:/* -------------------------------------------------------------------- */ -: 290:/* Methods */ -: 291:/* -------------------------------------------------------------------- */ -: 292: -: 293:static PyObject* function path_compact called 1 returned 100% blocks executed 100% 1: 294:path_compact(PyPathObject* self, PyObject* args) -: 295:{ -: 296: /* Simple-minded method to shorten path. A point is removed if -: 297: the city block distance to the previous point is less than the -: 298: given distance */ -: 299: Py_ssize_t i, j; -: 300: double *xy; -: 301: 1: 302: double cityblock = 2.0; -: 303: 1: 304: if (!PyArg_ParseTuple(args, "|d:compact", &cityblock)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 305: return NULL; -: 306: } -: 307: 1: 308: xy = self->xy; -: 309: -: 310: /* remove bogus vertices */ 5: 311: for (i = j = 1; i < self->count; i++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 4: 312: if (fabs(xy[j+j-2]-xy[i+i]) + fabs(xy[j+j-1]-xy[i+i+1]) >= cityblock) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 2: 313: xy[j+j] = xy[i+i]; 2: 314: xy[j+j+1] = xy[i+i+1]; 2: 315: j++; -: 316: } -: 317: } -: 318: 1: 319: i = self->count - j; 1: 320: self->count = j; -: 321: -: 322: /* shrink coordinate array */ -: 323: /* malloc check ok, self->count is smaller than it was before */ 1: 324: self->xy = realloc(self->xy, 2 * self->count * sizeof(double)); -: 325: 1: 326: return Py_BuildValue("i", i); /* number of removed vertices */ call 0 returned 100% -: 327:} -: 328: -: 329:static PyObject* function path_getbbox called 1 returned 100% blocks executed 87% 1: 330:path_getbbox(PyPathObject* self, PyObject* args) -: 331:{ -: 332: /* Find bounding box */ -: 333: Py_ssize_t i; -: 334: double *xy; -: 335: double x0, y0, x1, y1; -: 336: 1: 337: if (!PyArg_ParseTuple(args, ":getbbox")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 338: return NULL; -: 339: } -: 340: 1: 341: xy = self->xy; -: 342: 1: 343: x0 = x1 = xy[0]; 1: 344: y0 = y1 = xy[1]; -: 345: 5: 346: for (i = 1; i < self->count; i++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 4: 347: if (xy[i+i] < x0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 348: x0 = xy[i+i]; -: 349: } 4: 350: if (xy[i+i] > x1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 4: 351: x1 = xy[i+i]; -: 352: } 4: 353: if (xy[i+i+1] < y0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 354: y0 = xy[i+i+1]; -: 355: } 4: 356: if (xy[i+i+1] > y1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 4: 357: y1 = xy[i+i+1]; -: 358: } -: 359: } -: 360: 1: 361: return Py_BuildValue("dddd", x0, y0, x1, y1); call 0 returned 100% -: 362:} -: 363: -: 364:static PyObject* function path_getitem called 36 returned 100% blocks executed 100% 36: 365:path_getitem(PyPathObject* self, Py_ssize_t i) -: 366:{ 36: 367: if (i < 0) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 1: 368: i = self->count + i; -: 369: } 36: 370: if (i < 0 || i >= self->count) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 36% (fallthrough) branch 3 taken 64% 13: 371: PyErr_SetString(PyExc_IndexError, "path index out of range"); call 0 returned 100% 13: 372: return NULL; -: 373: } -: 374: 23: 375: return Py_BuildValue("dd", self->xy[i+i], self->xy[i+i+1]); call 0 returned 100% -: 376:} -: 377: -: 378:static PyObject* function path_getslice called 1 returned 100% blocks executed 70% 1: 379:path_getslice(PyPathObject* self, Py_ssize_t ilow, Py_ssize_t ihigh) -: 380:{ -: 381: /* adjust arguments */ 1: 382: if (ilow < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 383: ilow = 0; 1: 384: } else if (ilow >= self->count) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 385: ilow = self->count; -: 386: } 1: 387: if (ihigh < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 388: ihigh = 0; -: 389: } 1: 390: if (ihigh < ilow) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 391: ihigh = ilow; 1: 392: } else if (ihigh > self->count) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 393: ihigh = self->count; -: 394: } -: 395: 1: 396: return (PyObject*) path_new(ihigh - ilow, self->xy + ilow * 2, 1); call 0 returned 100% -: 397:} -: 398: -: 399:static Py_ssize_t function path_len called 14 returned 100% blocks executed 100% 14: 400:path_len(PyPathObject* self) -: 401:{ 14: 402: return self->count; -: 403:} -: 404: -: 405:static PyObject* function path_map called 0 returned 0% blocks executed 0% #####: 406:path_map(PyPathObject* self, PyObject* args) -: 407:{ -: 408: /* Map coordinate set through function */ -: 409: Py_ssize_t i; -: 410: double *xy; -: 411: PyObject* function; -: 412: #####: 413: if (!PyArg_ParseTuple(args, "O:map", &function)) { call 0 never executed branch 1 never executed branch 2 never executed -: 414: return NULL; -: 415: } -: 416: #####: 417: xy = self->xy; -: 418: -: 419: /* apply function to coordinate set */ #####: 420: for (i = 0; i < self->count; i++) { branch 0 never executed branch 1 never executed #####: 421: double x = xy[i+i]; #####: 422: double y = xy[i+i+1]; #####: 423: PyObject* item = PyObject_CallFunction(function, "dd", x, y); call 0 never executed #####: 424: if (!item || !PyArg_ParseTuple(item, "dd", &x, &y)) { branch 0 never executed branch 1 never executed call 2 never executed branch 3 never executed branch 4 never executed #####: 425: Py_XDECREF(item); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed call 4 never executed #####: 426: return NULL; -: 427: } #####: 428: xy[i+i] = x; #####: 429: xy[i+i+1] = y; #####: 430: Py_DECREF(item); branch 0 never executed branch 1 never executed call 2 never executed -: 431: } -: 432: #####: 433: Py_INCREF(Py_None); #####: 434: return Py_None; -: 435:} -: 436: -: 437:static int function path_setitem called 0 returned 0% blocks executed 0% #####: 438:path_setitem(PyPathObject* self, Py_ssize_t i, PyObject* op) -: 439:{ -: 440: double* xy; -: 441: #####: 442: if (i < 0 || i >= self->count) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 443: PyErr_SetString(PyExc_IndexError, call 0 never executed -: 444: "path assignment index out of range"); #####: 445: return -1; -: 446: } -: 447: #####: 448: if (op == NULL) { branch 0 never executed branch 1 never executed #####: 449: PyErr_SetString(PyExc_TypeError, call 0 never executed -: 450: "cannot delete from path"); #####: 451: return -1; -: 452: } -: 453: #####: 454: xy = &self->xy[i+i]; -: 455: #####: 456: if (!PyArg_ParseTuple(op, "dd", &xy[0], &xy[1])) { call 0 never executed branch 1 never executed branch 2 never executed -: 457: return -1; -: 458: } -: 459: #####: 460: return 0; -: 461:} -: 462: -: 463:static PyObject* function path_tolist called 4 returned 100% blocks executed 90% 4: 464:path_tolist(PyPathObject* self, PyObject* args) -: 465:{ -: 466: PyObject *list; -: 467: Py_ssize_t i; -: 468: 4: 469: int flat = 0; 4: 470: if (!PyArg_ParseTuple(args, "|i:tolist", &flat)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 471: return NULL; -: 472: } -: 473: 4: 474: if (flat) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 2: 475: list = PyList_New(self->count*2); 14: 476: for (i = 0; i < self->count*2; i++) { call 0 returned 100% branch 1 taken 86% branch 2 taken 14% -: 477: PyObject* item; 12: 478: item = PyFloat_FromDouble(self->xy[i]); call 0 returned 100% 12: 479: if (!item) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 480: goto error; -: 481: } 12: 482: PyList_SetItem(list, i, item); call 0 returned 100% -: 483: } -: 484: } else { 2: 485: list = PyList_New(self->count); 8: 486: for (i = 0; i < self->count; i++) { call 0 returned 100% branch 1 taken 75% branch 2 taken 25% -: 487: PyObject* item; 6: 488: item = Py_BuildValue("dd", self->xy[i+i], self->xy[i+i+1]); call 0 returned 100% 6: 489: if (!item) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 490: goto error; -: 491: } 6: 492: PyList_SetItem(list, i, item); call 0 returned 100% -: 493: } -: 494: } -: 495: -: 496: return list; -: 497: -: 498:error: #####: 499: Py_DECREF(list); branch 0 never executed branch 1 never executed call 2 never executed -: 500: return NULL; -: 501:} -: 502: -: 503:static PyObject* function path_transform called 1 returned 100% blocks executed 63% 1: 504:path_transform(PyPathObject* self, PyObject* args) -: 505:{ -: 506: /* Apply affine transform to coordinate set */ -: 507: Py_ssize_t i; -: 508: double *xy; -: 509: double a, b, c, d, e, f; -: 510: 1: 511: double wrap = 0.0; -: 512: 1: 513: if (!PyArg_ParseTuple(args, "(dddddd)|d:transform", call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 514: &a, &b, &c, &d, &e, &f, -: 515: &wrap)) { -: 516: return NULL; -: 517: } -: 518: 1: 519: xy = self->xy; -: 520: -: 521: /* transform the coordinate set */ 1: 522: if (b == 0.0 && d == 0.0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 523: /* scaling */ 3: 524: for (i = 0; i < self->count; i++) { branch 0 taken 75% branch 1 taken 25% 3: 525: xy[i+i] = a*xy[i+i]+c; 3: 526: xy[i+i+1] = e*xy[i+i+1]+f; -: 527: } -: 528: } else { -: 529: /* affine transform */ #####: 530: for (i = 0; i < self->count; i++) { branch 0 never executed branch 1 never executed #####: 531: double x = xy[i+i]; #####: 532: double y = xy[i+i+1]; #####: 533: xy[i+i] = a*x+b*y+c; #####: 534: xy[i+i+1] = d*x+e*y+f; -: 535: } -: 536: } -: 537: -: 538: /* special treatment of geographical map data */ 1: 539: if (wrap != 0.0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 540: for (i = 0; i < self->count; i++) { branch 0 never executed branch 1 never executed #####: 541: xy[i+i] = fmod(xy[i+i], wrap); -: 542: } -: 543: } -: 544: 1: 545: Py_INCREF(Py_None); 1: 546: return Py_None; -: 547:} -: 548: -: 549:static struct PyMethodDef methods[] = { -: 550: {"getbbox", (PyCFunction)path_getbbox, 1}, -: 551: {"tolist", (PyCFunction)path_tolist, 1}, -: 552: {"compact", (PyCFunction)path_compact, 1}, -: 553: {"map", (PyCFunction)path_map, 1}, -: 554: {"transform", (PyCFunction)path_transform, 1}, -: 555: {NULL, NULL} /* sentinel */ -: 556:}; -: 557: -: 558:static PyObject* function path_getattr_id called 0 returned 0% blocks executed 0% #####: 559:path_getattr_id(PyPathObject* self, void* closure) -: 560:{ #####: 561: return Py_BuildValue("n", (Py_ssize_t) self->xy); call 0 never executed -: 562:} -: 563: -: 564:static struct PyGetSetDef getsetters[] = { -: 565: { "id", (getter) path_getattr_id }, -: 566: { NULL } -: 567:}; -: 568: -: 569:static PyObject* function path_subscript called 4 returned 100% blocks executed 83% 4: 570:path_subscript(PyPathObject* self, PyObject* item) { 4: 571: if (PyIndex_Check(item)) { branch 0 taken 75% (fallthrough) branch 1 taken 25% branch 2 taken 67% (fallthrough) branch 3 taken 33% -: 572: Py_ssize_t i; 2: 573: i = PyNumber_AsSsize_t(item, PyExc_IndexError); call 0 returned 100% 2: 574: if (i == -1 && PyErr_Occurred()) { branch 0 taken 50% (fallthrough) branch 1 taken 50% call 2 returned 100% branch 3 taken 100% (fallthrough) branch 4 taken 0% -: 575: return NULL; -: 576: } 2: 577: return path_getitem(self, i); call 0 returned 100% -: 578: } 2: 579: if (PySlice_Check(item)) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 1: 580: int len = 4; -: 581: Py_ssize_t start, stop, step, slicelength; -: 582: 1: 583: if (PySlice_GetIndicesEx(item, len, &start, &stop, &step, &slicelength) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% call 3 returned 100% branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 584: return NULL; -: 585: } -: 586: 1: 587: if (slicelength <= 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 588: double *xy = alloc_array(0); call 0 never executed #####: 589: return (PyObject*) path_new(0, xy, 0); call 0 never executed -: 590: } 1: 591: else if (step == 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 592: return path_getslice(self, start, stop); call 0 returned 100% -: 593: } -: 594: else { #####: 595: PyErr_SetString(PyExc_TypeError, "slice steps not supported"); call 0 never executed #####: 596: return NULL; -: 597: } -: 598: } -: 599: else { 1: 600: PyErr_Format(PyExc_TypeError, call 0 returned 100% -: 601: "Path indices must be integers, not %.200s", -: 602: Py_TYPE(item)->tp_name); 1: 603: return NULL; -: 604: } -: 605:} -: 606: -: 607:static PySequenceMethods path_as_sequence = { -: 608: (lenfunc)path_len, /*sq_length*/ -: 609: (binaryfunc)0, /*sq_concat*/ -: 610: (ssizeargfunc)0, /*sq_repeat*/ -: 611: (ssizeargfunc)path_getitem, /*sq_item*/ -: 612: (ssizessizeargfunc)path_getslice, /*sq_slice*/ -: 613: (ssizeobjargproc)path_setitem, /*sq_ass_item*/ -: 614: (ssizessizeobjargproc)0, /*sq_ass_slice*/ -: 615:}; -: 616: -: 617:static PyMappingMethods path_as_mapping = { -: 618: (lenfunc)path_len, -: 619: (binaryfunc)path_subscript, -: 620: NULL -: 621:}; -: 622: -: 623:static PyTypeObject PyPathType = { -: 624: PyVarObject_HEAD_INIT(NULL, 0) -: 625: "Path", /*tp_name*/ -: 626: sizeof(PyPathObject), /*tp_size*/ -: 627: 0, /*tp_itemsize*/ -: 628: /* methods */ -: 629: (destructor)path_dealloc, /*tp_dealloc*/ -: 630: 0, /*tp_print*/ -: 631: 0, /*tp_getattr*/ -: 632: 0, /*tp_setattr*/ -: 633: 0, /*tp_compare*/ -: 634: 0, /*tp_repr*/ -: 635: 0, /*tp_as_number */ -: 636: &path_as_sequence, /*tp_as_sequence */ -: 637: &path_as_mapping, /*tp_as_mapping */ -: 638: 0, /*tp_hash*/ -: 639: 0, /*tp_call*/ -: 640: 0, /*tp_str*/ -: 641: 0, /*tp_getattro*/ -: 642: 0, /*tp_setattro*/ -: 643: 0, /*tp_as_buffer*/ -: 644: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 645: 0, /*tp_doc*/ -: 646: 0, /*tp_traverse*/ -: 647: 0, /*tp_clear*/ -: 648: 0, /*tp_richcompare*/ -: 649: 0, /*tp_weaklistoffset*/ -: 650: 0, /*tp_iter*/ -: 651: 0, /*tp_iternext*/ -: 652: methods, /*tp_methods*/ -: 653: 0, /*tp_members*/ -: 654: getsetters, /*tp_getset*/ -: 655:}; -: 656: <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#RawEncode.c.gcov -: 0:Source:src/libImaging/RawEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/RawEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/RawEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * coder for raw data -: 6: * -: 7: * FIXME: This encoder will fail if the buffer is not large enough to -: 8: * hold one full line of data. There's a workaround for this problem -: 9: * in ImageFile.py, but it should be solved here instead. -: 10: * -: 11: * history: -: 12: * 96-04-30 fl created -: 13: * 97-01-03 fl fixed padding -: 14: * -: 15: * Copyright (c) Fredrik Lundh 1996-97. -: 16: * Copyright (c) Secret Labs AB 1997. -: 17: * -: 18: * See the README file for information on usage and redistribution. */ -: 19: -: 20: -: 21:#include "Imaging.h" -: 22: -: 23:int function ImagingRawEncode called 12656 returned 100% blocks executed 86% 12656: 24:ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 25:{ -: 26: UINT8* ptr; -: 27: 12656: 28: if (!state->state) { branch 0 taken 26% (fallthrough) branch 1 taken 74% -: 29: -: 30: /* The "count" field holds the stride, if specified. Fix -: 31: things up so "bytes" is the full size, and "count" the -: 32: packed size */ -: 33: 3234: 34: if (state->count > 0) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 57: 35: int bytes = state->count; -: 36: -: 37: /* stride must not be less than real size */ 57: 38: if (state->count < state->bytes) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 39: state->errcode = IMAGING_CODEC_CONFIG; #####: 40: return -1; -: 41: } 57: 42: state->count = state->bytes; 57: 43: state->bytes = bytes; -: 44: } else { 3177: 45: state->count = state->bytes; -: 46: } -: 47: -: 48: /* The "ystep" field specifies the orientation */ -: 49: 3234: 50: if (state->ystep < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 46: 51: state->y = state->ysize-1; 46: 52: state->ystep = -1; -: 53: } else { 3188: 54: state->ystep = 1; -: 55: } -: 56: 3234: 57: state->state = 1; -: 58: -: 59: } -: 60: 12656: 61: if (bytes < state->bytes) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 62: state->errcode = IMAGING_CODEC_CONFIG; #####: 63: return 0; -: 64: } -: 65: -: 66: ptr = buf; -: 67: 447494: 68: while (bytes >= state->bytes) { branch 0 taken 98% branch 1 taken 2% (fallthrough) -: 69: 876144: 70: state->shuffle(ptr, (UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 438072: 71: state->xoff * im->pixelsize, state->xsize); -: 72: 438072: 73: if (state->bytes > state->count) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 74: /* zero-pad the buffer, if necessary */ #####: 75: memset(ptr + state->count, 0, state->bytes - state->count); -: 76: } -: 77: 438072: 78: ptr += state->bytes; 438072: 79: bytes -= state->bytes; -: 80: 438072: 81: state->y += state->ystep; -: 82: 438072: 83: if (state->y < 0 || state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 3234: 84: state->errcode = IMAGING_CODEC_END; 3234: 85: break; -: 86: } -: 87: -: 88: } -: 89: 12656: 90: return ptr - buf; -: 91: -: 92:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Histo.c.gcov -: 0:Source:src/libImaging/Histo.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Histo.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Histo.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * histogram support -: 6: * -: 7: * history: -: 8: * 1995-06-15 fl Created. -: 9: * 1996-04-05 fl Fixed histogram for multiband images. -: 10: * 1997-02-23 fl Added mask support -: 11: * 1998-07-01 fl Added basic 32-bit float/integer support -: 12: * -: 13: * Copyright (c) 1997-2003 by Secret Labs AB. -: 14: * Copyright (c) 1995-2003 by Fredrik Lundh. -: 15: * -: 16: * See the README file for information on usage and redistribution. -: 17: */ -: 18: -: 19: -: 20:#include "Imaging.h" -: 21: -: 22: -: 23:/* HISTOGRAM */ -: 24:/* -------------------------------------------------------------------- -: 25: * Take a histogram of an image. Returns a histogram object containing -: 26: * 256 slots per band in the input image. -: 27: */ -: 28: -: 29:void function ImagingHistogramDelete called 1919 returned 100% blocks executed 100% 1919: 30:ImagingHistogramDelete(ImagingHistogram h) -: 31:{ 1919: 32: if (h->histogram) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1919: 33: free(h->histogram); -: 34: } 1919: 35: free(h); 1919: 36:} -: 37: -: 38:ImagingHistogram function ImagingHistogramNew called 1919 returned 100% blocks executed 100% 1919: 39:ImagingHistogramNew(Imaging im) -: 40:{ -: 41: ImagingHistogram h; -: 42: -: 43: /* Create histogram descriptor */ 1919: 44: h = calloc(1, sizeof(struct ImagingHistogramInstance)); 3838: 45: strncpy(h->mode, im->mode, IMAGING_MODE_LENGTH-1); 1919: 46: h->mode[IMAGING_MODE_LENGTH-1] = 0; -: 47: 1919: 48: h->bands = im->bands; 1919: 49: h->histogram = calloc(im->pixelsize, 256 * sizeof(long)); -: 50: 1919: 51: return h; -: 52:} -: 53: -: 54:ImagingHistogram function ImagingGetHistogram called 1919 returned 100% blocks executed 90% 1919: 55:ImagingGetHistogram(Imaging im, Imaging imMask, void* minmax) -: 56:{ -: 57: ImagingSectionCookie cookie; -: 58: int x, y, i; -: 59: ImagingHistogram h; -: 60: INT32 imin, imax; -: 61: FLOAT32 fmin, fmax, scale; -: 62: 1919: 63: if (!im) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 64: return ImagingError_ModeError(); call 0 never executed -: 65: } -: 66: 1919: 67: if (imMask) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 68: /* Validate mask */ 6: 69: if (im->xsize != imMask->xsize || im->ysize != imMask->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 70: return ImagingError_Mismatch(); call 0 never executed -: 71: } 6: 72: if (strcmp(imMask->mode, "1") != 0 && strcmp(imMask->mode, "L") != 0) { branch 0 taken 17% (fallthrough) branch 1 taken 83% branch 2 taken 83% (fallthrough) branch 3 taken 17% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 73: return ImagingError_ValueError("bad transparency mask"); call 0 never executed -: 74: } -: 75: } -: 76: 1919: 77: h = ImagingHistogramNew(im); call 0 returned 100% -: 78: 1919: 79: if (imMask) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 80: /* mask */ 6: 81: if (im->image8) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 3: 82: ImagingSectionEnter(&cookie); 151: 83: for (y = 0; y < im->ysize; y++) { call 0 returned 100% branch 1 taken 98% (fallthrough) branch 2 taken 2% 21504: 84: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 21504: 85: if (imMask->image8[y][x] != 0) { branch 0 taken 83% (fallthrough) branch 1 taken 17% 17932: 86: h->histogram[im->image8[y][x]]++; -: 87: } -: 88: } -: 89: } 3: 90: ImagingSectionLeave(&cookie); call 0 returned 100% -: 91: } else { /* yes, we need the braces. C isn't Python! */ 3: 92: if (im->type != IMAGING_TYPE_UINT8) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 93: ImagingHistogramDelete(h); call 0 never executed #####: 94: return ImagingError_ModeError(); call 0 never executed -: 95: } 3: 96: ImagingSectionEnter(&cookie); 1091: 97: for (y = 0; y < im->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 1088: 98: UINT8* in = (UINT8*) im->image32[y]; 631872: 99: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 630784: 100: if (imMask->image8[y][x] != 0) { branch 0 taken 24% (fallthrough) branch 1 taken 76% 151264: 101: h->histogram[(*in++)]++; 151264: 102: h->histogram[(*in++)+256]++; 151264: 103: h->histogram[(*in++)+512]++; 151264: 104: h->histogram[(*in++)+768]++; -: 105: } else { 479520: 106: in += 4; -: 107: } -: 108: } -: 109: } 3: 110: ImagingSectionLeave(&cookie); call 0 returned 100% -: 111: } -: 112: } else { -: 113: /* mask not given; process pixels in image */ 1913: 114: if (im->image8) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 1885: 115: ImagingSectionEnter(&cookie); 343019: 116: for (y = 0; y < im->ysize; y++) { call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% 104229588: 117: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 104229588: 118: h->histogram[im->image8[y][x]]++; -: 119: } -: 120: } 1885: 121: ImagingSectionLeave(&cookie); call 0 returned 100% -: 122: } else { 28: 123: switch (im->type) { branch 0 taken 86% branch 1 taken 7% branch 2 taken 7% branch 3 taken 0% -: 124: case IMAGING_TYPE_UINT8: 24: 125: ImagingSectionEnter(&cookie); 3468: 126: for (y = 0; y < im->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 3444: 127: UINT8* in = (UINT8*) im->image[y]; 963188: 128: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 959744: 129: h->histogram[(*in++)]++; 959744: 130: h->histogram[(*in++)+256]++; 959744: 131: h->histogram[(*in++)+512]++; 959744: 132: h->histogram[(*in++)+768]++; -: 133: } -: 134: } 24: 135: ImagingSectionLeave(&cookie); call 0 returned 100% 24: 136: break; -: 137: case IMAGING_TYPE_INT32: 2: 138: if (!minmax) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 139: ImagingHistogramDelete(h); call 0 never executed #####: 140: return ImagingError_ValueError("min/max not given"); call 0 never executed -: 141: } 2: 142: if (!im->xsize || !im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 143: break; -: 144: } 2: 145: memcpy(&imin, minmax, sizeof(imin)); 2: 146: memcpy(&imax, ((char*)minmax) + sizeof(imin), sizeof(imax)); 2: 147: if (imin >= imax) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 148: break; -: 149: } 2: 150: ImagingSectionEnter(&cookie); call 0 returned 100% 2: 151: scale = 255.0F / (imax - imin); 258: 152: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 256: 153: INT32* in = im->image32[y]; 33024: 154: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 155: i = (int) (((*in++)-imin)*scale); 32768: 156: if (i >= 0 && i < 256) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 32768: 157: h->histogram[i]++; -: 158: } -: 159: } -: 160: } 2: 161: ImagingSectionLeave(&cookie); call 0 returned 100% 2: 162: break; -: 163: case IMAGING_TYPE_FLOAT32: 2: 164: if (!minmax) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 165: ImagingHistogramDelete(h); call 0 never executed #####: 166: return ImagingError_ValueError("min/max not given"); call 0 never executed -: 167: } 2: 168: if (!im->xsize || !im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 169: break; -: 170: } 2: 171: memcpy(&fmin, minmax, sizeof(fmin)); 2: 172: memcpy(&fmax, ((char*)minmax) + sizeof(fmin), sizeof(fmax)); 2: 173: if (fmin >= fmax) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 174: break; -: 175: } 2: 176: ImagingSectionEnter(&cookie); call 0 returned 100% 2: 177: scale = 255.0F / (fmax - fmin); 258: 178: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 256: 179: FLOAT32* in = (FLOAT32*) im->image32[y]; 33024: 180: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 181: i = (int) (((*in++)-fmin)*scale); 32768: 182: if (i >= 0 && i < 256) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 32768: 183: h->histogram[i]++; -: 184: } -: 185: } -: 186: } 2: 187: ImagingSectionLeave(&cookie); call 0 returned 100% 2: 188: break; -: 189: } -: 190: } -: 191: } -: 192: -: 193: return h; -: 194:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Blend.c.gcov -: 0:Source:src/libImaging/Blend.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Blend.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Blend.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * interpolate between two existing images -: 6: * -: 7: * history: -: 8: * 96-03-20 fl Created -: 9: * 96-05-18 fl Simplified blend expression -: 10: * 96-10-05 fl Fixed expression bug, special case for interpolation -: 11: * -: 12: * Copyright (c) Fredrik Lundh 1996. -: 13: * Copyright (c) Secret Labs AB 1997. -: 14: * -: 15: * See the README file for details on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21: -: 22:Imaging function ImagingBlend called 19 returned 100% blocks executed 64% 19: 23:ImagingBlend(Imaging imIn1, Imaging imIn2, float alpha) -: 24:{ -: 25: Imaging imOut; -: 26: int x, y; -: 27: -: 28: /* Check arguments */ 19: 29: if (!imIn1 || !imIn2 || imIn1->type != IMAGING_TYPE_UINT8 branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% 19: 30: || imIn1->palette || strcmp(imIn1->mode, "1") == 0 branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 taken 100% (fallthrough) branch 5 taken 0% 19: 31: || imIn2->palette || strcmp(imIn2->mode, "1") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 32: return ImagingError_ModeError(); call 0 never executed -: 33: } -: 34: 19: 35: if (imIn1->type != imIn2->type || branch 0 taken 100% (fallthrough) branch 1 taken 0% 19: 36: imIn1->bands != imIn2->bands || branch 0 taken 100% (fallthrough) branch 1 taken 0% 19: 37: imIn1->xsize != imIn2->xsize || branch 0 taken 0% (fallthrough) branch 1 taken 100% 19: 38: imIn1->ysize != imIn2->ysize) { #####: 39: return ImagingError_Mismatch(); call 0 never executed -: 40: } -: 41: -: 42: /* Shortcuts */ 19: 43: if (alpha == 0.0) { branch 0 taken 21% (fallthrough) branch 1 taken 79% 4: 44: return ImagingCopy(imIn1); call 0 returned 100% 15: 45: } else if (alpha == 1.0) { branch 0 taken 27% (fallthrough) branch 1 taken 73% 4: 46: return ImagingCopy(imIn2); call 0 returned 100% -: 47: } -: 48: 11: 49: imOut = ImagingNewDirty(imIn1->mode, imIn1->xsize, imIn1->ysize); call 0 returned 100% 11: 50: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 51: return NULL; -: 52: } -: 53: 11: 54: if (alpha >= 0 && alpha <= 1.0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 55: /* Interpolate between bands */ 1253: 56: for (y = 0; y < imIn1->ysize; y++) { branch 0 taken 99% branch 1 taken 1% 1253: 57: UINT8* in1 = (UINT8*) imIn1->image[y]; 1253: 58: UINT8* in2 = (UINT8*) imIn2->image[y]; 1253: 59: UINT8* out = (UINT8*) imOut->image[y]; 581929: 60: for (x = 0; x < imIn1->linesize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1161352: 61: out[x] = (UINT8) 580676: 62: ((int) in1[x] + alpha * ((int) in2[x] - (int) in1[x])); -: 63: } -: 64: } -: 65: } else { -: 66: /* Extrapolation; must make sure to clip resulting values */ #####: 67: for (y = 0; y < imIn1->ysize; y++) { branch 0 never executed branch 1 never executed #####: 68: UINT8* in1 = (UINT8*) imIn1->image[y]; #####: 69: UINT8* in2 = (UINT8*) imIn2->image[y]; #####: 70: UINT8* out = (UINT8*) imOut->image[y]; #####: 71: for (x = 0; x < imIn1->linesize; x++) { branch 0 never executed branch 1 never executed #####: 72: float temp = (float) #####: 73: ((int) in1[x] + alpha * ((int) in2[x] - (int) in1[x])); #####: 74: if (temp <= 0.0) { branch 0 never executed branch 1 never executed #####: 75: out[x] = 0; #####: 76: } else if (temp >= 255.0) { branch 0 never executed branch 1 never executed #####: 77: out[x] = 255; -: 78: } else { #####: 79: out[x] = (UINT8) temp; -: 80: } -: 81: } -: 82: } -: 83: } -: 84: -: 85: return imOut; -: 86:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Fill.c.gcov -: 0:Source:src/libImaging/Fill.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Fill.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Fill.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * fill image with constant pixel value -: 6: * -: 7: * history: -: 8: * 95-11-26 fl moved from Imaging.c -: 9: * 96-05-17 fl added radial fill, renamed wedge to linear -: 10: * 98-06-23 fl changed ImageFill signature -: 11: * -: 12: * Copyright (c) Secret Labs AB 1997-98. All rights reserved. -: 13: * Copyright (c) Fredrik Lundh 1995-96. -: 14: * -: 15: * See the README file for information on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21:#include "math.h" -: 22: -: 23:Imaging function ImagingFill called 15960 returned 100% blocks executed 100% 15960: 24:ImagingFill(Imaging im, const void* colour) -: 25:{ -: 26: int x, y; -: 27: ImagingSectionCookie cookie; -: 28: 15960: 29: if (im->type == IMAGING_TYPE_SPECIAL) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 30: /* use generic API */ 67: 31: ImagingAccess access = ImagingAccessNew(im); call 0 returned 100% 67: 32: if (access) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 208: 33: for (y = 0; y < im->ysize; y++) { branch 0 taken 76% (fallthrough) branch 1 taken 24% 10752: 34: for (x = 0; x < im->xsize; x++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 10752: 35: access->put_pixel(im, x, y, colour); call 0 returned 100% -: 36: } -: 37: } -: 38: ImagingAccessDelete(im, access); -: 39: } else { -: 40: /* wipe the image */ 1: 41: for (y = 0; y < im->ysize; y++) { branch 0 taken 50% branch 1 taken 50% 2: 42: memset(im->image[y], 0, im->linesize); -: 43: } -: 44: } -: 45: } else { 15893: 46: INT32 c = 0L; 15893: 47: ImagingSectionEnter(&cookie); call 0 returned 100% 31786: 48: memcpy(&c, colour, im->pixelsize); 15893: 49: if (im->image32 && c != 0L) { branch 0 taken 8% (fallthrough) branch 1 taken 92% branch 2 taken 40% (fallthrough) branch 3 taken 60% 118857: 50: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 120196328: 51: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 120196328: 52: im->image32[y][x] = c; -: 53: } -: 54: } -: 55: } else { 15370: 56: unsigned char cc = (unsigned char) *(UINT8*) colour; 411627: 57: for (y = 0; y < im->ysize; y++) { branch 0 taken 96% branch 1 taken 4% (fallthrough) 792514: 58: memset(im->image[y], cc, im->linesize); -: 59: } -: 60: } 15893: 61: ImagingSectionLeave(&cookie); call 0 returned 100% -: 62: } -: 63: 15960: 64: return im; -: 65:} -: 66: -: 67:Imaging function ImagingFillLinearGradient called 12 returned 100% blocks executed 100% 12: 68:ImagingFillLinearGradient(const char *mode) -: 69:{ -: 70: Imaging im; -: 71: int y; -: 72: 12: 73: if (strlen(mode) != 1) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 1: 74: return (Imaging) ImagingError_ModeError(); call 0 returned 100% -: 75: } -: 76: 11: 77: im = ImagingNewDirty(mode, 256, 256); call 0 returned 100% 11: 78: if (!im) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 79: return NULL; -: 80: } -: 81: 2816: 82: for (y = 0; y < 256; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5632: 83: memset(im->image8[y], (unsigned char) y, 256); -: 84: } -: 85: -: 86: return im; -: 87:} -: 88: -: 89:Imaging function ImagingFillRadialGradient called 3 returned 100% blocks executed 100% 3: 90:ImagingFillRadialGradient(const char *mode) -: 91:{ -: 92: Imaging im; -: 93: int x, y; -: 94: int d; -: 95: 3: 96: if (strlen(mode) != 1) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 1: 97: return (Imaging) ImagingError_ModeError(); call 0 returned 100% -: 98: } -: 99: 2: 100: im = ImagingNewDirty(mode, 256, 256); call 0 returned 100% 2: 101: if (!im) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 102: return NULL; -: 103: } -: 104: 512: 105: for (y = 0; y < 256; y++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 131072: 106: for (x = 0; x < 256; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 131072: 107: d = (int) sqrt((double) ((x-128)*(x-128) + (y-128)*(y-128)) * 2.0); 131072: 108: if (d >= 255) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 10: 109: im->image8[y][x] = 255; -: 110: } else { 131062: 111: im->image8[y][x] = d; -: 112: } -: 113: } -: 114: } -: 115: -: 116: return im; -: 117:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#display.c.gcov -: 0:Source:src/display.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/display.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/display.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * -: 4: * display support (and other windows-related stuff) -: 5: * -: 6: * History: -: 7: * 1996-05-13 fl Windows DIB support -: 8: * 1996-05-21 fl Added palette stuff -: 9: * 1996-05-28 fl Added display_mode stuff -: 10: * 1997-09-21 fl Added draw primitive -: 11: * 2001-09-17 fl Added ImagingGrabScreen (from _grabscreen.c) -: 12: * 2002-05-12 fl Added ImagingListWindows -: 13: * 2002-11-19 fl Added clipboard support -: 14: * 2002-11-25 fl Added GetDC/ReleaseDC helpers -: 15: * 2003-05-21 fl Added create window support (including window callback) -: 16: * 2003-09-05 fl Added fromstring/tostring methods -: 17: * 2009-03-14 fl Added WMF support (from pilwmf) -: 18: * -: 19: * Copyright (c) 1997-2003 by Secret Labs AB. -: 20: * Copyright (c) 1996-1997 by Fredrik Lundh. -: 21: * -: 22: * See the README file for information on usage and redistribution. -: 23: */ -: 24: -: 25:#define PY_SSIZE_T_CLEAN -: 26:#include "Python.h" -: 27: -: 28:#include "libImaging/Imaging.h" -: 29: -: 30:/* -------------------------------------------------------------------- */ -: 31:/* Windows DIB support */ -: 32: -: 33:#ifdef _WIN32 -: 34: -: 35:#include "libImaging/ImDib.h" -: 36: -: 37:#if SIZEOF_VOID_P == 8 -: 38:#define F_HANDLE "K" -: 39:#else -: 40:#define F_HANDLE "k" -: 41:#endif -: 42: -: 43:typedef struct { -: 44: PyObject_HEAD -: 45: ImagingDIB dib; -: 46:} ImagingDisplayObject; -: 47: -: 48:static PyTypeObject ImagingDisplayType; -: 49: -: 50:static ImagingDisplayObject* -: 51:_new(const char* mode, int xsize, int ysize) -: 52:{ -: 53: ImagingDisplayObject *display; -: 54: -: 55: if (PyType_Ready(&ImagingDisplayType) < 0) { -: 56: return NULL; -: 57: } -: 58: -: 59: display = PyObject_New(ImagingDisplayObject, &ImagingDisplayType); -: 60: if (display == NULL) { -: 61: return NULL; -: 62: } -: 63: -: 64: display->dib = ImagingNewDIB(mode, xsize, ysize); -: 65: if (!display->dib) { -: 66: Py_DECREF(display); -: 67: return NULL; -: 68: } -: 69: -: 70: return display; -: 71:} -: 72: -: 73:static void -: 74:_delete(ImagingDisplayObject* display) -: 75:{ -: 76: if (display->dib) { -: 77: ImagingDeleteDIB(display->dib); -: 78: } -: 79: PyObject_Del(display); -: 80:} -: 81: -: 82:static PyObject* -: 83:_expose(ImagingDisplayObject* display, PyObject* args) -: 84:{ -: 85: HDC hdc; -: 86: if (!PyArg_ParseTuple(args, F_HANDLE, &hdc)) { -: 87: return NULL; -: 88: } -: 89: -: 90: ImagingExposeDIB(display->dib, hdc); -: 91: -: 92: Py_INCREF(Py_None); -: 93: return Py_None; -: 94:} -: 95: -: 96:static PyObject* -: 97:_draw(ImagingDisplayObject* display, PyObject* args) -: 98:{ -: 99: HDC hdc; -: 100: int dst[4]; -: 101: int src[4]; -: 102: if (!PyArg_ParseTuple(args, F_HANDLE "(iiii)(iiii)", &hdc, -: 103: dst+0, dst+1, dst+2, dst+3, -: 104: src+0, src+1, src+2, src+3)) { -: 105: return NULL; -: 106: } -: 107: -: 108: ImagingDrawDIB(display->dib, hdc, dst, src); -: 109: -: 110: Py_INCREF(Py_None); -: 111: return Py_None; -: 112:} -: 113: -: 114:extern Imaging PyImaging_AsImaging(PyObject *op); -: 115: -: 116:static PyObject* -: 117:_paste(ImagingDisplayObject* display, PyObject* args) -: 118:{ -: 119: Imaging im; -: 120: -: 121: PyObject* op; -: 122: int xy[4]; -: 123: xy[0] = xy[1] = xy[2] = xy[3] = 0; -: 124: if (!PyArg_ParseTuple(args, "O|(iiii)", &op, xy+0, xy+1, xy+2, xy+3)) { -: 125: return NULL; -: 126: } -: 127: im = PyImaging_AsImaging(op); -: 128: if (!im) { -: 129: return NULL; -: 130: } -: 131: -: 132: if (xy[2] <= xy[0]) { -: 133: xy[2] = xy[0] + im->xsize; -: 134: } -: 135: if (xy[3] <= xy[1]) { -: 136: xy[3] = xy[1] + im->ysize; -: 137: } -: 138: -: 139: ImagingPasteDIB(display->dib, im, xy); -: 140: -: 141: Py_INCREF(Py_None); -: 142: return Py_None; -: 143:} -: 144: -: 145:static PyObject* -: 146:_query_palette(ImagingDisplayObject* display, PyObject* args) -: 147:{ -: 148: HDC hdc; -: 149: int status; -: 150: -: 151: if (!PyArg_ParseTuple(args, F_HANDLE, &hdc)) { -: 152: return NULL; -: 153: } -: 154: -: 155: status = ImagingQueryPaletteDIB(display->dib, hdc); -: 156: -: 157: return Py_BuildValue("i", status); -: 158:} -: 159: -: 160:static PyObject* -: 161:_getdc(ImagingDisplayObject* display, PyObject* args) -: 162:{ -: 163: HWND window; -: 164: HDC dc; -: 165: -: 166: if (!PyArg_ParseTuple(args, F_HANDLE, &window)) { -: 167: return NULL; -: 168: } -: 169: -: 170: dc = GetDC(window); -: 171: if (!dc) { -: 172: PyErr_SetString(PyExc_OSError, "cannot create dc"); -: 173: return NULL; -: 174: } -: 175: -: 176: return Py_BuildValue(F_HANDLE, dc); -: 177:} -: 178: -: 179:static PyObject* -: 180:_releasedc(ImagingDisplayObject* display, PyObject* args) -: 181:{ -: 182: HWND window; -: 183: HDC dc; -: 184: -: 185: if (!PyArg_ParseTuple(args, F_HANDLE F_HANDLE, &window, &dc)) { -: 186: return NULL; -: 187: } -: 188: -: 189: ReleaseDC(window, dc); -: 190: -: 191: Py_INCREF(Py_None); -: 192: return Py_None; -: 193:} -: 194: -: 195:static PyObject* -: 196:_frombytes(ImagingDisplayObject* display, PyObject* args) -: 197:{ -: 198: char* ptr; -: 199: Py_ssize_t bytes; -: 200: -: 201: if (!PyArg_ParseTuple(args, "y#:frombytes", &ptr, &bytes)) { -: 202: return NULL; -: 203: } -: 204: -: 205: if (display->dib->ysize * display->dib->linesize != bytes) { -: 206: PyErr_SetString(PyExc_ValueError, "wrong size"); -: 207: return NULL; -: 208: } -: 209: -: 210: memcpy(display->dib->bits, ptr, bytes); -: 211: -: 212: Py_INCREF(Py_None); -: 213: return Py_None; -: 214:} -: 215: -: 216:static PyObject* -: 217:_tobytes(ImagingDisplayObject* display, PyObject* args) -: 218:{ -: 219: if (!PyArg_ParseTuple(args, ":tobytes")) { -: 220: return NULL; -: 221: } -: 222: -: 223: return PyBytes_FromStringAndSize( -: 224: display->dib->bits, display->dib->ysize * display->dib->linesize -: 225: ); -: 226:} -: 227: -: 228:static struct PyMethodDef methods[] = { -: 229: {"draw", (PyCFunction)_draw, 1}, -: 230: {"expose", (PyCFunction)_expose, 1}, -: 231: {"paste", (PyCFunction)_paste, 1}, -: 232: {"query_palette", (PyCFunction)_query_palette, 1}, -: 233: {"getdc", (PyCFunction)_getdc, 1}, -: 234: {"releasedc", (PyCFunction)_releasedc, 1}, -: 235: {"frombytes", (PyCFunction)_frombytes, 1}, -: 236: {"tobytes", (PyCFunction)_tobytes, 1}, -: 237: {NULL, NULL} /* sentinel */ -: 238:}; -: 239: -: 240:static PyObject* -: 241:_getattr_mode(ImagingDisplayObject* self, void* closure) -: 242:{ -: 243: return Py_BuildValue("s", self->dib->mode); -: 244:} -: 245: -: 246:static PyObject* -: 247:_getattr_size(ImagingDisplayObject* self, void* closure) -: 248:{ -: 249: return Py_BuildValue("ii", self->dib->xsize, self->dib->ysize); -: 250:} -: 251: -: 252:static struct PyGetSetDef getsetters[] = { -: 253: { "mode", (getter) _getattr_mode }, -: 254: { "size", (getter) _getattr_size }, -: 255: { NULL } -: 256:}; -: 257: -: 258:static PyTypeObject ImagingDisplayType = { -: 259: PyVarObject_HEAD_INIT(NULL, 0) -: 260: "ImagingDisplay", /*tp_name*/ -: 261: sizeof(ImagingDisplayObject),/*tp_size*/ -: 262: 0, /*tp_itemsize*/ -: 263: /* methods */ -: 264: (destructor)_delete, /*tp_dealloc*/ -: 265: 0, /*tp_print*/ -: 266: 0, /*tp_getattr*/ -: 267: 0, /*tp_setattr*/ -: 268: 0, /*tp_compare*/ -: 269: 0, /*tp_repr*/ -: 270: 0, /*tp_as_number */ -: 271: 0, /*tp_as_sequence */ -: 272: 0, /*tp_as_mapping */ -: 273: 0, /*tp_hash*/ -: 274: 0, /*tp_call*/ -: 275: 0, /*tp_str*/ -: 276: 0, /*tp_getattro*/ -: 277: 0, /*tp_setattro*/ -: 278: 0, /*tp_as_buffer*/ -: 279: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 280: 0, /*tp_doc*/ -: 281: 0, /*tp_traverse*/ -: 282: 0, /*tp_clear*/ -: 283: 0, /*tp_richcompare*/ -: 284: 0, /*tp_weaklistoffset*/ -: 285: 0, /*tp_iter*/ -: 286: 0, /*tp_iternext*/ -: 287: methods, /*tp_methods*/ -: 288: 0, /*tp_members*/ -: 289: getsetters, /*tp_getset*/ -: 290:}; -: 291: -: 292:PyObject* -: 293:PyImaging_DisplayWin32(PyObject* self, PyObject* args) -: 294:{ -: 295: ImagingDisplayObject* display; -: 296: char *mode; -: 297: int xsize, ysize; -: 298: -: 299: if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) { -: 300: return NULL; -: 301: } -: 302: -: 303: display = _new(mode, xsize, ysize); -: 304: if (display == NULL) { -: 305: return NULL; -: 306: } -: 307: -: 308: return (PyObject*) display; -: 309:} -: 310: -: 311:PyObject* -: 312:PyImaging_DisplayModeWin32(PyObject* self, PyObject* args) -: 313:{ -: 314: char *mode; -: 315: int size[2]; -: 316: -: 317: mode = ImagingGetModeDIB(size); -: 318: -: 319: return Py_BuildValue("s(ii)", mode, size[0], size[1]); -: 320:} -: 321: -: 322:/* -------------------------------------------------------------------- */ -: 323:/* Windows screen grabber */ -: 324: -: 325:typedef HANDLE(__stdcall* Func_SetThreadDpiAwarenessContext)(HANDLE); -: 326: -: 327:PyObject* -: 328:PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) -: 329:{ -: 330: int x = 0, y = 0, width, height; -: 331: int includeLayeredWindows = 0, all_screens = 0; -: 332: HBITMAP bitmap; -: 333: BITMAPCOREHEADER core; -: 334: HDC screen, screen_copy; -: 335: DWORD rop; -: 336: PyObject* buffer; -: 337: HANDLE dpiAwareness; -: 338: HMODULE user32; -: 339: Func_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContext_function; -: 340: -: 341: if (!PyArg_ParseTuple(args, "|ii", &includeLayeredWindows, &all_screens)) { -: 342: return NULL; -: 343: } -: 344: -: 345: /* step 1: create a memory DC large enough to hold the -: 346: entire screen */ -: 347: -: 348: screen = CreateDC("DISPLAY", NULL, NULL, NULL); -: 349: screen_copy = CreateCompatibleDC(screen); -: 350: -: 351: // added in Windows 10 (1607) -: 352: // loaded dynamically to avoid link errors -: 353: user32 = LoadLibraryA("User32.dll"); -: 354: SetThreadDpiAwarenessContext_function = -: 355: (Func_SetThreadDpiAwarenessContext) -: 356: GetProcAddress(user32, "SetThreadDpiAwarenessContext"); -: 357: if (SetThreadDpiAwarenessContext_function != NULL) { -: 358: // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) -: 359: dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE) -3); -: 360: } -: 361: -: 362: if (all_screens) { -: 363: x = GetSystemMetrics(SM_XVIRTUALSCREEN); -: 364: y = GetSystemMetrics(SM_YVIRTUALSCREEN); -: 365: width = GetSystemMetrics(SM_CXVIRTUALSCREEN); -: 366: height = GetSystemMetrics(SM_CYVIRTUALSCREEN); -: 367: } else { -: 368: width = GetDeviceCaps(screen, HORZRES); -: 369: height = GetDeviceCaps(screen, VERTRES); -: 370: } -: 371: -: 372: if (SetThreadDpiAwarenessContext_function != NULL) { -: 373: SetThreadDpiAwarenessContext_function(dpiAwareness); -: 374: } -: 375: -: 376: FreeLibrary(user32); -: 377: -: 378: bitmap = CreateCompatibleBitmap(screen, width, height); -: 379: if (!bitmap) { -: 380: goto error; -: 381: } -: 382: -: 383: if (!SelectObject(screen_copy, bitmap)) { -: 384: goto error; -: 385: } -: 386: -: 387: /* step 2: copy bits into memory DC bitmap */ -: 388: -: 389: rop = SRCCOPY; -: 390: if (includeLayeredWindows) { -: 391: rop |= CAPTUREBLT; -: 392: } -: 393: if (!BitBlt(screen_copy, 0, 0, width, height, screen, x, y, rop)) { -: 394: goto error; -: 395: } -: 396: -: 397: /* step 3: extract bits from bitmap */ -: 398: -: 399: buffer = PyBytes_FromStringAndSize(NULL, height * ((width*3 + 3) & -4)); -: 400: if (!buffer) { -: 401: return NULL; -: 402: } -: 403: -: 404: core.bcSize = sizeof(core); -: 405: core.bcWidth = width; -: 406: core.bcHeight = height; -: 407: core.bcPlanes = 1; -: 408: core.bcBitCount = 24; -: 409: if (!GetDIBits(screen_copy, bitmap, 0, height, PyBytes_AS_STRING(buffer), -: 410: (BITMAPINFO*) &core, DIB_RGB_COLORS)) { -: 411: goto error; -: 412: } -: 413: -: 414: DeleteObject(bitmap); -: 415: DeleteDC(screen_copy); -: 416: DeleteDC(screen); -: 417: -: 418: return Py_BuildValue("(ii)(ii)N", x, y, width, height, buffer); -: 419: -: 420:error: -: 421: PyErr_SetString(PyExc_OSError, "screen grab failed"); -: 422: -: 423: DeleteDC(screen_copy); -: 424: DeleteDC(screen); -: 425: -: 426: return NULL; -: 427:} -: 428: -: 429:static BOOL CALLBACK list_windows_callback(HWND hwnd, LPARAM lParam) -: 430:{ -: 431: PyObject* window_list = (PyObject*) lParam; -: 432: PyObject* item; -: 433: PyObject* title; -: 434: RECT inner, outer; -: 435: int title_size; -: 436: int status; -: 437: -: 438: /* get window title */ -: 439: title_size = GetWindowTextLength(hwnd); -: 440: if (title_size > 0) { -: 441: title = PyUnicode_FromStringAndSize(NULL, title_size); -: 442: if (title) { -: 443: GetWindowTextW(hwnd, PyUnicode_AS_UNICODE(title), title_size+1); -: 444: } -: 445: } else { -: 446: title = PyUnicode_FromString(""); -: 447: } -: 448: if (!title) { -: 449: return 0; -: 450: } -: 451: -: 452: /* get bounding boxes */ -: 453: GetClientRect(hwnd, &inner); -: 454: GetWindowRect(hwnd, &outer); -: 455: -: 456: item = Py_BuildValue( -: 457: F_HANDLE "N(iiii)(iiii)", hwnd, title, -: 458: inner.left, inner.top, inner.right, inner.bottom, -: 459: outer.left, outer.top, outer.right, outer.bottom -: 460: ); -: 461: if (!item) { -: 462: return 0; -: 463: } -: 464: -: 465: status = PyList_Append(window_list, item); -: 466: -: 467: Py_DECREF(item); -: 468: -: 469: if (status < 0) { -: 470: return 0; -: 471: } -: 472: -: 473: return 1; -: 474:} -: 475: -: 476:PyObject* -: 477:PyImaging_ListWindowsWin32(PyObject* self, PyObject* args) -: 478:{ -: 479: PyObject* window_list; -: 480: -: 481: window_list = PyList_New(0); -: 482: if (!window_list) { -: 483: return NULL; -: 484: } -: 485: -: 486: EnumWindows(list_windows_callback, (LPARAM) window_list); -: 487: -: 488: if (PyErr_Occurred()) { -: 489: Py_DECREF(window_list); -: 490: return NULL; -: 491: } -: 492: -: 493: return window_list; -: 494:} -: 495: -: 496:/* -------------------------------------------------------------------- */ -: 497:/* Windows clipboard grabber */ -: 498: -: 499:PyObject* -: 500:PyImaging_GrabClipboardWin32(PyObject* self, PyObject* args) -: 501:{ -: 502: int clip; -: 503: HANDLE handle = NULL; -: 504: int size; -: 505: void* data; -: 506: PyObject* result; -: 507: UINT format; -: 508: UINT formats[] = { CF_DIB, CF_DIBV5, CF_HDROP, RegisterClipboardFormatA("PNG"), 0 }; -: 509: LPCSTR format_names[] = { "DIB", "DIB", "file", "png", NULL }; -: 510: -: 511: if (!OpenClipboard(NULL)) { -: 512: PyErr_SetString(PyExc_OSError, "failed to open clipboard"); -: 513: return NULL; -: 514: } -: 515: -: 516: // find best format as set by clipboard owner -: 517: format = 0; -: 518: while (!handle && (format = EnumClipboardFormats(format))) { -: 519: for (UINT i = 0; formats[i] != 0; i++) { -: 520: if (format == formats[i]) { -: 521: handle = GetClipboardData(format); -: 522: format = i; -: 523: break; -: 524: } -: 525: } -: 526: } -: 527: -: 528: if (!handle) { -: 529: CloseClipboard(); -: 530: return Py_BuildValue("zO", NULL, Py_None); -: 531: } -: 532: -: 533: data = GlobalLock(handle); -: 534: size = GlobalSize(handle); -: 535: -: 536: result = PyBytes_FromStringAndSize(data, size); -: 537: -: 538: GlobalUnlock(handle); -: 539: CloseClipboard(); -: 540: -: 541: return Py_BuildValue("zN", format_names[format], result); -: 542:} -: 543: -: 544:/* -------------------------------------------------------------------- */ -: 545:/* Windows class */ -: 546: -: 547:#ifndef WM_MOUSEWHEEL -: 548:#define WM_MOUSEWHEEL 522 -: 549:#endif -: 550: -: 551:static int mainloop = 0; -: 552: -: 553:static void -: 554:callback_error(const char* handler) -: 555:{ -: 556: PyObject* sys_stderr; -: 557: -: 558: sys_stderr = PySys_GetObject("stderr"); -: 559: -: 560: if (sys_stderr) { -: 561: PyFile_WriteString("*** ImageWin: error in ", sys_stderr); -: 562: PyFile_WriteString((char*) handler, sys_stderr); -: 563: PyFile_WriteString(":\n", sys_stderr); -: 564: } -: 565: -: 566: PyErr_Print(); -: 567: PyErr_Clear(); -: 568:} -: 569: -: 570:static LRESULT CALLBACK -: 571:windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) -: 572:{ -: 573: PAINTSTRUCT ps; -: 574: PyObject* callback = NULL; -: 575: PyObject* result; -: 576: PyThreadState* threadstate; -: 577: PyThreadState* current_threadstate; -: 578: HDC dc; -: 579: RECT rect; -: 580: LRESULT status = 0; -: 581: -: 582: /* set up threadstate for messages that calls back into python */ -: 583: switch (message) { -: 584: case WM_CREATE: -: 585: mainloop++; -: 586: break; -: 587: case WM_DESTROY: -: 588: mainloop--; -: 589: /* fall through... */ -: 590: case WM_PAINT: -: 591: case WM_SIZE: -: 592: callback = (PyObject*) GetWindowLongPtr(wnd, 0); -: 593: if (callback) { -: 594: threadstate = (PyThreadState*) -: 595: GetWindowLongPtr(wnd, sizeof(PyObject*)); -: 596: current_threadstate = PyThreadState_Swap(NULL); -: 597: PyEval_RestoreThread(threadstate); -: 598: } else { -: 599: return DefWindowProc(wnd, message, wParam, lParam); -: 600: } -: 601: } -: 602: -: 603: /* process message */ -: 604: switch (message) { -: 605: -: 606: case WM_PAINT: -: 607: /* redraw (part of) window. this generates a WCK-style -: 608: damage/clear/repair cascade */ -: 609: BeginPaint(wnd, &ps); -: 610: dc = GetDC(wnd); -: 611: GetWindowRect(wnd, &rect); /* in screen coordinates */ -: 612: -: 613: result = PyObject_CallFunction( -: 614: callback, "siiii", "damage", -: 615: ps.rcPaint.left, ps.rcPaint.top, -: 616: ps.rcPaint.right, ps.rcPaint.bottom -: 617: ); -: 618: if (result) { -: 619: Py_DECREF(result); -: 620: } else { -: 621: callback_error("window damage callback"); -: 622: } -: 623: -: 624: result = PyObject_CallFunction( -: 625: callback, "s" F_HANDLE "iiii", "clear", dc, -: 626: 0, 0, rect.right-rect.left, rect.bottom-rect.top -: 627: ); -: 628: if (result) { -: 629: Py_DECREF(result); -: 630: } else { -: 631: callback_error("window clear callback"); -: 632: } -: 633: -: 634: result = PyObject_CallFunction( -: 635: callback, "s" F_HANDLE "iiii", "repair", dc, -: 636: 0, 0, rect.right-rect.left, rect.bottom-rect.top -: 637: ); -: 638: if (result) { -: 639: Py_DECREF(result); -: 640: } else { -: 641: callback_error("window repair callback"); -: 642: } -: 643: -: 644: ReleaseDC(wnd, dc); -: 645: EndPaint(wnd, &ps); -: 646: break; -: 647: -: 648: case WM_SIZE: -: 649: /* resize window */ -: 650: result = PyObject_CallFunction( -: 651: callback, "sii", "resize", LOWORD(lParam), HIWORD(lParam) -: 652: ); -: 653: if (result) { -: 654: InvalidateRect(wnd, NULL, 1); -: 655: Py_DECREF(result); -: 656: } else { -: 657: callback_error("window resize callback"); -: 658: } -: 659: break; -: 660: -: 661: case WM_DESTROY: -: 662: /* destroy window */ -: 663: result = PyObject_CallFunction(callback, "s", "destroy"); -: 664: if (result) { -: 665: Py_DECREF(result); -: 666: } else { -: 667: callback_error("window destroy callback"); -: 668: } -: 669: Py_DECREF(callback); -: 670: break; -: 671: -: 672: default: -: 673: status = DefWindowProc(wnd, message, wParam, lParam); -: 674: } -: 675: -: 676: if (callback) { -: 677: /* restore thread state */ -: 678: PyEval_SaveThread(); -: 679: PyThreadState_Swap(threadstate); -: 680: } -: 681: -: 682: return status; -: 683:} -: 684: -: 685:PyObject* -: 686:PyImaging_CreateWindowWin32(PyObject* self, PyObject* args) -: 687:{ -: 688: HWND wnd; -: 689: WNDCLASS windowClass; -: 690: -: 691: char* title; -: 692: PyObject* callback; -: 693: int width = 0, height = 0; -: 694: if (!PyArg_ParseTuple(args, "sO|ii", &title, &callback, &width, &height)) { -: 695: return NULL; -: 696: } -: 697: -: 698: if (width <= 0) { -: 699: width = CW_USEDEFAULT; -: 700: } -: 701: if (height <= 0) { -: 702: height = CW_USEDEFAULT; -: 703: } -: 704: -: 705: /* register toplevel window class */ -: 706: windowClass.style = CS_CLASSDC; -: 707: windowClass.cbClsExtra = 0; -: 708: windowClass.cbWndExtra = sizeof(PyObject*) + sizeof(PyThreadState*); -: 709: windowClass.hInstance = GetModuleHandle(NULL); -: 710: /* windowClass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); */ -: 711: windowClass.hbrBackground = NULL; -: 712: windowClass.lpszMenuName = NULL; -: 713: windowClass.lpszClassName = "pilWindow"; -: 714: windowClass.lpfnWndProc = windowCallback; -: 715: windowClass.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(1)); -: 716: windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); /* CROSS? */ -: 717: -: 718: RegisterClass(&windowClass); /* FIXME: check return status */ -: 719: -: 720: wnd = CreateWindowEx( -: 721: 0, windowClass.lpszClassName, title, -: 722: WS_OVERLAPPEDWINDOW, -: 723: CW_USEDEFAULT, CW_USEDEFAULT, width, height, -: 724: HWND_DESKTOP, NULL, NULL, NULL -: 725: ); -: 726: -: 727: if (!wnd) { -: 728: PyErr_SetString(PyExc_OSError, "failed to create window"); -: 729: return NULL; -: 730: } -: 731: -: 732: /* register window callback */ -: 733: Py_INCREF(callback); -: 734: SetWindowLongPtr(wnd, 0, (LONG_PTR) callback); -: 735: SetWindowLongPtr(wnd, sizeof(callback), (LONG_PTR) PyThreadState_Get()); -: 736: -: 737: Py_BEGIN_ALLOW_THREADS -: 738: ShowWindow(wnd, SW_SHOWNORMAL); -: 739: SetForegroundWindow(wnd); /* to make sure it's visible */ -: 740: Py_END_ALLOW_THREADS -: 741: -: 742: return Py_BuildValue(F_HANDLE, wnd); -: 743:} -: 744: -: 745:PyObject* -: 746:PyImaging_EventLoopWin32(PyObject* self, PyObject* args) -: 747:{ -: 748: MSG msg; -: 749: -: 750: Py_BEGIN_ALLOW_THREADS -: 751: while (mainloop && GetMessage(&msg, NULL, 0, 0)) { -: 752: TranslateMessage(&msg); -: 753: DispatchMessage(&msg); -: 754: } -: 755: Py_END_ALLOW_THREADS -: 756: -: 757: Py_INCREF(Py_None); -: 758: return Py_None; -: 759:} -: 760: -: 761:/* -------------------------------------------------------------------- */ -: 762:/* windows WMF renderer */ -: 763: -: 764:#define GET32(p,o) ((DWORD*)(p+o))[0] -: 765: -: 766:PyObject * -: 767:PyImaging_DrawWmf(PyObject* self, PyObject* args) -: 768:{ -: 769: HBITMAP bitmap; -: 770: HENHMETAFILE meta; -: 771: BITMAPCOREHEADER core; -: 772: HDC dc; -: 773: RECT rect; -: 774: PyObject* buffer = NULL; -: 775: char* ptr; -: 776: -: 777: char* data; -: 778: Py_ssize_t datasize; -: 779: int width, height; -: 780: int x0, y0, x1, y1; -: 781: if (!PyArg_ParseTuple(args, "y#(ii)(iiii):_load", &data, &datasize, -: 782: &width, &height, &x0, &x1, &y0, &y1)) { -: 783: return NULL; -: 784: } -: 785: -: 786: /* step 1: copy metafile contents into METAFILE object */ -: 787: -: 788: if (datasize > 22 && GET32(data, 0) == 0x9ac6cdd7) { -: 789: -: 790: /* placeable windows metafile (22-byte aldus header) */ -: 791: meta = SetWinMetaFileBits(datasize-22, data+22, NULL, NULL); -: 792: -: 793: } else if (datasize > 80 && GET32(data, 0) == 1 && -: 794: GET32(data, 40) == 0x464d4520) { -: 795: -: 796: /* enhanced metafile */ -: 797: meta = SetEnhMetaFileBits(datasize, data); -: 798: -: 799: } else { -: 800: -: 801: /* unknown meta format */ -: 802: meta = NULL; -: 803: -: 804: } -: 805: -: 806: if (!meta) { -: 807: PyErr_SetString(PyExc_OSError, "cannot load metafile"); -: 808: return NULL; -: 809: } -: 810: -: 811: /* step 2: create bitmap */ -: 812: -: 813: core.bcSize = sizeof(core); -: 814: core.bcWidth = width; -: 815: core.bcHeight = height; -: 816: core.bcPlanes = 1; -: 817: core.bcBitCount = 24; -: 818: -: 819: dc = CreateCompatibleDC(NULL); -: 820: -: 821: bitmap = CreateDIBSection( -: 822: dc, (BITMAPINFO*) &core, DIB_RGB_COLORS, &ptr, NULL, 0 -: 823: ); -: 824: -: 825: if (!bitmap) { -: 826: PyErr_SetString(PyExc_OSError, "cannot create bitmap"); -: 827: goto error; -: 828: } -: 829: -: 830: if (!SelectObject(dc, bitmap)) { -: 831: PyErr_SetString(PyExc_OSError, "cannot select bitmap"); -: 832: goto error; -: 833: } -: 834: -: 835: /* step 3: render metafile into bitmap */ -: 836: -: 837: rect.left = rect.top = 0; -: 838: rect.right = width; -: 839: rect.bottom = height; -: 840: -: 841: /* FIXME: make background transparent? configurable? */ -: 842: FillRect(dc, &rect, GetStockObject(WHITE_BRUSH)); -: 843: -: 844: if (!PlayEnhMetaFile(dc, meta, &rect)) { -: 845: PyErr_SetString(PyExc_OSError, "cannot render metafile"); -: 846: goto error; -: 847: } -: 848: -: 849: /* step 4: extract bits from bitmap */ -: 850: -: 851: GdiFlush(); -: 852: -: 853: buffer = PyBytes_FromStringAndSize(ptr, height * ((width*3 + 3) & -4)); -: 854: -: 855:error: -: 856: DeleteEnhMetaFile(meta); -: 857: -: 858: if (bitmap) { -: 859: DeleteObject(bitmap); -: 860: } -: 861: -: 862: DeleteDC(dc); -: 863: -: 864: return buffer; -: 865:} -: 866: -: 867:#endif /* _WIN32 */ -: 868: -: 869:/* -------------------------------------------------------------------- */ -: 870:/* X11 support */ -: 871: -: 872:#ifdef HAVE_XCB -: 873:#include -: 874: -: 875:/* -------------------------------------------------------------------- */ -: 876:/* X11 screen grabber */ -: 877: -: 878:PyObject* function PyImaging_GrabScreenX11 called 2 returned 100% blocks executed 28% 2: 879:PyImaging_GrabScreenX11(PyObject* self, PyObject* args) -: 880:{ -: 881: int width, height; -: 882: char* display_name; -: 883: xcb_connection_t* connection; -: 884: int screen_number; -: 885: xcb_screen_iterator_t iter; 2: 886: xcb_screen_t* screen = NULL; -: 887: xcb_get_image_reply_t* reply; -: 888: xcb_generic_error_t* error; 2: 889: PyObject* buffer = NULL; -: 890: 2: 891: if (!PyArg_ParseTuple(args, "|z", &display_name)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 892: return NULL; -: 893: } -: 894: -: 895: /* connect to X and get screen data */ -: 896: 2: 897: connection = xcb_connect(display_name, &screen_number); call 0 returned 100% 2: 898: if (xcb_connection_has_error(connection)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 2: 899: PyErr_Format(PyExc_OSError, "X connection failed: error %i", xcb_connection_has_error(connection)); call 0 returned 100% call 1 returned 100% 2: 900: xcb_disconnect(connection); call 0 returned 100% 2: 901: return NULL; -: 902: } -: 903: #####: 904: iter = xcb_setup_roots_iterator(xcb_get_setup(connection)); call 0 never executed call 1 never executed #####: 905: for (; iter.rem; --screen_number, xcb_screen_next(&iter)) { call 0 never executed branch 1 never executed branch 2 never executed #####: 906: if (screen_number == 0) { branch 0 never executed branch 1 never executed #####: 907: screen = iter.data; #####: 908: break; -: 909: } -: 910: } #####: 911: if (screen == NULL || screen->root == 0) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 912: // this case is usually caught with "X connection failed: error 6" above #####: 913: xcb_disconnect(connection); call 0 never executed #####: 914: PyErr_SetString(PyExc_OSError, "X screen not found"); call 0 never executed #####: 915: return NULL; -: 916: } -: 917: #####: 918: width = screen->width_in_pixels; #####: 919: height = screen->height_in_pixels; -: 920: -: 921: /* get image data */ -: 922: #####: 923: reply = xcb_get_image_reply(connection, call 0 never executed call 1 never executed -: 924: xcb_get_image(connection, XCB_IMAGE_FORMAT_Z_PIXMAP, screen->root, -: 925: 0, 0, width, height, 0x00ffffff), -: 926: &error); #####: 927: if (reply == NULL) { branch 0 never executed branch 1 never executed #####: 928: PyErr_Format(PyExc_OSError, "X get_image failed: error %i (%i, %i, %i)", call 0 never executed #####: 929: error->error_code, error->major_code, error->minor_code, error->resource_id); #####: 930: free(error); #####: 931: xcb_disconnect(connection); call 0 never executed #####: 932: return NULL; -: 933: } -: 934: -: 935: /* store data in Python buffer */ -: 936: #####: 937: if (reply->depth == 24) { branch 0 never executed branch 1 never executed #####: 938: buffer = PyBytes_FromStringAndSize((char*)xcb_get_image_data(reply), call 0 never executed call 1 never executed #####: 939: xcb_get_image_data_length(reply)); call 0 never executed -: 940: } else { #####: 941: PyErr_Format(PyExc_OSError, "unsupported bit depth: %i", reply->depth); call 0 never executed -: 942: } -: 943: #####: 944: free(reply); #####: 945: xcb_disconnect(connection); call 0 never executed -: 946: #####: 947: if (!buffer) { branch 0 never executed branch 1 never executed -: 948: return NULL; -: 949: } -: 950: #####: 951: return Py_BuildValue("(ii)N", width, height, buffer); call 0 never executed -: 952:} -: 953: -: 954:#endif /* HAVE_XCB */ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Effects.c.gcov -: 0:Source:src/libImaging/Effects.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Effects.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Effects.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * various special effects and image generators -: 6: * -: 7: * history: -: 8: * 1997-05-21 fl Just for fun -: 9: * 1997-06-05 fl Added mandelbrot generator -: 10: * 2003-05-24 fl Added perlin_turbulence generator (in progress) -: 11: * -: 12: * Copyright (c) 1997-2003 by Fredrik Lundh. -: 13: * Copyright (c) 1997 by Secret Labs AB. -: 14: * -: 15: * See the README file for information on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21:#include -: 22: -: 23:Imaging function ImagingEffectMandelbrot called 2 returned 100% blocks executed 100% 2: 24:ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality) -: 25:{ -: 26: /* Generate a Mandelbrot set covering the given extent */ -: 27: -: 28: Imaging im; -: 29: int x, y, k; -: 30: double width, height; -: 31: double x1, y1, xi2, yi2, cr, ci, radius; -: 32: double dr, di; -: 33: -: 34: /* Check arguments */ 2: 35: width = extent[2] - extent[0]; 2: 36: height = extent[3] - extent[1]; 2: 37: if (width < 0.0 || height < 0.0 || quality < 2) { branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% 1: 38: return (Imaging) ImagingError_ValueError(NULL); call 0 returned 100% -: 39: } -: 40: 1: 41: im = ImagingNewDirty("L", xsize, ysize); call 0 returned 100% 1: 42: if (!im) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 43: return NULL; -: 44: } -: 45: 1: 46: dr = width/(xsize-1); 1: 47: di = height/(ysize-1); -: 48: 1: 49: radius = 100.0; -: 50: 513: 51: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 512: 52: UINT8* buf = im->image8[y]; 262656: 53: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 262144: 54: x1 = y1 = xi2 = yi2 = 0.0; 262144: 55: cr = x*dr + extent[0]; 262144: 56: ci = y*di + extent[1]; 2641150: 57: for (k = 1;; k++) { 2641150: 58: y1 = 2*x1*y1 + ci; 2641150: 59: x1 = xi2 - yi2 + cr; 2641150: 60: xi2 = x1*x1; 2641150: 61: yi2 = y1*y1; 2641150: 62: if ((xi2 + yi2) > radius) { branch 0 taken 9% (fallthrough) branch 1 taken 91% 245974: 63: buf[x] = k*255/quality; 245974: 64: break; -: 65: } 2395176: 66: if (k > quality) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 16170: 67: buf[x] = 0; 16170: 68: break; -: 69: } 2379006: 70: } -: 71: } -: 72: } -: 73: return im; -: 74:} -: 75: -: 76:Imaging function ImagingEffectNoise called 1 returned 100% blocks executed 100% 1: 77:ImagingEffectNoise(int xsize, int ysize, float sigma) -: 78:{ -: 79: /* Generate Gaussian noise centered around 128 */ -: 80: -: 81: Imaging imOut; -: 82: int x, y; -: 83: int nextok; -: 84: double this, next; -: 85: 1: 86: imOut = ImagingNewDirty("L", xsize, ysize); call 0 returned 100% 1: 87: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 88: return NULL; -: 89: } -: 90: -: 91: next = 0.0; -: 92: nextok = 0; -: 93: 100: 94: for (y = 0; y < imOut->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 100: 95: UINT8* out = imOut->image8[y]; 10100: 96: for (x = 0; x < imOut->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 97: if (nextok) { -: 98: this = next; -: 99: nextok = 0; -: 100: } else { -: 101: /* after numerical recipes */ -: 102: double v1, v2, radius, factor; -: 103: do { 12782: 104: v1 = rand()*(2.0/RAND_MAX) - 1.0; call 0 returned 100% 12782: 105: v2 = rand()*(2.0/RAND_MAX) - 1.0; call 0 returned 100% 12782: 106: radius= v1*v1 + v2*v2; 12782: 107: } while (radius >= 1.0); branch 0 taken 22% (fallthrough) branch 1 taken 78% 10000: 108: factor = sqrt(-2.0*log(radius)/radius); 10000: 109: this = factor * v1; 10000: 110: next = factor * v2; -: 111: } 10000: 112: out[x] = CLIP8(128 + sigma * this); branch 0 taken 83% (fallthrough) branch 1 taken 17% branch 2 taken 81% (fallthrough) branch 3 taken 19% -: 113: } -: 114: } -: 115: -: 116: return imOut; -: 117:} -: 118: -: 119:Imaging function ImagingEffectSpread called 2 returned 100% blocks executed 56% 2: 120:ImagingEffectSpread(Imaging imIn, int distance) -: 121:{ -: 122: /* Randomly spread pixels in an image */ -: 123: -: 124: Imaging imOut; -: 125: int x, y; -: 126: 2: 127: imOut = ImagingNewDirty(imIn->mode, imIn->xsize, imIn->ysize); call 0 returned 100% -: 128: 2: 129: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 130: return NULL; -: 131: } -: 132: -: 133:#define SPREAD(type, image)\ -: 134: if (distance == 0) {\ -: 135: for (y = 0; y < imOut->ysize; y++) {\ -: 136: for (x = 0; x < imOut->xsize; x++) {\ -: 137: imOut->image[y][x] = imIn->image[y][x];\ -: 138: }\ -: 139: }\ -: 140: } else {\ -: 141: for (y = 0; y < imOut->ysize; y++) {\ -: 142: for (x = 0; x < imOut->xsize; x++) {\ -: 143: int xx = x + (rand() % distance) - distance/2;\ -: 144: int yy = y + (rand() % distance) - distance/2;\ -: 145: if (xx >= 0 && xx < imIn->xsize && yy >= 0 && yy < imIn->ysize) {\ -: 146: imOut->image[yy][xx] = imIn->image[y][x];\ -: 147: imOut->image[y][x] = imIn->image[yy][xx];\ -: 148: } else {\ -: 149: imOut->image[y][x] = imIn->image[y][x];\ -: 150: }\ -: 151: }\ -: 152: }\ -: 153: } -: 154: 2: 155: if (imIn->image8) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 156: SPREAD(UINT8, image8); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed call 6 never executed call 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed -: 157: } else { 2: 158: SPREAD(INT32, image32); branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 99% branch 3 taken 1% (fallthrough) branch 4 taken 99% (fallthrough) branch 5 taken 1% call 6 returned 100% call 7 returned 100% branch 8 taken 99% (fallthrough) branch 9 taken 1% branch 10 taken 99% (fallthrough) branch 11 taken 1% branch 12 taken 99% (fallthrough) branch 13 taken 1% branch 14 taken 99% (fallthrough) branch 15 taken 1% branch 16 taken 99% branch 17 taken 1% (fallthrough) branch 18 taken 99% (fallthrough) branch 19 taken 1% -: 159: } -: 160: 2: 161: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 162: 2: 163: return imOut; -: 164:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#map.c.gcov -: 0:Source:src/map.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/map.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/map.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * -: 4: * standard memory mapping interface for the Imaging library -: 5: * -: 6: * history: -: 7: * 1998-03-05 fl added Win32 read mapping -: 8: * 1999-02-06 fl added "I;16" support -: 9: * 2003-04-21 fl added PyImaging_MapBuffer primitive -: 10: * -: 11: * Copyright (c) 1998-2003 by Secret Labs AB. -: 12: * Copyright (c) 2003 by Fredrik Lundh. -: 13: * -: 14: * See the README file for information on usage and redistribution. -: 15: */ -: 16: -: 17:/* -: 18: * FIXME: should move the memory mapping primitives into libImaging! -: 19: */ -: 20: -: 21:#include "Python.h" -: 22: -: 23:#include "libImaging/Imaging.h" -: 24: -: 25:/* compatibility wrappers (defined in _imaging.c) */ -: 26:extern int PyImaging_CheckBuffer(PyObject* buffer); -: 27:extern int PyImaging_GetBuffer(PyObject* buffer, Py_buffer *view); -: 28: -: 29:/* -------------------------------------------------------------------- */ -: 30:/* Standard mapper */ -: 31: -: 32:typedef struct { -: 33: PyObject_HEAD -: 34: char* base; -: 35: int size; -: 36: int offset; -: 37:#ifdef _WIN32 -: 38: HANDLE hFile; -: 39: HANDLE hMap; -: 40:#endif -: 41:} ImagingMapperObject; -: 42: -: 43:static PyTypeObject ImagingMapperType; -: 44: -: 45:ImagingMapperObject* function PyImaging_MapperNew called 0 returned 0% blocks executed 0% #####: 46:PyImaging_MapperNew(const char* filename, int readonly) -: 47:{ -: 48: ImagingMapperObject *mapper; -: 49: #####: 50: if (PyType_Ready(&ImagingMapperType) < 0) { call 0 never executed branch 1 never executed branch 2 never executed -: 51: return NULL; -: 52: } -: 53: #####: 54: mapper = PyObject_New(ImagingMapperObject, &ImagingMapperType); call 0 never executed #####: 55: if (mapper == NULL) { branch 0 never executed branch 1 never executed -: 56: return NULL; -: 57: } -: 58: #####: 59: mapper->base = NULL; #####: 60: mapper->size = mapper->offset = 0; -: 61: -: 62:#ifdef _WIN32 -: 63: mapper->hFile = (HANDLE)-1; -: 64: mapper->hMap = (HANDLE)-1; -: 65: -: 66: /* FIXME: currently supports readonly mappings only */ -: 67: mapper->hFile = CreateFile( -: 68: filename, -: 69: GENERIC_READ, -: 70: FILE_SHARE_READ, -: 71: NULL, OPEN_EXISTING, -: 72: FILE_ATTRIBUTE_NORMAL, -: 73: NULL); -: 74: if (mapper->hFile == (HANDLE)-1) { -: 75: PyErr_SetString(PyExc_OSError, "cannot open file"); -: 76: Py_DECREF(mapper); -: 77: return NULL; -: 78: } -: 79: -: 80: mapper->hMap = CreateFileMapping( -: 81: mapper->hFile, NULL, -: 82: PAGE_READONLY, -: 83: 0, 0, NULL); -: 84: if (mapper->hMap == (HANDLE)-1) { -: 85: CloseHandle(mapper->hFile); -: 86: PyErr_SetString(PyExc_OSError, "cannot map file"); -: 87: Py_DECREF(mapper); -: 88: return NULL; -: 89: } -: 90: -: 91: mapper->base = (char*) MapViewOfFile( -: 92: mapper->hMap, -: 93: FILE_MAP_READ, -: 94: 0, 0, 0); -: 95: -: 96: mapper->size = GetFileSize(mapper->hFile, 0); -: 97:#endif -: 98: #####: 99: return mapper; -: 100:} -: 101: -: 102:static void function mapping_dealloc called 0 returned 0% blocks executed 0% #####: 103:mapping_dealloc(ImagingMapperObject* mapper) -: 104:{ -: 105:#ifdef _WIN32 -: 106: if (mapper->base != 0) { -: 107: UnmapViewOfFile(mapper->base); -: 108: } -: 109: if (mapper->hMap != (HANDLE)-1) { -: 110: CloseHandle(mapper->hMap); -: 111: } -: 112: if (mapper->hFile != (HANDLE)-1) { -: 113: CloseHandle(mapper->hFile); -: 114: } -: 115: mapper->base = 0; -: 116: mapper->hMap = mapper->hFile = (HANDLE)-1; -: 117:#endif #####: 118: PyObject_Del(mapper); call 0 never executed #####: 119:} -: 120: -: 121:/* -------------------------------------------------------------------- */ -: 122:/* standard file operations */ -: 123: -: 124:static PyObject* function mapping_read called 0 returned 0% blocks executed 0% #####: 125:mapping_read(ImagingMapperObject* mapper, PyObject* args) -: 126:{ -: 127: PyObject* buf; -: 128: #####: 129: int size = -1; #####: 130: if (!PyArg_ParseTuple(args, "|i", &size)) { call 0 never executed branch 1 never executed branch 2 never executed -: 131: return NULL; -: 132: } -: 133: -: 134: /* check size */ #####: 135: if (size < 0 || mapper->offset + size > mapper->size) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 136: size = mapper->size - mapper->offset; -: 137: } #####: 138: if (size < 0) { branch 0 never executed branch 1 never executed #####: 139: size = 0; -: 140: } -: 141: #####: 142: buf = PyBytes_FromStringAndSize(NULL, size); call 0 never executed #####: 143: if (!buf) { branch 0 never executed branch 1 never executed -: 144: return NULL; -: 145: } -: 146: #####: 147: if (size > 0) { branch 0 never executed branch 1 never executed #####: 148: memcpy(PyBytes_AsString(buf), mapper->base + mapper->offset, size); call 0 never executed #####: 149: mapper->offset += size; -: 150: } -: 151: -: 152: return buf; -: 153:} -: 154: -: 155:static PyObject* function mapping_seek called 0 returned 0% blocks executed 0% #####: 156:mapping_seek(ImagingMapperObject* mapper, PyObject* args) -: 157:{ -: 158: int offset; #####: 159: int whence = 0; #####: 160: if (!PyArg_ParseTuple(args, "i|i", &offset, &whence)) { call 0 never executed branch 1 never executed branch 2 never executed -: 161: return NULL; -: 162: } -: 163: #####: 164: switch (whence) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 165: case 0: /* SEEK_SET */ #####: 166: mapper->offset = offset; #####: 167: break; -: 168: case 1: /* SEEK_CUR */ #####: 169: mapper->offset += offset; #####: 170: break; -: 171: case 2: /* SEEK_END */ #####: 172: mapper->offset = mapper->size + offset; #####: 173: break; -: 174: default: -: 175: /* FIXME: raise ValueError? */ -: 176: break; -: 177: } -: 178: #####: 179: Py_INCREF(Py_None); #####: 180: return Py_None; -: 181:} -: 182: -: 183:/* -------------------------------------------------------------------- */ -: 184:/* map entire image */ -: 185: -: 186:extern PyObject*PyImagingNew(Imaging im); -: 187: -: 188:static void function ImagingDestroyMap called 0 returned 0% blocks executed 0% #####: 189:ImagingDestroyMap(Imaging im) -: 190:{ #####: 191: return; /* nothing to do! */ -: 192:} -: 193: -: 194:static PyObject* function mapping_readimage called 0 returned 0% blocks executed 0% #####: 195:mapping_readimage(ImagingMapperObject* mapper, PyObject* args) -: 196:{ -: 197: int y, size; -: 198: Imaging im; -: 199: -: 200: char* mode; -: 201: int xsize; -: 202: int ysize; -: 203: int stride; -: 204: int orientation; #####: 205: if (!PyArg_ParseTuple(args, "s(ii)ii", &mode, &xsize, &ysize, call 0 never executed branch 1 never executed branch 2 never executed -: 206: &stride, &orientation)) { -: 207: return NULL; -: 208: } -: 209: #####: 210: if (stride <= 0) { branch 0 never executed branch 1 never executed -: 211: /* FIXME: maybe we should call ImagingNewPrologue instead */ #####: 212: if (!strcmp(mode, "L") || !strcmp(mode, "P")) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed #####: 213: stride = xsize; #####: 214: } else if (!strcmp(mode, "I;16") || !strcmp(mode, "I;16B")) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 215: stride = xsize * 2; -: 216: } else { #####: 217: stride = xsize * 4; -: 218: } -: 219: } -: 220: #####: 221: size = ysize * stride; -: 222: #####: 223: if (mapper->offset + size > mapper->size) { branch 0 never executed branch 1 never executed #####: 224: PyErr_SetString(PyExc_OSError, "image file truncated"); call 0 never executed #####: 225: return NULL; -: 226: } -: 227: #####: 228: im = ImagingNewPrologue(mode, xsize, ysize); call 0 never executed #####: 229: if (!im) { branch 0 never executed branch 1 never executed -: 230: return NULL; -: 231: } -: 232: -: 233: /* setup file pointers */ #####: 234: if (orientation > 0) { branch 0 never executed branch 1 never executed #####: 235: for (y = 0; y < ysize; y++) { branch 0 never executed branch 1 never executed #####: 236: im->image[y] = mapper->base + mapper->offset + y * stride; -: 237: } -: 238: } else { #####: 239: for (y = 0; y < ysize; y++) { branch 0 never executed branch 1 never executed #####: 240: im->image[ysize-y-1] = mapper->base + mapper->offset + y * stride; -: 241: } -: 242: } -: 243: #####: 244: im->destroy = ImagingDestroyMap; -: 245: #####: 246: mapper->offset += size; -: 247: #####: 248: return PyImagingNew(im); call 0 never executed -: 249:} -: 250: -: 251:static struct PyMethodDef methods[] = { -: 252: /* standard file interface */ -: 253: {"read", (PyCFunction)mapping_read, 1}, -: 254: {"seek", (PyCFunction)mapping_seek, 1}, -: 255: /* extensions */ -: 256: {"readimage", (PyCFunction)mapping_readimage, 1}, -: 257: {NULL, NULL} /* sentinel */ -: 258:}; -: 259: -: 260:static PyTypeObject ImagingMapperType = { -: 261: PyVarObject_HEAD_INIT(NULL, 0) -: 262: "ImagingMapper", /*tp_name*/ -: 263: sizeof(ImagingMapperObject), /*tp_size*/ -: 264: 0, /*tp_itemsize*/ -: 265: /* methods */ -: 266: (destructor)mapping_dealloc, /*tp_dealloc*/ -: 267: 0, /*tp_print*/ -: 268: 0, /*tp_getattr*/ -: 269: 0, /*tp_setattr*/ -: 270: 0, /*tp_compare*/ -: 271: 0, /*tp_repr*/ -: 272: 0, /*tp_as_number */ -: 273: 0, /*tp_as_sequence */ -: 274: 0, /*tp_as_mapping */ -: 275: 0, /*tp_hash*/ -: 276: 0, /*tp_call*/ -: 277: 0, /*tp_str*/ -: 278: 0, /*tp_getattro*/ -: 279: 0, /*tp_setattro*/ -: 280: 0, /*tp_as_buffer*/ -: 281: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 282: 0, /*tp_doc*/ -: 283: 0, /*tp_traverse*/ -: 284: 0, /*tp_clear*/ -: 285: 0, /*tp_richcompare*/ -: 286: 0, /*tp_weaklistoffset*/ -: 287: 0, /*tp_iter*/ -: 288: 0, /*tp_iternext*/ -: 289: methods, /*tp_methods*/ -: 290: 0, /*tp_members*/ -: 291: 0, /*tp_getset*/ -: 292:}; -: 293: -: 294:PyObject* function PyImaging_Mapper called 0 returned 0% blocks executed 0% #####: 295:PyImaging_Mapper(PyObject* self, PyObject* args) -: 296:{ -: 297: char* filename; #####: 298: if (!PyArg_ParseTuple(args, "s", &filename)) { call 0 never executed branch 1 never executed branch 2 never executed -: 299: return NULL; -: 300: } -: 301: #####: 302: return (PyObject*) PyImaging_MapperNew(filename, 1); call 0 never executed -: 303:} -: 304: -: 305:/* -------------------------------------------------------------------- */ -: 306:/* Buffer mapper */ -: 307: -: 308:typedef struct ImagingBufferInstance { -: 309: struct ImagingMemoryInstance im; -: 310: PyObject* target; -: 311: Py_buffer view; -: 312:} ImagingBufferInstance; -: 313: -: 314:static void function mapping_destroy_buffer called 106 returned 100% blocks executed 100% 106: 315:mapping_destroy_buffer(Imaging im) -: 316:{ 106: 317: ImagingBufferInstance* buffer = (ImagingBufferInstance*) im; -: 318: 106: 319: PyBuffer_Release(&buffer->view); call 0 returned 100% 106: 320: Py_XDECREF(buffer->target); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 42% (fallthrough) branch 3 taken 58% call 4 returned 100% 106: 321:} -: 322: -: 323:PyObject* function PyImaging_MapBuffer called 107 returned 100% blocks executed 77% 107: 324:PyImaging_MapBuffer(PyObject* self, PyObject* args) -: 325:{ -: 326: Py_ssize_t y, size; -: 327: Imaging im; -: 328: -: 329: PyObject* target; -: 330: Py_buffer view; -: 331: char* mode; -: 332: char* codec; -: 333: Py_ssize_t offset; -: 334: int xsize, ysize; -: 335: int stride; -: 336: int ystep; -: 337: 107: 338: if (!PyArg_ParseTuple(args, "O(ii)sn(sii)", &target, &xsize, &ysize, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 339: &codec, &offset, &mode, &stride, &ystep)) { -: 340: return NULL; -: 341: } -: 342: 107: 343: if (!PyImaging_CheckBuffer(target)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 344: PyErr_SetString(PyExc_TypeError, "expected string or buffer"); call 0 never executed #####: 345: return NULL; -: 346: } -: 347: 107: 348: if (stride <= 0) { branch 0 taken 79% (fallthrough) branch 1 taken 21% 85: 349: if (!strcmp(mode, "L") || !strcmp(mode, "P")) { branch 0 taken 64% (fallthrough) branch 1 taken 36% branch 2 taken 36% (fallthrough) branch 3 taken 64% branch 4 taken 26% (fallthrough) branch 5 taken 74% branch 6 taken 26% (fallthrough) branch 7 taken 74% 62: 350: stride = xsize; 23: 351: } else if (!strncmp(mode, "I;16", 4)) { branch 0 taken 78% (fallthrough) branch 1 taken 22% 18: 352: stride = xsize * 2; -: 353: } else { 5: 354: stride = xsize * 4; -: 355: } -: 356: } -: 357: 107: 358: if (stride > 0 && ysize > PY_SSIZE_T_MAX / stride) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 359: PyErr_SetString(PyExc_MemoryError, "Integer overflow in ysize"); call 0 never executed #####: 360: return NULL; -: 361: } -: 362: 107: 363: size = (Py_ssize_t) ysize * stride; -: 364: 107: 365: if (offset > PY_SSIZE_T_MAX - size) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 366: PyErr_SetString(PyExc_MemoryError, "Integer overflow in offset"); call 0 never executed #####: 367: return NULL; -: 368: } -: 369: -: 370: /* check buffer size */ 107: 371: if (PyImaging_GetBuffer(target, &view) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 372: return NULL; -: 373: } -: 374: 107: 375: if (view.len < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 376: PyErr_SetString(PyExc_ValueError, "buffer has negative size"); call 0 never executed #####: 377: PyBuffer_Release(&view); call 0 never executed #####: 378: return NULL; -: 379: } 107: 380: if (offset + size > view.len) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 381: PyErr_SetString(PyExc_ValueError, "buffer is not large enough"); call 0 returned 100% 1: 382: PyBuffer_Release(&view); call 0 returned 100% 1: 383: return NULL; -: 384: } -: 385: 106: 386: im = ImagingNewPrologueSubtype( call 0 returned 100% -: 387: mode, xsize, ysize, sizeof(ImagingBufferInstance)); 106: 388: if (!im) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 389: PyBuffer_Release(&view); call 0 never executed #####: 390: return NULL; -: 391: } -: 392: -: 393: /* setup file pointers */ 106: 394: if (ystep > 0) { branch 0 taken 35% (fallthrough) branch 1 taken 65% 48947: 395: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% 48947: 396: im->image[y] = (char*)view.buf + offset + y * stride; -: 397: } -: 398: } else { 2157: 399: for (y = 0; y < ysize; y++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 2157: 400: im->image[ysize-y-1] = (char*)view.buf + offset + y * stride; -: 401: } -: 402: } -: 403: 106: 404: im->destroy = mapping_destroy_buffer; -: 405: 106: 406: Py_INCREF(target); 106: 407: ((ImagingBufferInstance*) im)->target = target; 106: 408: ((ImagingBufferInstance*) im)->view = view; -: 409: 106: 410: return PyImagingNew(im); call 0 returned 100% -: 411:} -: 412: <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#JpegEncode.c.gcov -: 0:Source:src/libImaging/JpegEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/JpegEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/JpegEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * coder for JPEG data -: 6: * -: 7: * history: -: 8: * 1996-05-06 fl created -: 9: * 1996-07-16 fl don't drop last block of encoded data -: 10: * 1996-12-30 fl added quality and progressive settings -: 11: * 1997-01-08 fl added streamtype settings -: 12: * 1998-01-31 fl adapted to libjpeg 6a -: 13: * 1998-07-12 fl added YCbCr support -: 14: * 2001-04-16 fl added DPI write support -: 15: * -: 16: * Copyright (c) 1997-2001 by Secret Labs AB -: 17: * Copyright (c) 1995-1997 by Fredrik Lundh -: 18: * -: 19: * See the README file for details on usage and redistribution. -: 20: */ -: 21: -: 22: -: 23:#include "Imaging.h" -: 24: -: 25:#ifdef HAVE_LIBJPEG -: 26: -: 27:#undef HAVE_PROTOTYPES -: 28:#undef HAVE_STDLIB_H -: 29:#undef HAVE_STDDEF_H -: 30:#undef UINT8 -: 31:#undef UINT16 -: 32:#undef UINT32 -: 33:#undef INT16 -: 34:#undef INT32 -: 35: -: 36:#include "Jpeg.h" -: 37: -: 38:/* -------------------------------------------------------------------- */ -: 39:/* Suspending output handler */ -: 40:/* -------------------------------------------------------------------- */ -: 41: -: 42:METHODDEF(void) function stub called 314 returned 100% blocks executed 100% 314: 43:stub(j_compress_ptr cinfo) -: 44:{ -: 45: /* empty */ 314: 46:} -: 47: -: 48:METHODDEF(boolean) function empty_output_buffer called 9 returned 100% blocks executed 100% 9: 49:empty_output_buffer (j_compress_ptr cinfo) -: 50:{ -: 51: /* Suspension */ 9: 52: return FALSE; -: 53:} -: 54: -: 55:GLOBAL(void) function jpeg_buffer_dest called 157 returned 100% blocks executed 100% 157: 56:jpeg_buffer_dest(j_compress_ptr cinfo, JPEGDESTINATION* destination) -: 57:{ 157: 58: cinfo->dest = (void*) destination; -: 59: 157: 60: destination->pub.init_destination = stub; 157: 61: destination->pub.empty_output_buffer = empty_output_buffer; 157: 62: destination->pub.term_destination = stub; 157: 63:} -: 64: -: 65: -: 66:/* -------------------------------------------------------------------- */ -: 67:/* Error handler */ -: 68:/* -------------------------------------------------------------------- */ -: 69: -: 70:METHODDEF(void) function error called 0 returned 0% blocks executed 0% #####: 71:error(j_common_ptr cinfo) -: 72:{ -: 73: JPEGERROR* error; #####: 74: error = (JPEGERROR*) cinfo->err; #####: 75: (*cinfo->err->output_message) (cinfo); call 0 never executed #####: 76: longjmp(error->setjmp_buffer, 1); -: 77:} -: 78: -: 79: -: 80:/* -------------------------------------------------------------------- */ -: 81:/* Encoder */ -: 82:/* -------------------------------------------------------------------- */ -: 83: -: 84:int function ImagingJpegEncode called 174 returned 100% blocks executed 88% 174: 85:ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 86:{ 174: 87: JPEGENCODERSTATE* context = (JPEGENCODERSTATE*) state->context; -: 88: int ok; -: 89: 174: 90: if (setjmp(context->error.setjmp_buffer)) { branch 0 taken 0% branch 1 taken 100% -: 91: /* JPEG error handler */ #####: 92: jpeg_destroy_compress(&context->cinfo); call 0 never executed #####: 93: state->errcode = IMAGING_CODEC_BROKEN; #####: 94: return -1; -: 95: } -: 96: 174: 97: if (!state->state) { branch 0 taken 90% (fallthrough) branch 1 taken 10% -: 98: -: 99: /* Setup compression context (very similar to the decoder) */ 157: 100: context->cinfo.err = jpeg_std_error(&context->error.pub); call 0 returned 100% 157: 101: context->error.pub.error_exit = error; 157: 102: jpeg_create_compress(&context->cinfo); call 0 returned 100% 157: 103: jpeg_buffer_dest(&context->cinfo, &context->destination); call 0 returned 100% -: 104: 157: 105: context->extra_offset = 0; -: 106: -: 107: /* Ready to encode */ 157: 108: state->state = 1; -: 109: -: 110: } -: 111: -: 112: /* Load the destination buffer */ 174: 113: context->destination.pub.next_output_byte = buf; 174: 114: context->destination.pub.free_in_buffer = bytes; -: 115: 174: 116: switch (state->state) { branch 0 taken 90% branch 1 taken 1% branch 2 taken 3% branch 3 taken 6% branch 4 taken 0% branch 5 taken 0% -: 117: -: 118: case 1: -: 119: 157: 120: context->cinfo.image_width = state->xsize; 157: 121: context->cinfo.image_height = state->ysize; -: 122: 157: 123: switch (state->bits) { branch 0 taken 20% branch 1 taken 1% branch 2 taken 79% branch 3 taken 0% -: 124: case 8: 32: 125: context->cinfo.input_components = 1; 32: 126: context->cinfo.in_color_space = JCS_GRAYSCALE; 32: 127: break; -: 128: case 24: 1: 129: context->cinfo.input_components = 3; 1: 130: if (strcmp(im->mode, "YCbCr") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 131: context->cinfo.in_color_space = JCS_YCbCr; -: 132: } else { #####: 133: context->cinfo.in_color_space = JCS_RGB; -: 134: } -: 135: break; -: 136: case 32: 124: 137: context->cinfo.input_components = 4; 124: 138: context->cinfo.in_color_space = JCS_CMYK; -: 139: #ifdef JCS_EXTENSIONS 124: 140: if (strcmp(context->rawmode, "RGBX") == 0) { branch 0 taken 82% (fallthrough) branch 1 taken 18% 102: 141: context->cinfo.in_color_space = JCS_EXT_RGBX; -: 142: } -: 143: #endif -: 144: break; -: 145: default: #####: 146: state->errcode = IMAGING_CODEC_CONFIG; #####: 147: return -1; -: 148: } -: 149: -: 150: /* Compressor configuration */ 157: 151: jpeg_set_defaults(&context->cinfo); call 0 returned 100% -: 152: -: 153: /* Use custom quantization tables */ 157: 154: if (context->qtables) { branch 0 taken 20% (fallthrough) branch 1 taken 80% -: 155: int i; 32: 156: int quality = 100; 32: 157: int last_q = 0; 32: 158: if (context->quality != -1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 159: quality = context->quality; -: 160: } 95: 161: for (i = 0; i < context->qtablesLen; i++) { branch 0 taken 66% branch 1 taken 34% (fallthrough) 63: 162: jpeg_add_quant_table(&context->cinfo, i, &context->qtables[i * DCTSIZE2], call 0 returned 100% -: 163: quality, FALSE); 63: 164: context->cinfo.comp_info[i].quant_tbl_no = i; 63: 165: last_q = i; -: 166: } 32: 167: if (context->qtablesLen == 1) { branch 0 taken 28% (fallthrough) branch 1 taken 72% -: 168: // jpeg_set_defaults created two qtables internally, but we only wanted one. 9: 169: jpeg_add_quant_table(&context->cinfo, 1, &context->qtables[0], call 0 returned 100% -: 170: quality, FALSE); -: 171: } 68: 172: for (i = last_q; i < context->cinfo.num_components; i++) { branch 0 taken 68% branch 1 taken 32% 68: 173: context->cinfo.comp_info[i].quant_tbl_no = last_q; -: 174: } 125: 175: } else if (context->quality != -1) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 9: 176: jpeg_set_quality(&context->cinfo, context->quality, TRUE); call 0 returned 100% -: 177: } -: 178: -: 179: /* Set subsampling options */ 157: 180: switch (context->subsampling) branch 0 taken 3% branch 1 taken 1% branch 2 taken 4% branch 3 taken 92% -: 181: { -: 182: case 0: /* 1x1 1x1 1x1 (4:4:4) : None */ -: 183: { 4: 184: context->cinfo.comp_info[0].h_samp_factor = 1; 4: 185: context->cinfo.comp_info[0].v_samp_factor = 1; 4: 186: context->cinfo.comp_info[1].h_samp_factor = 1; 4: 187: context->cinfo.comp_info[1].v_samp_factor = 1; 4: 188: context->cinfo.comp_info[2].h_samp_factor = 1; 4: 189: context->cinfo.comp_info[2].v_samp_factor = 1; 4: 190: break; -: 191: } -: 192: case 1: /* 2x1, 1x1, 1x1 (4:2:2) : Medium */ -: 193: { 2: 194: context->cinfo.comp_info[0].h_samp_factor = 2; 2: 195: context->cinfo.comp_info[0].v_samp_factor = 1; 2: 196: context->cinfo.comp_info[1].h_samp_factor = 1; 2: 197: context->cinfo.comp_info[1].v_samp_factor = 1; 2: 198: context->cinfo.comp_info[2].h_samp_factor = 1; 2: 199: context->cinfo.comp_info[2].v_samp_factor = 1; 2: 200: break; -: 201: } -: 202: case 2: /* 2x2, 1x1, 1x1 (4:2:0) : High */ -: 203: { 7: 204: context->cinfo.comp_info[0].h_samp_factor = 2; 7: 205: context->cinfo.comp_info[0].v_samp_factor = 2; 7: 206: context->cinfo.comp_info[1].h_samp_factor = 1; 7: 207: context->cinfo.comp_info[1].v_samp_factor = 1; 7: 208: context->cinfo.comp_info[2].h_samp_factor = 1; 7: 209: context->cinfo.comp_info[2].v_samp_factor = 1; 7: 210: break; -: 211: } -: 212: default: -: 213: { -: 214: /* Use the lib's default */ -: 215: break; -: 216: } -: 217: } 157: 218: if (context->progressive) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 8: 219: jpeg_simple_progression(&context->cinfo); call 0 returned 100% -: 220: } 157: 221: context->cinfo.smoothing_factor = context->smooth; 157: 222: context->cinfo.optimize_coding = (boolean) context->optimize; 157: 223: if (context->xdpi > 0 && context->ydpi > 0) { branch 0 taken 6% (fallthrough) branch 1 taken 94% branch 2 taken 100% (fallthrough) branch 3 taken 0% 10: 224: context->cinfo.write_JFIF_header = TRUE; 10: 225: context->cinfo.density_unit = 1; /* dots per inch */ 10: 226: context->cinfo.X_density = context->xdpi; 10: 227: context->cinfo.Y_density = context->ydpi; -: 228: } 157: 229: switch (context->streamtype) { branch 0 taken 0% branch 1 taken 0% branch 2 taken 100% -: 230: case 1: -: 231: /* tables only -- not yet implemented */ #####: 232: state->errcode = IMAGING_CODEC_CONFIG; #####: 233: return -1; -: 234: case 2: -: 235: /* image only */ #####: 236: jpeg_suppress_tables(&context->cinfo, TRUE); call 0 never executed #####: 237: jpeg_start_compress(&context->cinfo, FALSE); call 0 never executed -: 238: /* suppress extra section */ #####: 239: context->extra_offset = context->extra_size; #####: 240: break; -: 241: default: -: 242: /* interchange stream */ 157: 243: jpeg_start_compress(&context->cinfo, TRUE); call 0 returned 100% -: 244: break; -: 245: } 157: 246: state->state++; -: 247: /* fall through */ -: 248: -: 249: case 2: -: 250: // check for exif len + 'APP1' header bytes 158: 251: if (context->rawExifLen + 5 > context->destination.pub.free_in_buffer){ branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 252: break; -: 253: } -: 254: //add exif header 157: 255: if (context->rawExifLen > 0){ branch 0 taken 3% (fallthrough) branch 1 taken 97% 10: 256: jpeg_write_marker(&context->cinfo, JPEG_APP0+1, call 0 returned 100% 5: 257: (unsigned char*)context->rawExif, context->rawExifLen); -: 258: } -: 259: 157: 260: state->state++; -: 261: /* fall through */ -: 262: case 3: -: 263: 163: 264: if (context->extra) { branch 0 taken 11% (fallthrough) branch 1 taken 89% -: 265: /* copy extra buffer to output buffer */ 18: 266: unsigned int n = context->extra_size - context->extra_offset; 18: 267: if (n > context->destination.pub.free_in_buffer) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 6: 268: n = context->destination.pub.free_in_buffer; -: 269: } 54: 270: memcpy(context->destination.pub.next_output_byte, 18: 271: context->extra + context->extra_offset, n); 18: 272: context->destination.pub.next_output_byte += n; 18: 273: context->destination.pub.free_in_buffer -= n; 18: 274: context->extra_offset += n; 18: 275: if (context->extra_offset >= context->extra_size) { branch 0 taken 67% (fallthrough) branch 1 taken 33% 12: 276: state->state++; -: 277: } else { -: 278: break; -: 279: } -: 280: } else { 145: 281: state->state++; -: 282: } -: 283: -: 284: case 4: 167: 285: if (1024 > context->destination.pub.free_in_buffer){ branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 286: break; -: 287: } -: 288: -: 289: ok = 1; 36206: 290: while (state->y < state->ysize) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 72098: 291: state->shuffle(state->buffer, call 0 returned 100% 36049: 292: (UINT8*) im->image[state->y + state->yoff] + 36049: 293: state->xoff * im->pixelsize, state->xsize); 36049: 294: ok = jpeg_write_scanlines(&context->cinfo, &state->buffer, 1); call 0 returned 100% 36049: 295: if (ok != 1) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 296: break; -: 297: } 36040: 298: state->y++; -: 299: } -: 300: 166: 301: if (ok != 1) { branch 0 taken 95% (fallthrough) branch 1 taken 5% -: 302: break; -: 303: } 157: 304: state->state++; -: 305: /* fall through */ -: 306: -: 307: case 5: -: 308: -: 309: /* Finish compression */ 157: 310: if (context->destination.pub.free_in_buffer < 100) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 311: break; -: 312: } 157: 313: jpeg_finish_compress(&context->cinfo); call 0 returned 100% -: 314: -: 315: /* Clean up */ 157: 316: if (context->extra) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 12: 317: free(context->extra); 12: 318: context->extra = NULL; -: 319: } 157: 320: if (context->rawExif) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 5: 321: free(context->rawExif); 5: 322: context->rawExif = NULL; -: 323: } 157: 324: if (context->qtables) { branch 0 taken 20% (fallthrough) branch 1 taken 80% 32: 325: free(context->qtables); 32: 326: context->qtables = NULL; -: 327: } -: 328: 157: 329: jpeg_destroy_compress(&context->cinfo); call 0 returned 100% -: 330: /* if (jerr.pub.num_warnings) return BROKEN; */ 157: 331: state->errcode = IMAGING_CODEC_END; 157: 332: break; -: 333: -: 334: } -: 335: -: 336: /* Return number of bytes in output buffer */ 174: 337: return context->destination.pub.next_output_byte - buf; -: 338: -: 339:} -: 340: -: 341:const char* function ImagingJpegVersion called 3 returned 100% blocks executed 100% 3: 342:ImagingJpegVersion(void) -: 343:{ -: 344: static char version[20]; 3: 345: sprintf(version, "%d.%d", JPEG_LIB_VERSION / 10, JPEG_LIB_VERSION % 10); 3: 346: return version; -: 347:} -: 348: -: 349:#endif <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#QuantHash.c.gcov -: 0:Source:src/libImaging/QuantHash.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/QuantHash.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/QuantHash.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * hash tables used by the image quantizer -: 6: * -: 7: * history: -: 8: * 98-09-10 tjs Contributed -: 9: * 98-12-29 fl Added to PIL 1.0b1 -: 10: * -: 11: * Written by Toby J Sargeant . -: 12: * -: 13: * Copyright (c) 1998 by Toby J Sargeant -: 14: * Copyright (c) 1998 by Secret Labs AB -: 15: * -: 16: * See the README file for information on usage and redistribution. -: 17: */ -: 18: -: 19:#include -: 20:#include -: 21:#include -: 22:#include -: 23: -: 24:#include "QuantHash.h" -: 25: -: 26:typedef struct _HashNode { -: 27: struct _HashNode *next; -: 28: HashKey_t key; -: 29: HashVal_t value; -: 30:} HashNode; -: 31: -: 32:struct _HashTable { -: 33: HashNode **table; -: 34: uint32_t length; -: 35: uint32_t count; -: 36: HashFunc hashFunc; -: 37: HashCmpFunc cmpFunc; -: 38: void *userData; -: 39:}; -: 40: -: 41:#define MIN_LENGTH 11 -: 42:#define RESIZE_FACTOR 3 -: 43: -: 44:static int _hashtable_insert_node(HashTable *,HashNode *,int,int,CollisionFunc); -: 45: function hashtable_new called 24 returned 100% blocks executed 80% 24: 46:HashTable *hashtable_new(HashFunc hf,HashCmpFunc cf) { -: 47: HashTable *h; 24: 48: h=malloc(sizeof(HashTable)); 24: 49: if (!h) { return NULL; } branch 0 taken 100% (fallthrough) branch 1 taken 0% 24: 50: h->hashFunc=hf; 24: 51: h->cmpFunc=cf; 24: 52: h->length=MIN_LENGTH; 24: 53: h->count=0; 24: 54: h->userData=NULL; 24: 55: h->table=malloc(sizeof(HashNode *)*h->length); 24: 56: if (!h->table) { free(h); return NULL; } branch 0 taken 0% (fallthrough) branch 1 taken 100% 48: 57: memset (h->table,0,sizeof(HashNode *)*h->length); 24: 58: return h; -: 59:} -: 60: function _findPrime called 204 returned 100% blocks executed 92% 204: 61:static uint32_t _findPrime(uint32_t start,int dir) { -: 62: static int unit[]={0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0}; -: 63: uint32_t t; 568: 64: while (start>1) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 364: 65: if (!unit[start&0x0f]) { branch 0 taken 56% (fallthrough) branch 1 taken 44% 160: 66: start+=dir; 160: 67: continue; -: 68: } 3338: 69: for (t=2;t=sqrt((double)start)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 75: break; -: 76: } #####: 77: start+=dir; -: 78: } 204: 79: return start; -: 80:} -: 81: function _hashtable_rehash called 140 returned 100% blocks executed 90% 140: 82:static void _hashtable_rehash(HashTable *h,CollisionFunc cf,uint32_t newSize) { 140: 83: HashNode **oldTable=h->table; -: 84: uint32_t i; -: 85: HashNode *n,*nn; -: 86: uint32_t oldSize; 140: 87: oldSize=h->length; 140: 88: h->table=malloc(sizeof(HashNode *)*newSize); 140: 89: if (!h->table) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 90: h->table=oldTable; #####: 91: return; -: 92: } 140: 93: h->length=newSize; 140: 94: h->count=0; 280: 95: memset (h->table,0,sizeof(HashNode *)*h->length); 78728: 96: for (i=0;inext; 235904: 99: _hashtable_insert_node(h,n,0,0,cf); -: 100: } -: 101: } 140: 102: free(oldTable); -: 103:} -: 104: function _hashtable_resize called 137036 returned 100% blocks executed 100% 137036: 105:static void _hashtable_resize(HashTable *h) { -: 106: uint32_t newSize; -: 107: uint32_t oldSize; 137036: 108: oldSize=h->length; 137036: 109: newSize=oldSize; 137036: 110: if (h->count*RESIZE_FACTORlength) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 64: 111: newSize=_findPrime(h->length/2-1,-1); call 0 returned 100% 136972: 112: } else if (h->length*RESIZE_FACTORcount) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 140: 113: newSize=_findPrime(h->length*2+1,+1); call 0 returned 100% -: 114: } 137036: 115: if (newSizehashFunc(h,node->key)%h->length; call 0 returned 100% -: 123: HashNode **n,*nv; -: 124: int i; -: 125: 324142: 126: for (n=&(h->table[hash]);*n;n=&((*n)->next)) { branch 0 taken 47% branch 1 taken 53% (fallthrough) 153268: 127: nv=*n; 153268: 128: i=h->cmpFunc(h,nv->key,node->key); call 0 returned 100% 153268: 129: if (!i) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 130: if (cf) { branch 0 never executed branch 1 never executed #####: 131: nv->key=node->key; #####: 132: cf(h,&(nv->key),&(nv->value),node->key,node->value); call 0 never executed #####: 133: free(node); #####: 134: return 1; -: 135: } else { #####: 136: nv->key=node->key; #####: 137: nv->value=node->value; #####: 138: free(node); #####: 139: return 1; -: 140: } 153268: 141: } else if (i>0) { branch 0 taken 58% (fallthrough) branch 1 taken 42% -: 142: break; -: 143: } -: 144: } 235904: 145: if (!update) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 235904: 146: node->next=*n; 235904: 147: *n=node; 235904: 148: h->count++; 235904: 149: if (resize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 150: _hashtable_resize(h); call 0 never executed -: 151: } -: 152: return 1; -: 153: } else { -: 154: return 0; -: 155: } -: 156:} -: 157: function _hashtable_insert called 137036 returned 100% blocks executed 100% 137036: 158:static int _hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val,int resize,int update) { -: 159: HashNode **n,*nv; -: 160: HashNode *t; -: 161: int i; 137036: 162: uint32_t hash=h->hashFunc(h,key)%h->length; call 0 returned 100% -: 163: 278356: 164: for (n=&(h->table[hash]);*n;n=&((*n)->next)) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 248150: 165: nv=*n; 248150: 166: i=h->cmpFunc(h,nv->key,key); call 0 returned 100% 248150: 167: if (!i) { branch 0 taken 28% (fallthrough) branch 1 taken 72% 68518: 168: nv->value=val; 68518: 169: return 1; 179632: 170: } else if (i>0) { branch 0 taken 79% (fallthrough) branch 1 taken 21% -: 171: break; -: 172: } -: 173: } 68518: 174: if (!update) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 68518: 175: t=malloc(sizeof(HashNode)); 68518: 176: if (!t) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 177: return 0; -: 178: } 68518: 179: t->next=*n; 68518: 180: *n=t; 68518: 181: t->key=key; 68518: 182: t->value=val; 68518: 183: h->count++; 68518: 184: if (resize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 68518: 185: _hashtable_resize(h); call 0 returned 100% -: 186: } -: 187: return 1; -: 188: } else { -: 189: return 0; -: 190: } -: 191:} -: 192: function hashtable_insert_or_update_computed called 679268 returned 100% blocks executed 94% 679268: 193:int hashtable_insert_or_update_computed(HashTable *h, -: 194: HashKey_t key, -: 195: ComputeFunc newFunc, -: 196: ComputeFunc existsFunc) { -: 197: HashNode **n,*nv; -: 198: HashNode *t; -: 199: int i; 679268: 200: uint32_t hash=h->hashFunc(h,key)%h->length; call 0 returned 100% -: 201: 1100518: 202: for (n=&(h->table[hash]);*n;n=&((*n)->next)) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 1069889: 203: nv=*n; 1069889: 204: i=h->cmpFunc(h,nv->key,key); call 0 returned 100% 1069889: 205: if (!i) { branch 0 taken 57% (fallthrough) branch 1 taken 43% 610750: 206: if (existsFunc) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 610750: 207: existsFunc(h,nv->key,&(nv->value)); call 0 returned 100% -: 208: } else { -: 209: return 0; -: 210: } 610750: 211: return 1; 459139: 212: } else if (i>0) { branch 0 taken 92% (fallthrough) branch 1 taken 8% -: 213: break; -: 214: } -: 215: } 68518: 216: t=malloc(sizeof(HashNode)); 68518: 217: if (!t) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 218: return 0; -: 219: } 68518: 220: t->key=key; 68518: 221: t->next=*n; 68518: 222: *n=t; 68518: 223: if (newFunc) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 68518: 224: newFunc(h,t->key,&(t->value)); call 0 returned 100% -: 225: } else { #####: 226: free(t); #####: 227: return 0; -: 228: } 68518: 229: h->count++; 68518: 230: _hashtable_resize(h); call 0 returned 100% 68518: 231: return 1; -: 232:} -: 233: function hashtable_insert called 137036 returned 100% blocks executed 100% 137036: 234:int hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val) { 137036: 235: return _hashtable_insert(h,key,val,1,0); call 0 returned 100% -: 236:} -: 237: function hashtable_foreach_update called 0 returned 0% blocks executed 0% #####: 238:void hashtable_foreach_update(HashTable *h,IteratorUpdateFunc i,void *u) { -: 239: HashNode *n; -: 240: uint32_t x; -: 241: #####: 242: if (h->table) { branch 0 never executed branch 1 never executed #####: 243: for (x=0;xlength;x++) { branch 0 never executed branch 1 never executed #####: 244: for (n=h->table[x];n;n=n->next) { branch 0 never executed branch 1 never executed #####: 245: i(h,n->key,&(n->value),u); call 0 never executed -: 246: } -: 247: } -: 248: } #####: 249:} -: 250: function hashtable_foreach called 12 returned 100% blocks executed 100% 12: 251:void hashtable_foreach(HashTable *h,IteratorFunc i,void *u) { -: 252: HashNode *n; -: 253: uint32_t x; -: 254: 12: 255: if (h->table) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 39544: 256: for (x=0;xlength;x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 108062: 257: for (n=h->table[x];n;n=n->next) { branch 0 taken 63% branch 1 taken 37% (fallthrough) 68518: 258: i(h,n->key,n->value,u); call 0 returned 100% -: 259: } -: 260: } -: 261: } 12: 262:} -: 263: function hashtable_free called 24 returned 100% blocks executed 100% 24: 264:void hashtable_free(HashTable *h) { -: 265: HashNode *n,*nn; -: 266: uint32_t i; -: 267: 24: 268: if (h->table) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 79088: 269: for (i=0;ilength;i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 216124: 270: for (n=h->table[i];n;n=nn) { branch 0 taken 63% branch 1 taken 37% (fallthrough) 137036: 271: nn=n->next; 137036: 272: free(n); -: 273: } -: 274: } 24: 275: free(h->table); -: 276: } 24: 277: free(h); 24: 278:} -: 279: function hashtable_rehash_compute called 0 returned 0% blocks executed 0% #####: 280:void hashtable_rehash_compute(HashTable *h,CollisionFunc cf) { #####: 281: _hashtable_rehash(h,cf,h->length); call 0 never executed #####: 282:} -: 283: function hashtable_lookup called 1427054 returned 100% blocks executed 100% 1427054: 284:int hashtable_lookup(const HashTable *h,const HashKey_t key,HashVal_t *valp) { 1427054: 285: uint32_t hash=h->hashFunc(h,key)%h->length; call 0 returned 100% -: 286: HashNode *n; -: 287: int i; -: 288: 2104753: 289: for (n=h->table[hash];n;n=n->next) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2074547: 290: i=h->cmpFunc(h,n->key,key); call 0 returned 100% 2074547: 291: if (!i) { branch 0 taken 65% (fallthrough) branch 1 taken 35% 1358536: 292: *valp=n->value; 1358536: 293: return 1; 716011: 294: } else if (i>0) { branch 0 taken 95% (fallthrough) branch 1 taken 5% -: 295: break; -: 296: } -: 297: } -: 298: return 0; -: 299:} -: 300: function hashtable_get_count called 679268 returned 100% blocks executed 100% 679268: 301:uint32_t hashtable_get_count(const HashTable *h) { 679268: 302: return h->count; -: 303:} -: 304: function hashtable_get_user_data called 4100384 returned 100% blocks executed 100% 4100384: 305:void *hashtable_get_user_data(const HashTable *h) { 4100384: 306: return h->userData; -: 307:} -: 308: function hashtable_set_user_data called 12 returned 100% blocks executed 100% 12: 309:void *hashtable_set_user_data(HashTable *h,void *data) { 12: 310: void *r=h->userData; 12: 311: h->userData=data; 12: 312: return r; -: 313:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#HexDecode.c.gcov -: 0:Source:src/libImaging/HexDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/HexDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/HexDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for hex encoded image data -: 6: * -: 7: * history: -: 8: * 96-05-16 fl Created -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1996. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19:#define HEX(v) ((v >= '0' && v <= '9') ? v - '0' :\ -: 20: (v >= 'a' && v <= 'f') ? v - 'a' + 10 :\ -: 21: (v >= 'A' && v <= 'F') ? v - 'A' + 10 : -1) -: 22: -: 23:int function ImagingHexDecode called 194 returned 100% blocks executed 83% 194: 24:ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 25:{ -: 26: UINT8* ptr; -: 27: int a, b; -: 28: 194: 29: ptr = buf; -: 30: -: 31: for (;;) { -: 32: 1254: 33: if (bytes < 2) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 34: return ptr - buf; -: 35: } -: 36: 1254: 37: a = HEX(ptr[0]); branch 0 taken 69% (fallthrough) branch 1 taken 31% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 taken 100% (fallthrough) branch 5 taken 0% 1254: 38: b = HEX(ptr[1]); branch 0 taken 80% (fallthrough) branch 1 taken 20% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 39: 1254: 40: if (a < 0 || b < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 41: #####: 42: ptr++; #####: 43: bytes--; -: 44: -: 45: } else { -: 46: 1254: 47: ptr += 2; 1254: 48: bytes -= 2; -: 49: 1254: 50: state->buffer[state->x] = (a<<4) + b; -: 51: 1254: 52: if (++state->x >= state->bytes) { branch 0 taken 0% branch 1 taken 100% (fallthrough) -: 53: -: 54: /* Got a full line, unpack it */ 1254: 55: state->shuffle((UINT8*) im->image[state->y], state->buffer, call 0 returned 100% -: 56: state->xsize); -: 57: 1254: 58: state->x = 0; -: 59: 1254: 60: if (++state->y >= state->ysize) { branch 0 taken 85% branch 1 taken 15% (fallthrough) -: 61: /* End of file (errcode = 0) */ -: 62: return -1; -: 63: } -: 64: } -: 65: -: 66: } -: 67: } -: 68:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#RankFilter.c.gcov -: 0:Source:src/libImaging/RankFilter.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/RankFilter.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/RankFilter.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * min, max, median filters -: 6: * -: 7: * history: -: 8: * 2002-06-08 fl Created -: 9: * -: 10: * Copyright (c) Secret Labs AB 2002. All rights reserved. -: 11: * -: 12: * See the README file for information on usage and redistribution. -: 13: */ -: 14: -: 15:#include "Imaging.h" -: 16: -: 17:/* Fast rank algorithm (due to Wirth), based on public domain code -: 18: by Nicolas Devillard, available at http://ndevilla.free.fr */ -: 19: -: 20:#define SWAP(type,a,b) { register type t=(a);(a)=(b);(b)=t; } -: 21: -: 22:#define MakeRankFunction(type)\ -: 23:static type Rank##type(type a[], int n, int k)\ -: 24:{\ -: 25: register int i, j, l, m;\ -: 26: register type x;\ -: 27: l = 0; m = n-1;\ -: 28: while (l < m) {\ -: 29: x = a[k];\ -: 30: i = l;\ -: 31: j = m;\ -: 32: do {\ -: 33: while (a[i] < x) {\ -: 34: i++;\ -: 35: }\ -: 36: while (x < a[j]) {\ -: 37: j--;\ -: 38: }\ -: 39: if (i <= j) {\ -: 40: SWAP(type, a[i], a[j]);\ -: 41: i++; j--;\ -: 42: }\ -: 43: } while (i <= j);\ -: 44: if (j < k) {\ -: 45: l = i;\ -: 46: }\ -: 47: if (k < i) {\ -: 48: m = j;\ -: 49: }\ -: 50: }\ -: 51: return a[k];\ -: 52:} -: 53: function RankUINT8 called 393351 returned 100% blocks executed 100% 393351: 54:MakeRankFunction(UINT8) branch 0 taken 38% branch 1 taken 62% (fallthrough) branch 2 taken 38% branch 3 taken 62% (fallthrough) branch 4 taken 83% (fallthrough) branch 5 taken 17% branch 6 taken 55% branch 7 taken 45% (fallthrough) branch 8 taken 59% (fallthrough) branch 9 taken 41% branch 10 taken 59% (fallthrough) branch 11 taken 41% branch 12 taken 71% branch 13 taken 29% (fallthrough) function RankINT32 called 27 returned 100% blocks executed 100% 27: 55:MakeRankFunction(INT32) branch 0 taken 65% branch 1 taken 35% (fallthrough) branch 2 taken 65% branch 3 taken 35% (fallthrough) branch 4 taken 84% (fallthrough) branch 5 taken 16% branch 6 taken 33% branch 7 taken 67% (fallthrough) branch 8 taken 63% (fallthrough) branch 9 taken 37% branch 10 taken 63% (fallthrough) branch 11 taken 37% branch 12 taken 60% branch 13 taken 40% (fallthrough) function RankFLOAT32 called 27 returned 100% blocks executed 100% 27: 56:MakeRankFunction(FLOAT32) branch 0 taken 65% branch 1 taken 35% (fallthrough) branch 2 taken 65% branch 3 taken 35% (fallthrough) branch 4 taken 84% (fallthrough) branch 5 taken 16% branch 6 taken 33% branch 7 taken 67% (fallthrough) branch 8 taken 63% (fallthrough) branch 9 taken 37% branch 10 taken 63% (fallthrough) branch 11 taken 37% branch 12 taken 60% branch 13 taken 40% (fallthrough) -: 57: -: 58:Imaging function ImagingRankFilter called 45 returned 100% blocks executed 87% 45: 59:ImagingRankFilter(Imaging im, int size, int rank) -: 60:{ 45: 61: Imaging imOut = NULL; -: 62: int x, y; -: 63: int i, margin, size2; -: 64: 45: 65: if (!im || im->bands != 1 || im->type == IMAGING_TYPE_SPECIAL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 66: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 67: } -: 68: 45: 69: if (!(size & 1)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 70: return (Imaging) ImagingError_ValueError("bad filter size"); call 0 never executed -: 71: } -: 72: -: 73: /* malloc check ok, for overflow in the define below */ 90: 74: if (size > INT_MAX / size || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% 45: 75: size > INT_MAX / (size * sizeof(FLOAT32))) { #####: 76: return (Imaging) ImagingError_ValueError("filter size too large"); call 0 never executed -: 77: } -: 78: 45: 79: size2 = size * size; 45: 80: margin = (size-1) / 2; -: 81: 45: 82: if (rank < 0 || rank >= size2) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 83: return (Imaging) ImagingError_ValueError("bad rank value"); call 0 never executed -: 84: } -: 85: 45: 86: imOut = ImagingNew(im->mode, im->xsize - 2*margin, im->ysize - 2*margin); call 0 returned 100% 45: 87: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 88: return NULL; -: 89: } -: 90: -: 91: /* malloc check ok, checked above */ -: 92:#define RANK_BODY(type) do {\ -: 93: type* buf = malloc(size2 * sizeof(type));\ -: 94: if (!buf) {\ -: 95: goto nomemory;\ -: 96: }\ -: 97: for (y = 0; y < imOut->ysize; y++) {\ -: 98: for (x = 0; x < imOut->xsize; x++) {\ -: 99: for (i = 0; i < size; i++) {\ -: 100: memcpy(buf + i*size, &IMAGING_PIXEL_##type(im, x, y+i),\ -: 101: size * sizeof(type));\ -: 102: }\ -: 103: IMAGING_PIXEL_##type(imOut, x, y) = Rank##type(buf, size2, rank);\ -: 104: }\ -: 105: }\ -: 106: free(buf); \ -: 107:} while (0) -: 108: 45: 109: if (im->image8) { branch 0 taken 87% (fallthrough) branch 1 taken 13% 1180092: 110: RANK_BODY(UINT8); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 75% branch 3 taken 25% (fallthrough) call 4 returned 100% branch 5 taken 99% (fallthrough) branch 6 taken 1% branch 7 taken 99% (fallthrough) branch 8 taken 1% 6: 111: } else if (im->type == IMAGING_TYPE_INT32) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 84: 112: RANK_BODY(INT32); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 75% branch 3 taken 25% (fallthrough) call 4 returned 100% branch 5 taken 75% (fallthrough) branch 6 taken 25% branch 7 taken 75% (fallthrough) branch 8 taken 25% 3: 113: } else if (im->type == IMAGING_TYPE_FLOAT32) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 84: 114: RANK_BODY(FLOAT32); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 75% branch 3 taken 25% (fallthrough) call 4 returned 100% branch 5 taken 75% (fallthrough) branch 6 taken 25% branch 7 taken 75% (fallthrough) branch 8 taken 25% -: 115: } else { -: 116: /* safety net (we shouldn't end up here) */ #####: 117: ImagingDelete(imOut); call 0 never executed #####: 118: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 119: } -: 120: 45: 121: ImagingCopyPalette(imOut, im); call 0 returned 100% -: 122: 45: 123: return imOut; -: 124: -: 125:nomemory: #####: 126: ImagingDelete(imOut); call 0 never executed #####: 127: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 128:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Jpeg2KEncode.c.gcov -: 0:Source:src/libImaging/Jpeg2KEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Jpeg2KEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Jpeg2KEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for JPEG2000 image data. -: 6: * -: 7: * history: -: 8: * 2014-03-12 ajh Created -: 9: * -: 10: * Copyright (c) 2014 Coriolis Systems Limited -: 11: * Copyright (c) 2014 Alastair Houghton -: 12: * -: 13: * See the README file for details on usage and redistribution. -: 14: */ -: 15: -: 16:#include "Imaging.h" -: 17: -: 18:#ifdef HAVE_OPENJPEG -: 19: -: 20:#include "Jpeg2K.h" -: 21: -: 22:#define CINEMA_24_CS_LENGTH 1302083 -: 23:#define CINEMA_48_CS_LENGTH 651041 -: 24:#define COMP_24_CS_MAX_LENGTH 1041666 -: 25:#define COMP_48_CS_MAX_LENGTH 520833 -: 26: -: 27:/* -------------------------------------------------------------------- */ -: 28:/* Error handler */ -: 29:/* -------------------------------------------------------------------- */ -: 30: -: 31:static void function j2k_error called 1 returned 100% blocks executed 100% 1: 32:j2k_error(const char *msg, void *client_data) -: 33:{ 1: 34: JPEG2KENCODESTATE *state = (JPEG2KENCODESTATE *) client_data; 1: 35: free((void *)state->error_msg); 1: 36: state->error_msg = strdup(msg); call 0 returned 100% 1: 37:} -: 38: -: 39:static void function j2k_warn called 55 returned 100% blocks executed 100% 55: 40:j2k_warn(const char *msg, void *client_data) -: 41:{ -: 42: // Null handler 55: 43:} -: 44: -: 45:/* -------------------------------------------------------------------- */ -: 46:/* Buffer output stream */ -: 47:/* -------------------------------------------------------------------- */ -: 48: -: 49:static OPJ_SIZE_T function j2k_write called 40 returned 100% blocks executed 100% 40: 50:j2k_write(void *p_buffer, OPJ_SIZE_T p_nb_bytes, void *p_user_data) -: 51:{ 40: 52: ImagingCodecState state = (ImagingCodecState)p_user_data; -: 53: unsigned int result; -: 54: 40: 55: result = _imaging_write_pyFd(state->fd, p_buffer, p_nb_bytes); call 0 returned 100% -: 56: 40: 57: return result ? result : (OPJ_SIZE_T)-1; branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 58:} -: 59: -: 60: -: 61:static OPJ_OFF_T function j2k_skip called 14 returned 100% blocks executed 100% 14: 62:j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) -: 63:{ 14: 64: ImagingCodecState state = (ImagingCodecState)p_user_data; -: 65: char *buffer; -: 66: int result; -: 67: -: 68: /* Explicitly write zeros */ 14: 69: buffer = calloc(p_nb_bytes,1); 14: 70: if (!buffer) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 71: return (OPJ_OFF_T)-1; -: 72: } -: 73: 14: 74: result = _imaging_write_pyFd(state->fd, buffer, p_nb_bytes); call 0 returned 100% -: 75: 14: 76: free(buffer); -: 77: 14: 78: return result ? result : p_nb_bytes; branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 79:} -: 80: -: 81:static OPJ_BOOL function j2k_seek called 26 returned 100% blocks executed 100% 26: 82:j2k_seek(OPJ_OFF_T p_nb_bytes, void *p_user_data) -: 83:{ 26: 84: ImagingCodecState state = (ImagingCodecState)p_user_data; 26: 85: off_t pos = 0; -: 86: 26: 87: _imaging_seek_pyFd(state->fd, p_nb_bytes, SEEK_SET); call 0 returned 100% 26: 88: pos = _imaging_tell_pyFd(state->fd); call 0 returned 100% -: 89: 26: 90: return pos == p_nb_bytes; -: 91:} -: 92: -: 93:/* -------------------------------------------------------------------- */ -: 94:/* Encoder */ -: 95:/* -------------------------------------------------------------------- */ -: 96: -: 97:typedef void (*j2k_pack_tile_t)(Imaging im, UINT8 *buf, -: 98: unsigned x0, unsigned y0, -: 99: unsigned w, unsigned h); -: 100: -: 101:static void function j2k_pack_l called 0 returned 0% blocks executed 0% #####: 102:j2k_pack_l(Imaging im, UINT8 *buf, -: 103: unsigned x0, unsigned y0, unsigned w, unsigned h) -: 104:{ #####: 105: UINT8 *ptr = buf; -: 106: unsigned x,y; #####: 107: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 108: UINT8 *data = (UINT8 *)(im->image[y + y0] + x0); #####: 109: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 110: *ptr++ = *data++; -: 111: } -: 112: } #####: 113:} -: 114: -: 115:static void function j2k_pack_i16 called 2 returned 100% blocks executed 100% 2: 116:j2k_pack_i16(Imaging im, UINT8 *buf, -: 117: unsigned x0, unsigned y0, unsigned w, unsigned h) -: 118:{ 2: 119: UINT8 *ptr = buf; -: 120: unsigned x,y; 130: 121: for (y = 0; y < h; ++y) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 128: 122: UINT8 *data = (UINT8 *)(im->image[y + y0] + x0); 8320: 123: for (x = 0; x < w; ++x) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 8192: 124: *ptr++ = *data++; 8192: 125: *ptr++ = *data++; -: 126: } -: 127: } 2: 128:} -: 129: -: 130: -: 131:static void function j2k_pack_la called 0 returned 0% blocks executed 0% #####: 132:j2k_pack_la(Imaging im, UINT8 *buf, -: 133: unsigned x0, unsigned y0, unsigned w, unsigned h) -: 134:{ #####: 135: UINT8 *ptr = buf; #####: 136: UINT8 *ptra = buf + w * h; -: 137: unsigned x,y; #####: 138: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 139: UINT8 *data = (UINT8 *)(im->image[y + y0] + 4 * x0); #####: 140: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 141: *ptr++ = data[0]; #####: 142: *ptra++ = data[3]; #####: 143: data += 4; -: 144: } -: 145: } #####: 146:} -: 147: -: 148:static void function j2k_pack_rgb called 53 returned 100% blocks executed 100% 53: 149:j2k_pack_rgb(Imaging im, UINT8 *buf, -: 150: unsigned x0, unsigned y0, unsigned w, unsigned h) -: 151:{ 53: 152: UINT8 *pr = buf; 53: 153: UINT8 *pg = pr + w * h; 53: 154: UINT8 *pb = pg + w * h; -: 155: unsigned x,y; 9653: 156: for (y = 0; y < h; ++y) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 9600: 157: UINT8 *data = (UINT8 *)(im->image[y + y0] + 4 * x0); 3388800: 158: for (x = 0; x < w; ++x) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3379200: 159: *pr++ = data[0]; 3379200: 160: *pg++ = data[1]; 3379200: 161: *pb++ = data[2]; 3379200: 162: data += 4; -: 163: } -: 164: } 53: 165:} -: 166: -: 167:static void function j2k_pack_rgba called 0 returned 0% blocks executed 0% #####: 168:j2k_pack_rgba(Imaging im, UINT8 *buf, -: 169: unsigned x0, unsigned y0, unsigned w, unsigned h) -: 170:{ #####: 171: UINT8 *pr = buf; #####: 172: UINT8 *pg = pr + w * h; #####: 173: UINT8 *pb = pg + w * h; #####: 174: UINT8 *pa = pb + w * h; -: 175: unsigned x,y; #####: 176: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 177: UINT8 *data = (UINT8 *)(im->image[y + y0] + 4 * x0); #####: 178: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 179: *pr++ = *data++; #####: 180: *pg++ = *data++; #####: 181: *pb++ = *data++; #####: 182: *pa++ = *data++; -: 183: } -: 184: } #####: 185:} -: 186: -: 187:enum { -: 188: J2K_STATE_START = 0, -: 189: J2K_STATE_ENCODING = 1, -: 190: J2K_STATE_DONE = 2, -: 191: J2K_STATE_FAILED = 3, -: 192:}; -: 193: -: 194:static void function j2k_set_cinema_params.isra.0 called 0 returned 0% blocks executed 0% #####: 195:j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) -: 196:{ -: 197: float rate; -: 198: int n; -: 199: -: 200: /* These settings have been copied from opj_compress in the OpenJPEG -: 201: sources. */ -: 202: #####: 203: params->tile_size_on = OPJ_FALSE; #####: 204: params->cp_tdx = params->cp_tdy = 1; #####: 205: params->tp_flag = 'C'; #####: 206: params->tp_on = 1; #####: 207: params->cp_tx0 = params->cp_ty0 = 0; #####: 208: params->image_offset_x0 = params->image_offset_y0 = 0; #####: 209: params->cblockw_init = 32; #####: 210: params->cblockh_init = 32; #####: 211: params->csty |= 0x01; #####: 212: params->prog_order = OPJ_CPRL; #####: 213: params->roi_compno = -1; #####: 214: params->subsampling_dx = params->subsampling_dy = 1; #####: 215: params->irreversible = 1; -: 216: #####: 217: if (params->cp_cinema == OPJ_CINEMA4K_24) { branch 0 never executed branch 1 never executed #####: 218: float max_rate = ((float)(components * im->xsize * im->ysize * 8) -: 219: / (CINEMA_24_CS_LENGTH * 8)); -: 220: #####: 221: params->POC[0].tile = 1; #####: 222: params->POC[0].resno0 = 0; #####: 223: params->POC[0].compno0 = 0; #####: 224: params->POC[0].layno1 = 1; #####: 225: params->POC[0].resno1 = params->numresolution - 1; #####: 226: params->POC[0].compno1 = 3; #####: 227: params->POC[0].prg1 = OPJ_CPRL; #####: 228: params->POC[1].tile = 1; #####: 229: params->POC[1].resno0 = 0; #####: 230: params->POC[1].compno0 = 0; #####: 231: params->POC[1].layno1 = 1; #####: 232: params->POC[1].resno1 = params->numresolution - 1; #####: 233: params->POC[1].compno1 = 3; #####: 234: params->POC[1].prg1 = OPJ_CPRL; #####: 235: params->numpocs = 2; -: 236: #####: 237: for (n = 0; n < params->tcp_numlayers; ++n) { branch 0 never executed branch 1 never executed #####: 238: rate = 0; #####: 239: if (params->tcp_rates[0] == 0) { branch 0 never executed branch 1 never executed #####: 240: params->tcp_rates[n] = max_rate; -: 241: } else { #####: 242: rate = ((float)(components * im->xsize * im->ysize * 8) #####: 243: / (params->tcp_rates[n] * 8)); #####: 244: if (rate > CINEMA_24_CS_LENGTH) { branch 0 never executed branch 1 never executed #####: 245: params->tcp_rates[n] = max_rate; -: 246: } -: 247: } -: 248: } -: 249: #####: 250: params->max_comp_size = COMP_24_CS_MAX_LENGTH; -: 251: } else { #####: 252: float max_rate = ((float)(components * im->xsize * im->ysize * 8) -: 253: / (CINEMA_48_CS_LENGTH * 8)); -: 254: #####: 255: for (n = 0; n < params->tcp_numlayers; ++n) { branch 0 never executed branch 1 never executed #####: 256: rate = 0; #####: 257: if (params->tcp_rates[0] == 0) { branch 0 never executed branch 1 never executed #####: 258: params->tcp_rates[n] = max_rate; -: 259: } else { #####: 260: rate = ((float)(components * im->xsize * im->ysize * 8) #####: 261: / (params->tcp_rates[n] * 8)); #####: 262: if (rate > CINEMA_48_CS_LENGTH) { branch 0 never executed branch 1 never executed #####: 263: params->tcp_rates[n] = max_rate; -: 264: } -: 265: } -: 266: } -: 267: #####: 268: params->max_comp_size = COMP_48_CS_MAX_LENGTH; -: 269: } #####: 270:} -: 271: -: 272:static int function j2k_encode_entry called 14 returned 100% blocks executed 76% 14: 273:j2k_encode_entry(Imaging im, ImagingCodecState state) -: 274:{ 14: 275: JPEG2KENCODESTATE *context = (JPEG2KENCODESTATE *)state->context; 14: 276: opj_stream_t *stream = NULL; 14: 277: opj_image_t *image = NULL; 14: 278: opj_codec_t *codec = NULL; -: 279: opj_cparameters_t params; -: 280: unsigned components; -: 281: OPJ_COLOR_SPACE color_space; -: 282: opj_image_cmptparm_t image_params[4]; -: 283: unsigned xsiz, ysiz; -: 284: unsigned tile_width, tile_height; -: 285: unsigned tiles_x, tiles_y; -: 286: unsigned x, y, tile_ndx; -: 287: unsigned n; -: 288: j2k_pack_tile_t pack; 14: 289: int ret = -1; -: 290: 14: 291: unsigned prec = 8; 14: 292: unsigned bpp = 8; -: 293: unsigned _overflow_scale_factor; -: 294: 14: 295: stream = opj_stream_create(BUFFER_SIZE, OPJ_FALSE); call 0 returned 100% -: 296: 14: 297: if (!stream) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 298: state->errcode = IMAGING_CODEC_BROKEN; #####: 299: state->state = J2K_STATE_FAILED; #####: 300: goto quick_exit; -: 301: } -: 302: 14: 303: opj_stream_set_write_function(stream, j2k_write); call 0 returned 100% 14: 304: opj_stream_set_skip_function(stream, j2k_skip); call 0 returned 100% 14: 305: opj_stream_set_seek_function(stream, j2k_seek); call 0 returned 100% -: 306: -: 307: /* OpenJPEG 2.0 doesn't have OPJ_VERSION_MAJOR */ -: 308:#ifndef OPJ_VERSION_MAJOR -: 309: opj_stream_set_user_data(stream, state); -: 310:#else 14: 311: opj_stream_set_user_data(stream, state, NULL); call 0 returned 100% -: 312:#endif -: 313: -: 314: /* Setup an opj_image */ 14: 315: if (strcmp (im->mode, "L") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 316: components = 1; -: 317: color_space = OPJ_CLRSPC_GRAY; -: 318: pack = j2k_pack_l; 14: 319: } else if (strcmp (im->mode, "I;16") == 0){ branch 0 taken 86% (fallthrough) branch 1 taken 14% -: 320: components = 1; -: 321: color_space = OPJ_CLRSPC_GRAY; -: 322: pack = j2k_pack_i16; -: 323: prec = 16; -: 324: bpp = 12; 12: 325: } else if (strcmp (im->mode, "I;16B") == 0){ branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 326: components = 1; -: 327: color_space = OPJ_CLRSPC_GRAY; -: 328: pack = j2k_pack_i16; -: 329: prec = 16; -: 330: bpp = 12; 12: 331: } else if (strcmp (im->mode, "LA") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 332: components = 2; -: 333: color_space = OPJ_CLRSPC_GRAY; -: 334: pack = j2k_pack_la; 12: 335: } else if (strcmp (im->mode, "RGB") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% -: 336: components = 3; -: 337: color_space = OPJ_CLRSPC_SRGB; -: 338: pack = j2k_pack_rgb; #####: 339: } else if (strcmp (im->mode, "YCbCr") == 0) { branch 0 never executed branch 1 never executed -: 340: components = 3; -: 341: color_space = OPJ_CLRSPC_SYCC; -: 342: pack = j2k_pack_rgb; #####: 343: } else if (strcmp (im->mode, "RGBA") == 0) { branch 0 never executed branch 1 never executed -: 344: components = 4; -: 345: color_space = OPJ_CLRSPC_SRGB; -: 346: pack = j2k_pack_rgba; -: 347: } else { #####: 348: state->errcode = IMAGING_CODEC_BROKEN; #####: 349: state->state = J2K_STATE_FAILED; #####: 350: goto quick_exit; -: 351: } -: 352: 52: 353: for (n = 0; n < components; ++n) { branch 0 taken 73% branch 1 taken 27% (fallthrough) 38: 354: image_params[n].dx = image_params[n].dy = 1; 38: 355: image_params[n].w = im->xsize; 38: 356: image_params[n].h = im->ysize; 38: 357: image_params[n].x0 = image_params[n].y0 = 0; 38: 358: image_params[n].prec = prec; 38: 359: image_params[n].bpp = bpp; 38: 360: image_params[n].sgnd = 0; -: 361: } -: 362: 14: 363: image = opj_image_create(components, image_params, color_space); call 0 returned 100% 14: 364: if (!image) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 365: state->errcode = IMAGING_CODEC_BROKEN; #####: 366: state->state = J2K_STATE_FAILED; #####: 367: goto quick_exit; -: 368: } -: 369: -: 370: /* Setup compression context */ 14: 371: context->error_msg = NULL; -: 372: 14: 373: opj_set_default_encoder_parameters(¶ms); call 0 returned 100% -: 374: 14: 375: params.image_offset_x0 = context->offset_x; 14: 376: params.image_offset_y0 = context->offset_y; -: 377: 14: 378: if (context->tile_size_x && context->tile_size_y) { branch 0 taken 14% (fallthrough) branch 1 taken 86% branch 2 taken 100% (fallthrough) branch 3 taken 0% 2: 379: params.tile_size_on = OPJ_TRUE; 2: 380: params.cp_tx0 = context->tile_offset_x; 2: 381: params.cp_ty0 = context->tile_offset_y; 2: 382: params.cp_tdx = context->tile_size_x; 2: 383: params.cp_tdy = context->tile_size_y; -: 384: 2: 385: tile_width = params.cp_tdx; 2: 386: tile_height = params.cp_tdy; -: 387: } else { 12: 388: params.cp_tx0 = 0; 12: 389: params.cp_ty0 = 0; 12: 390: params.cp_tdx = 1; 12: 391: params.cp_tdy = 1; -: 392: 12: 393: tile_width = im->xsize; 12: 394: tile_height = im->ysize; -: 395: } -: 396: 14: 397: if (context->quality_layers && PySequence_Check(context->quality_layers)) { branch 0 taken 43% (fallthrough) branch 1 taken 57% call 2 returned 100% branch 3 taken 100% (fallthrough) branch 4 taken 0% 6: 398: Py_ssize_t len = PySequence_Length(context->quality_layers); call 0 returned 100% -: 399: Py_ssize_t n; -: 400: float *pq; -: 401: 6: 402: if (len > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 403: if ((unsigned)len > sizeof(params.tcp_rates) / sizeof(params.tcp_rates[0])) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 404: len = sizeof(params.tcp_rates)/sizeof(params.tcp_rates[0]); -: 405: } -: 406: 6: 407: params.tcp_numlayers = (int)len; -: 408: 6: 409: if (context->quality_is_in_db) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 410: params.cp_disto_alloc = params.cp_fixed_alloc = 0; #####: 411: params.cp_fixed_quality = 1; #####: 412: pq = params.tcp_distoratio; -: 413: } else { 6: 414: params.cp_disto_alloc = 1; 6: 415: params.cp_fixed_alloc = params.cp_fixed_quality = 0; 6: 416: pq = params.tcp_rates; -: 417: } -: 418: 20: 419: for (n = 0; n < len; ++n) { branch 0 taken 70% branch 1 taken 30% 14: 420: PyObject *obj = PySequence_ITEM(context->quality_layers, n); call 0 returned 100% 14: 421: pq[n] = PyFloat_AsDouble(obj); call 0 returned 100% -: 422: } -: 423: } -: 424: } else { 8: 425: params.tcp_numlayers = 1; 8: 426: params.tcp_rates[0] = 0; 8: 427: params.cp_disto_alloc = 1; -: 428: } -: 429: 14: 430: if (context->num_resolutions) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 1: 431: params.numresolution = context->num_resolutions; -: 432: } -: 433: 14: 434: if (context->cblk_width >= 4 && context->cblk_width <= 1024 branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 435: && context->cblk_height >= 4 && context->cblk_height <= 1024 branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 436: && context->cblk_width * context->cblk_height <= 4096) { branch 0 never executed branch 1 never executed #####: 437: params.cblockw_init = context->cblk_width; #####: 438: params.cblockh_init = context->cblk_height; -: 439: } -: 440: 14: 441: if (context->precinct_width >= 4 && context->precinct_height >= 4 branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed #####: 442: && context->precinct_width >= context->cblk_width branch 0 never executed branch 1 never executed #####: 443: && context->precinct_height > context->cblk_height) { branch 0 never executed branch 1 never executed #####: 444: params.prcw_init[0] = context->precinct_width; #####: 445: params.prch_init[0] = context->precinct_height; #####: 446: params.res_spec = 1; #####: 447: params.csty |= 0x01; -: 448: } -: 449: 14: 450: params.irreversible = context->irreversible; -: 451: 14: 452: params.prog_order = context->progression; -: 453: 14: 454: params.cp_cinema = context->cinema_mode; -: 455: 14: 456: switch (params.cp_cinema) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% -: 457: case OPJ_OFF: 14: 458: params.cp_rsiz = OPJ_STD_RSIZ; 14: 459: break; -: 460: case OPJ_CINEMA2K_24: -: 461: case OPJ_CINEMA2K_48: #####: 462: params.cp_rsiz = OPJ_CINEMA2K; #####: 463: if (params.numresolution > 6) { branch 0 never executed branch 1 never executed #####: 464: params.numresolution = 6; -: 465: } -: 466: break; -: 467: case OPJ_CINEMA4K_24: #####: 468: params.cp_rsiz = OPJ_CINEMA4K; #####: 469: if (params.numresolution > 7) { branch 0 never executed branch 1 never executed #####: 470: params.numresolution = 7; -: 471: } -: 472: break; -: 473: } -: 474: 14: 475: if (context->cinema_mode != OPJ_OFF) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 476: j2k_set_cinema_params(im, components, ¶ms); call 0 never executed -: 477: } -: 478: -: 479: /* Set up the reference grid in the image */ 14: 480: image->x0 = params.image_offset_x0; 14: 481: image->y0 = params.image_offset_y0; 14: 482: image->x1 = xsiz = im->xsize + params.image_offset_x0; 14: 483: image->y1 = ysiz = im->ysize + params.image_offset_y0; -: 484: -: 485: /* Create the compressor */ 14: 486: codec = opj_create_compress(context->format); call 0 returned 100% -: 487: 14: 488: if (!codec) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 489: state->errcode = IMAGING_CODEC_BROKEN; #####: 490: state->state = J2K_STATE_FAILED; #####: 491: goto quick_exit; -: 492: } -: 493: 14: 494: opj_set_error_handler(codec, j2k_error, context); call 0 returned 100% 14: 495: opj_set_info_handler(codec, j2k_warn, context); call 0 returned 100% 14: 496: opj_set_warning_handler(codec, j2k_warn, context); call 0 returned 100% 14: 497: opj_setup_encoder(codec, ¶ms, image); call 0 returned 100% -: 498: -: 499: /* Start encoding */ 14: 500: if (!opj_start_compress(codec, image, stream)) { call 0 returned 100% branch 1 taken 7% (fallthrough) branch 2 taken 93% 1: 501: state->errcode = IMAGING_CODEC_BROKEN; 1: 502: state->state = J2K_STATE_FAILED; 1: 503: goto quick_exit; -: 504: } -: 505: -: 506: /* Write each tile */ 26: 507: tiles_x = (im->xsize + (params.image_offset_x0 - params.cp_tx0) 13: 508: + tile_width - 1) / tile_width; 26: 509: tiles_y = (im->ysize + (params.image_offset_y0 - params.cp_ty0) 13: 510: + tile_height - 1) / tile_height; -: 511: -: 512: /* check for integer overflow for the malloc line, checking any expression -: 513: that may multiply either tile_width or tile_height */ 13: 514: _overflow_scale_factor = components * prec; 13: 515: if (( tile_width > UINT_MAX / _overflow_scale_factor ) || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 13: 516: ( tile_height > UINT_MAX / _overflow_scale_factor ) || branch 0 taken 100% (fallthrough) branch 1 taken 0% 26: 517: ( tile_width > UINT_MAX / (tile_height * _overflow_scale_factor )) || branch 0 taken 0% (fallthrough) branch 1 taken 100% 13: 518: ( tile_height > UINT_MAX / (tile_width * _overflow_scale_factor ))) { #####: 519: state->errcode = IMAGING_CODEC_BROKEN; #####: 520: state->state = J2K_STATE_FAILED; #####: 521: goto quick_exit; -: 522: } -: 523: /* malloc check ok, checked for overflow above */ 13: 524: state->buffer = malloc (tile_width * tile_height * components * prec / 8); 13: 525: if (!state->buffer) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 526: state->errcode = IMAGING_CODEC_BROKEN; #####: 527: state->state = J2K_STATE_FAILED; #####: 528: goto quick_exit; -: 529: } -: 530: -: 531: tile_ndx = 0; 19: 532: for (y = 0; y < tiles_y; ++y) { branch 0 taken 59% branch 1 taken 41% (fallthrough) 19: 533: int ty0 = params.cp_ty0 + y * tile_height; 19: 534: unsigned ty1 = ty0 + tile_height; -: 535: unsigned pixy, pixh; -: 536: 19: 537: if (ty0 < params.image_offset_y0) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 1: 538: ty0 = params.image_offset_y0; -: 539: } 19: 540: if (ty1 > ysiz) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 1: 541: ty1 = ysiz; -: 542: } -: 543: 19: 544: pixy = ty0 - params.image_offset_y0; 19: 545: pixh = ty1 - ty0; -: 546: 74: 547: for (x = 0; x < tiles_x; ++x) { branch 0 taken 74% branch 1 taken 26% (fallthrough) 55: 548: int tx0 = params.cp_tx0 + x * tile_width; 55: 549: unsigned tx1 = tx0 + tile_width; -: 550: unsigned pixx, pixw; -: 551: unsigned data_size; -: 552: 55: 553: if (tx0 < params.image_offset_x0) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 4: 554: tx0 = params.image_offset_x0; -: 555: } 55: 556: if (tx1 > xsiz) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 4: 557: tx1 = xsiz; -: 558: } -: 559: 55: 560: pixx = tx0 - params.image_offset_x0; 55: 561: pixw = tx1 - tx0; -: 562: 55: 563: pack(im, state->buffer, pixx, pixy, pixw, pixh); call 0 returned 100% -: 564: 55: 565: data_size = pixw * pixh * components * prec / 8; -: 566: 55: 567: if (!opj_write_tile(codec, tile_ndx++, state->buffer, call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 568: data_size, stream)) { #####: 569: state->errcode = IMAGING_CODEC_BROKEN; #####: 570: state->state = J2K_STATE_FAILED; #####: 571: goto quick_exit; -: 572: } -: 573: } -: 574: } -: 575: 13: 576: if (!opj_end_compress(codec, stream)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 577: state->errcode = IMAGING_CODEC_BROKEN; #####: 578: state->state = J2K_STATE_FAILED; #####: 579: goto quick_exit; -: 580: } -: 581: 13: 582: state->errcode = IMAGING_CODEC_END; 13: 583: state->state = J2K_STATE_DONE; 13: 584: ret = -1; -: 585: -: 586: quick_exit: 14: 587: if (codec) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 14: 588: opj_destroy_codec(codec); call 0 returned 100% -: 589: } 14: 590: if (image) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 14: 591: opj_image_destroy(image); call 0 returned 100% -: 592: } 14: 593: if (stream) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 14: 594: opj_stream_destroy(stream); call 0 returned 100% -: 595: } -: 596: 14: 597: return ret; -: 598:} -: 599: -: 600:int function ImagingJpeg2KEncode called 14 returned 100% blocks executed 100% 14: 601:ImagingJpeg2KEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) -: 602:{ 14: 603: if (state->state == J2K_STATE_FAILED) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 604: return -1; -: 605: } -: 606: 14: 607: if (state->state == J2K_STATE_START) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 608: 14: 609: state->state = J2K_STATE_ENCODING; -: 610: 14: 611: return j2k_encode_entry(im, state); call 0 returned 100% -: 612: } -: 613: -: 614: return -1; -: 615:} -: 616: -: 617:/* -------------------------------------------------------------------- */ -: 618:/* Cleanup */ -: 619:/* -------------------------------------------------------------------- */ -: 620: -: 621:int function ImagingJpeg2KEncodeCleanup called 28 returned 100% blocks executed 88% 28: 622:ImagingJpeg2KEncodeCleanup(ImagingCodecState state) { 28: 623: JPEG2KENCODESTATE *context = (JPEG2KENCODESTATE *)state->context; -: 624: 28: 625: if (context->quality_layers) { branch 0 taken 21% (fallthrough) branch 1 taken 79% 6: 626: Py_XDECREF(context->quality_layers); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% call 4 never executed 6: 627: context->quality_layers = NULL; -: 628: } -: 629: 28: 630: if (context->error_msg) { branch 0 taken 4% (fallthrough) branch 1 taken 96% 1: 631: free ((void *)context->error_msg); -: 632: } -: 633: 28: 634: context->error_msg = NULL; -: 635: -: 636: 28: 637: return -1; -: 638:} -: 639: -: 640:#endif /* HAVE_OPENJPEG */ -: 641: -: 642:/* -: 643: * Local Variables: -: 644: * c-basic-offset: 4 -: 645: * End: -: 646: * -: 647: */ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#TgaRleDecode.c.gcov -: 0:Source:src/libImaging/TgaRleDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/TgaRleDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/TgaRleDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for Targa RLE data. -: 6: * -: 7: * history: -: 8: * 97-01-04 fl created -: 9: * 98-09-11 fl don't one byte per pixel; take orientation into account -: 10: * -: 11: * Copyright (c) Fredrik Lundh 1997. -: 12: * Copyright (c) Secret Labs AB 1997-98. -: 13: * -: 14: * See the README file for information on usage and redistribution. -: 15: */ -: 16: -: 17: -: 18:#include "Imaging.h" -: 19: -: 20: -: 21:int function ImagingTgaRleDecode called 33 returned 100% blocks executed 90% 33: 22:ImagingTgaRleDecode(Imaging im, ImagingCodecState state, -: 23: UINT8* buf, Py_ssize_t bytes) -: 24:{ -: 25: int n, depth; -: 26: UINT8* ptr; -: 27: 33: 28: ptr = buf; -: 29: 33: 30: if (state->state == 0) { branch 0 taken 91% (fallthrough) branch 1 taken 9% -: 31: -: 32: /* check image orientation */ 30: 33: if (state->ystep < 0) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 15: 34: state->y = state->ysize-1; 15: 35: state->ystep = -1; -: 36: } else { 15: 37: state->ystep = 1; -: 38: } -: 39: 30: 40: state->state = 1; -: 41: -: 42: } -: 43: 33: 44: depth = state->count; -: 45: -: 46: for (;;) { -: 47: 24577: 48: if (bytes < 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 49: return ptr - buf; -: 50: } -: 51: 24577: 52: if (ptr[0] & 0x80) { branch 0 taken 52% (fallthrough) branch 1 taken 48% -: 53: -: 54: /* Run (1 + pixelsize bytes) */ -: 55: 12885: 56: if (bytes < 1 + depth) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 57: break; -: 58: } -: 59: 12885: 60: n = depth * ((ptr[0] & 0x7f) + 1); -: 61: 12885: 62: if (state->x + n > state->bytes) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 63: state->errcode = IMAGING_CODEC_OVERRUN; #####: 64: return -1; -: 65: } -: 66: 12885: 67: if (depth == 1) { branch 0 taken 62% (fallthrough) branch 1 taken 38% 4948: 68: memset(state->buffer + state->x, ptr[1], n); -: 69: } else { -: 70: int i; 35423: 71: for (i = 0; i < n; i += depth) { branch 0 taken 82% branch 1 taken 18% (fallthrough) 70846: 72: memcpy(state->buffer + state->x + i, ptr+1, depth); -: 73: } -: 74: } -: 75: 12885: 76: ptr += 1 + depth; 12885: 77: bytes -= 1 + depth; -: 78: -: 79: } else { -: 80: -: 81: /* Literal (1+n+1 bytes block) */ 11692: 82: n = depth * (ptr[0] + 1); -: 83: 11692: 84: if (bytes < 1 + n) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 85: break; -: 86: } -: 87: 11689: 88: if (state->x + n > state->bytes) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 89: state->errcode = IMAGING_CODEC_OVERRUN; #####: 90: return -1; -: 91: } -: 92: 23378: 93: memcpy(state->buffer + state->x, ptr + 1, n); -: 94: 11689: 95: ptr += 1 + n; 11689: 96: bytes -= 1 + n; -: 97: -: 98: } -: 99: 24574: 100: state->x += n; -: 101: 24574: 102: if (state->x >= state->bytes) { branch 0 taken 94% branch 1 taken 6% (fallthrough) -: 103: -: 104: /* Got a full line, unpack it */ 4203: 105: state->shuffle((UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 2802: 106: state->xoff * im->pixelsize, state->buffer, -: 107: state->xsize); -: 108: 1401: 109: state->x = 0; -: 110: 1401: 111: state->y += state->ystep; -: 112: 1401: 113: if (state->y < 0 || state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% branch 3 taken 1% -: 114: /* End of file (errcode = 0) */ -: 115: return -1; -: 116: } -: 117: -: 118: } -: 119: -: 120: } -: 121: 3: 122: return ptr - buf; -: 123:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#outline.c.gcov -: 0:Source:src/outline.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/outline.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/outline.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * THIS IS WORK IN PROGRESS. -: 3: * -: 4: * The Python Imaging Library. -: 5: * -: 6: * "arrow" outline stuff. the contents of this module -: 7: * will be merged with the path module and the rest of -: 8: * the arrow graphics package, but not before PIL 1.1. -: 9: * use at your own risk. -: 10: * -: 11: * history: -: 12: * 99-01-10 fl Added to PIL (experimental) -: 13: * -: 14: * Copyright (c) Secret Labs AB 1999. -: 15: * Copyright (c) Fredrik Lundh 1999. -: 16: * -: 17: * See the README file for information on usage and redistribution. -: 18: */ -: 19: -: 20:#include "Python.h" -: 21: -: 22:#include "libImaging/Imaging.h" -: 23: -: 24: -: 25:/* -------------------------------------------------------------------- */ -: 26:/* Class */ -: 27: -: 28:typedef struct { -: 29: PyObject_HEAD -: 30: ImagingOutline outline; -: 31:} OutlineObject; -: 32: -: 33:static PyTypeObject OutlineType; -: 34: -: 35:#define PyOutline_Check(op) (Py_TYPE(op) == &OutlineType) -: 36: -: 37:static OutlineObject* function _outline_new called 3 returned 100% blocks executed 100% 3: 38:_outline_new(void) -: 39:{ -: 40: OutlineObject *self; -: 41: 3: 42: if (PyType_Ready(&OutlineType) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 43: return NULL; -: 44: } -: 45: 3: 46: self = PyObject_New(OutlineObject, &OutlineType); call 0 returned 100% 3: 47: if (self == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 48: return NULL; -: 49: } -: 50: 3: 51: self->outline = ImagingOutlineNew(); call 0 returned 100% -: 52: 3: 53: return self; -: 54:} -: 55: -: 56:static void function _outline_dealloc called 3 returned 100% blocks executed 100% 3: 57:_outline_dealloc(OutlineObject* self) -: 58:{ 3: 59: ImagingOutlineDelete(self->outline); call 0 returned 100% 3: 60: PyObject_Del(self); call 0 returned 100% 3: 61:} -: 62: -: 63:ImagingOutline function PyOutline_AsOutline called 8 returned 100% blocks executed 100% 8: 64:PyOutline_AsOutline(PyObject* outline) -: 65:{ 8: 66: if (PyOutline_Check(outline)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 8: 67: return ((OutlineObject*) outline)->outline; -: 68: } -: 69: -: 70: return NULL; -: 71:} -: 72: -: 73: -: 74:/* -------------------------------------------------------------------- */ -: 75:/* Factories */ -: 76: -: 77:PyObject* function PyOutline_Create called 3 returned 100% blocks executed 100% 3: 78:PyOutline_Create(PyObject* self, PyObject* args) -: 79:{ 3: 80: if (!PyArg_ParseTuple(args, ":outline")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 81: return NULL; -: 82: } -: 83: 3: 84: return (PyObject*) _outline_new(); call 0 returned 100% -: 85:} -: 86: -: 87: -: 88:/* -------------------------------------------------------------------- */ -: 89:/* Methods */ -: 90: -: 91:static PyObject* function _outline_move called 3 returned 100% blocks executed 100% 3: 92:_outline_move(OutlineObject* self, PyObject* args) -: 93:{ -: 94: float x0, y0; 3: 95: if (!PyArg_ParseTuple(args, "ff", &x0, &y0)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 96: return NULL; -: 97: } -: 98: 3: 99: ImagingOutlineMove(self->outline, x0, y0); call 0 returned 100% -: 100: 3: 101: Py_INCREF(Py_None); 3: 102: return Py_None; -: 103:} -: 104: -: 105:static PyObject* function _outline_line called 3 returned 100% blocks executed 100% 3: 106:_outline_line(OutlineObject* self, PyObject* args) -: 107:{ -: 108: float x1, y1; 3: 109: if (!PyArg_ParseTuple(args, "ff", &x1, &y1)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 110: return NULL; -: 111: } -: 112: 3: 113: ImagingOutlineLine(self->outline, x1, y1); call 0 returned 100% -: 114: 3: 115: Py_INCREF(Py_None); 3: 116: return Py_None; -: 117:} -: 118: -: 119:static PyObject* function _outline_curve called 3 returned 100% blocks executed 100% 3: 120:_outline_curve(OutlineObject* self, PyObject* args) -: 121:{ -: 122: float x1, y1, x2, y2, x3, y3; 3: 123: if (!PyArg_ParseTuple(args, "ffffff", &x1, &y1, &x2, &y2, &x3, &y3)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 124: return NULL; -: 125: } -: 126: 3: 127: ImagingOutlineCurve(self->outline, x1, y1, x2, y2, x3, y3); call 0 returned 100% -: 128: 3: 129: Py_INCREF(Py_None); 3: 130: return Py_None; -: 131:} -: 132: -: 133:static PyObject* function _outline_close called 8 returned 100% blocks executed 100% 8: 134:_outline_close(OutlineObject* self, PyObject* args) -: 135:{ 8: 136: if (!PyArg_ParseTuple(args, ":close")) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 137: return NULL; -: 138: } -: 139: 8: 140: ImagingOutlineClose(self->outline); call 0 returned 100% -: 141: 8: 142: Py_INCREF(Py_None); 8: 143: return Py_None; -: 144:} -: 145: -: 146:static PyObject* function _outline_transform called 0 returned 0% blocks executed 0% #####: 147:_outline_transform(OutlineObject* self, PyObject* args) -: 148:{ -: 149: double a[6]; #####: 150: if (!PyArg_ParseTuple(args, "(dddddd)", a+0, a+1, a+2, a+3, a+4, a+5)) { call 0 never executed branch 1 never executed branch 2 never executed -: 151: return NULL; -: 152: } -: 153: #####: 154: ImagingOutlineTransform(self->outline, a); call 0 never executed -: 155: #####: 156: Py_INCREF(Py_None); #####: 157: return Py_None; -: 158:} -: 159: -: 160:static struct PyMethodDef _outline_methods[] = { -: 161: {"line", (PyCFunction)_outline_line, 1}, -: 162: {"curve", (PyCFunction)_outline_curve, 1}, -: 163: {"move", (PyCFunction)_outline_move, 1}, -: 164: {"close", (PyCFunction)_outline_close, 1}, -: 165: {"transform", (PyCFunction)_outline_transform, 1}, -: 166: {NULL, NULL} /* sentinel */ -: 167:}; -: 168: -: 169:static PyTypeObject OutlineType = { -: 170: PyVarObject_HEAD_INIT(NULL, 0) -: 171: "Outline", /*tp_name*/ -: 172: sizeof(OutlineObject), /*tp_size*/ -: 173: 0, /*tp_itemsize*/ -: 174: /* methods */ -: 175: (destructor)_outline_dealloc,/*tp_dealloc*/ -: 176: 0, /*tp_print*/ -: 177: 0, /*tp_getattr*/ -: 178: 0, /*tp_setattr*/ -: 179: 0, /*tp_compare*/ -: 180: 0, /*tp_repr*/ -: 181: 0, /*tp_as_number */ -: 182: 0, /*tp_as_sequence */ -: 183: 0, /*tp_as_mapping */ -: 184: 0, /*tp_hash*/ -: 185: 0, /*tp_call*/ -: 186: 0, /*tp_str*/ -: 187: 0, /*tp_getattro*/ -: 188: 0, /*tp_setattro*/ -: 189: 0, /*tp_as_buffer*/ -: 190: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 191: 0, /*tp_doc*/ -: 192: 0, /*tp_traverse*/ -: 193: 0, /*tp_clear*/ -: 194: 0, /*tp_richcompare*/ -: 195: 0, /*tp_weaklistoffset*/ -: 196: 0, /*tp_iter*/ -: 197: 0, /*tp_iternext*/ -: 198: _outline_methods, /*tp_methods*/ -: 199: 0, /*tp_members*/ -: 200: 0, /*tp_getset*/ -: 201:}; <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#QuantOctree.c.gcov -: 0:Source:src/libImaging/QuantOctree.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/QuantOctree.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/QuantOctree.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* Copyright (c) 2010 Oliver Tonnhofer , Omniscale -: 2:// -: 3:// Permission is hereby granted, free of charge, to any person obtaining a copy -: 4:// of this software and associated documentation files (the "Software"), to deal -: 5:// in the Software without restriction, including without limitation the rights -: 6:// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -: 7:// copies of the Software, and to permit persons to whom the Software is -: 8:// furnished to do so, subject to the following conditions: -: 9:// -: 10:// The above copyright notice and this permission notice shall be included in -: 11:// all copies or substantial portions of the Software. -: 12:// -: 13:// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -: 14:// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -: 15:// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -: 16:// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -: 17:// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -: 18:// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -: 19:// THE SOFTWARE. -: 20:*/ -: 21: -: 22:/* -: 23:// This file implements a variation of the octree color quantization algorithm. -: 24:*/ -: 25: -: 26:#include -: 27:#include -: 28:#include -: 29:#include -: 30: -: 31:#include "ImagingUtils.h" -: 32:#include "QuantOctree.h" -: 33: -: 34:typedef struct _ColorBucket{ -: 35: /* contains palette index when used for look up cube */ -: 36: uint32_t count; -: 37: uint64_t r; -: 38: uint64_t g; -: 39: uint64_t b; -: 40: uint64_t a; -: 41:} *ColorBucket; -: 42: -: 43:typedef struct _ColorCube{ -: 44: unsigned int rBits, gBits, bBits, aBits; -: 45: unsigned int rWidth, gWidth, bWidth, aWidth; -: 46: unsigned int rOffset, gOffset, bOffset, aOffset; -: 47: -: 48: unsigned long size; -: 49: ColorBucket buckets; -: 50:} *ColorCube; -: 51: -: 52:#define MAX(a, b) (a)>(b) ? (a) : (b) -: 53: -: 54:static ColorCube function new_color_cube called 48 returned 100% blocks executed 67% 48: 55:new_color_cube(int r, int g, int b, int a) { -: 56: ColorCube cube; -: 57: -: 58: /* malloc check ok, small constant allocation */ 48: 59: cube = malloc(sizeof(struct _ColorCube)); 48: 60: if (!cube) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 61: return NULL; -: 62: } -: 63: 48: 64: cube->rBits = MAX(r, 0); 48: 65: cube->gBits = MAX(g, 0); 48: 66: cube->bBits = MAX(b, 0); 48: 67: cube->aBits = MAX(a, 0); -: 68: -: 69: /* overflow check for size multiplication below */ 48: 70: if (cube->rBits + cube->gBits + cube->bBits + cube->aBits > 31) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 71: free(cube); #####: 72: return NULL; -: 73: } -: 74: -: 75: /* the width of the cube for each dimension */ 48: 76: cube->rWidth = 1<rBits; 48: 77: cube->gWidth = 1<gBits; 48: 78: cube->bWidth = 1<bBits; 48: 79: cube->aWidth = 1<aBits; -: 80: -: 81: /* the offsets of each color */ -: 82: 48: 83: cube->rOffset = cube->gBits + cube->bBits + cube->aBits; 48: 84: cube->gOffset = cube->bBits + cube->aBits; 48: 85: cube->bOffset = cube->aBits; 48: 86: cube->aOffset = 0; -: 87: -: 88: /* the number of color buckets */ 48: 89: cube->size = cube->rWidth * cube->gWidth * cube->bWidth * cube->aWidth; -: 90: /* malloc check ok, overflow checked above */ 48: 91: cube->buckets = calloc(cube->size, sizeof(struct _ColorBucket)); -: 92: 48: 93: if (!cube->buckets) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 94: free(cube); #####: 95: return NULL; -: 96: } -: 97: return cube; -: 98:} -: 99: -: 100:static void function free_color_cube called 48 returned 100% blocks executed 100% 48: 101:free_color_cube(ColorCube cube) { 48: 102: if (cube != NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 48: 103: free(cube->buckets); 48: 104: free(cube); -: 105: } 48: 106:} -: 107: -: 108:static long -: 109:color_bucket_offset_pos(const ColorCube cube, -: 110: unsigned int r, unsigned int g, unsigned int b, unsigned int a) -: 111:{ 784922: 112: return r<rOffset | g<gOffset | b<bOffset | a<aOffset; -: 113:} -: 114: -: 115:static long function color_bucket_offset called 408090 returned 100% blocks executed 100% 408090: 116:color_bucket_offset(const ColorCube cube, const Pixel *p) { 408090: 117: unsigned int r = p->c.r>>(8-cube->rBits); 408090: 118: unsigned int g = p->c.g>>(8-cube->gBits); 408090: 119: unsigned int b = p->c.b>>(8-cube->bBits); 408090: 120: unsigned int a = p->c.a>>(8-cube->aBits); 816180: 121: return color_bucket_offset_pos(cube, r, g, b, a); -: 122:} -: 123: -: 124:static ColorBucket -: 125:color_bucket_from_cube(const ColorCube cube, const Pixel *p) { 408090: 126: unsigned int offset = color_bucket_offset(cube, p); call 0 returned 100% call 1 returned 100% call 2 returned 100% call 3 returned 100% 408090: 127: return &cube->buckets[offset]; -: 128:} -: 129: -: 130:static void function add_color_to_color_cube called 202069 returned 100% blocks executed 100% 202069: 131:add_color_to_color_cube(const ColorCube cube, const Pixel *p) { 202069: 132: ColorBucket bucket = color_bucket_from_cube(cube, p); 202069: 133: bucket->count += 1; 202069: 134: bucket->r += p->c.r; 202069: 135: bucket->g += p->c.g; 202069: 136: bucket->b += p->c.b; 202069: 137: bucket->a += p->c.a; 202069: 138:} -: 139: -: 140:static unsigned long -: 141:count_used_color_buckets(const ColorCube cube) { -: 142: unsigned long usedBuckets = 0; -: 143: unsigned long i; 14464: 144: for (i=0; i < cube->size; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) branch 4 taken 99% branch 5 taken 1% (fallthrough) 14464: 145: if (cube->buckets[i].count > 0) { branch 0 taken 8% (fallthrough) branch 1 taken 92% branch 2 taken 6% (fallthrough) branch 3 taken 94% branch 4 taken 6% (fallthrough) branch 5 taken 94% 957: 146: usedBuckets += 1; -: 147: } -: 148: } -: 149: return usedBuckets; -: 150:} -: 151: -: 152:static void function avg_color_from_color_bucket called 6868 returned 100% blocks executed 100% 6868: 153:avg_color_from_color_bucket(const ColorBucket bucket, Pixel *dst) { 6868: 154: float count = bucket->count; 6868: 155: if (count != 0) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 3450: 156: dst->c.r = CLIP8((int)(bucket->r / count)); branch 0 taken 99% (fallthrough) branch 1 taken 1% 3450: 157: dst->c.g = CLIP8((int)(bucket->g / count)); branch 0 taken 99% (fallthrough) branch 1 taken 1% 3450: 158: dst->c.b = CLIP8((int)(bucket->b / count)); branch 0 taken 99% (fallthrough) branch 1 taken 1% 3450: 159: dst->c.a = CLIP8((int)(bucket->a / count)); branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 160: } else { 3418: 161: dst->c.r = 0; 3418: 162: dst->c.g = 0; 3418: 163: dst->c.b = 0; 3418: 164: dst->c.a = 0; -: 165: } 6868: 166:} -: 167: -: 168:static int function compare_bucket_count called 633928 returned 100% blocks executed 100% 633928: 169:compare_bucket_count(const ColorBucket a, const ColorBucket b) { 633928: 170: return b->count - a->count; -: 171:} -: 172: -: 173:static ColorBucket function create_sorted_color_palette.isra.2 called 24 returned 100% blocks executed 100% 24: 174:create_sorted_color_palette(const ColorCube cube) { -: 175: ColorBucket buckets; 24: 176: if (cube->size > LONG_MAX / sizeof(struct _ColorBucket)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 177: return NULL; -: 178: } -: 179: /* malloc check ok, calloc + overflow check above for memcpy */ 24: 180: buckets = calloc(cube->size, sizeof(struct _ColorBucket)); 24: 181: if (!buckets) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 182: return NULL; -: 183: } 48: 184: memcpy(buckets, cube->buckets, sizeof(struct _ColorBucket)*cube->size); -: 185: 24: 186: qsort(buckets, cube->size, sizeof(struct _ColorBucket), call 0 returned 100% -: 187: (int (*)(void const *, void const *))&compare_bucket_count); -: 188: -: 189: return buckets; -: 190:} -: 191: function add_bucket_values called 188416 returned 100% blocks executed 100% 188416: 192:void add_bucket_values(ColorBucket src, ColorBucket dst) { 188416: 193: dst->count += src->count; 188416: 194: dst->r += src->r; 188416: 195: dst->g += src->g; 188416: 196: dst->b += src->b; 188416: 197: dst->a += src->a; 188416: 198:} -: 199: -: 200:/* expand or shrink a given cube to level */ function copy_color_cube called 24 returned 100% blocks executed 100% 24: 201:static ColorCube copy_color_cube(const ColorCube cube, -: 202: unsigned int rBits, unsigned int gBits, unsigned int bBits, unsigned int aBits) -: 203:{ -: 204: unsigned int r, g, b, a; -: 205: long src_pos, dst_pos; 24: 206: unsigned int src_reduce[4] = {0}, dst_reduce[4] = {0}; -: 207: unsigned int width[4]; -: 208: ColorCube result; -: 209: 24: 210: result = new_color_cube(rBits, gBits, bBits, aBits); call 0 returned 100% 24: 211: if (!result) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 212: return NULL; -: 213: } -: 214: 24: 215: if (cube->rBits > rBits) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 12: 216: dst_reduce[0] = cube->rBits - result->rBits; 12: 217: width[0] = cube->rWidth; -: 218: } else { 12: 219: src_reduce[0] = result->rBits - cube->rBits; 12: 220: width[0] = result->rWidth; -: 221: } 24: 222: if (cube->gBits > gBits) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 12: 223: dst_reduce[1] = cube->gBits - result->gBits; 12: 224: width[1] = cube->gWidth; -: 225: } else { 12: 226: src_reduce[1] = result->gBits - cube->gBits; 12: 227: width[1] = result->gWidth; -: 228: } 24: 229: if (cube->bBits > bBits) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 12: 230: dst_reduce[2] = cube->bBits - result->bBits; 12: 231: width[2] = cube->bWidth; -: 232: } else { 12: 233: src_reduce[2] = result->bBits - cube->bBits; 12: 234: width[2] = result->bWidth; -: 235: } 24: 236: if (cube->aBits > aBits) { branch 0 taken 46% (fallthrough) branch 1 taken 54% 11: 237: dst_reduce[3] = cube->aBits - result->aBits; 11: 238: width[3] = cube->aWidth; -: 239: } else { 13: 240: src_reduce[3] = result->aBits - cube->aBits; 13: 241: width[3] = result->aWidth; -: 242: } -: 243: 232: 244: for (r=0; r>src_reduce[0], -: 250: g>>src_reduce[1], -: 251: b>>src_reduce[2], -: 252: a>>src_reduce[3]); 376832: 253: dst_pos = color_bucket_offset_pos(result, -: 254: r>>dst_reduce[0], -: 255: g>>dst_reduce[1], -: 256: b>>dst_reduce[2], -: 257: a>>dst_reduce[3]); 753664: 258: add_bucket_values( call 0 returned 100% 376832: 259: &cube->buckets[src_pos], 376832: 260: &result->buckets[dst_pos] -: 261: ); -: 262: } -: 263: } -: 264: } -: 265: } -: 266: return result; -: 267:} -: 268: -: 269:void function subtract_color_buckets called 29 returned 100% blocks executed 100% 29: 270:subtract_color_buckets(ColorCube cube, ColorBucket buckets, long nBuckets) { -: 271: ColorBucket minuend, subtrahend; -: 272: long i; -: 273: Pixel p; 2774: 274: for (i=0; icount == 0) { branch 0 taken 62% (fallthrough) branch 1 taken 38% 1709: 279: continue; -: 280: } -: 281: 1036: 282: avg_color_from_color_bucket(subtrahend, &p); call 0 returned 100% 1036: 283: minuend = color_bucket_from_cube(cube, &p); 1036: 284: minuend->count -= subtrahend->count; 1036: 285: minuend->r -= subtrahend->r; 1036: 286: minuend->g -= subtrahend->g; 1036: 287: minuend->b -= subtrahend->b; 1036: 288: minuend->a -= subtrahend->a; -: 289: } 29: 290:} -: 291: -: 292:static void -: 293:set_lookup_value(const ColorCube cube, const Pixel *p, long value) { 2916: 294: ColorBucket bucket = color_bucket_from_cube(cube, p); 2916: 295: bucket->count = value; -: 296:} -: 297: -: 298:uint64_t function lookup_color called 202069 returned 100% blocks executed 100% 202069: 299:lookup_color(const ColorCube cube, const Pixel *p) { 202069: 300: ColorBucket bucket = color_bucket_from_cube(cube, p); 202069: 301: return bucket->count; -: 302:} -: 303: function add_lookup_buckets called 24 returned 100% blocks executed 100% 24: 304:void add_lookup_buckets(ColorCube cube, ColorBucket palette, long nColors, long offset) { -: 305: long i; -: 306: Pixel p; 2940: 307: for (i=offset; i LONG_MAX - nBucketsB || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 12: 317: (nBucketsA+nBucketsB) > LONG_MAX / sizeof(struct _ColorBucket)) { -: 318: return NULL; -: 319: } -: 320: /* malloc check ok, overflow check above */ 12: 321: result = calloc(nBucketsA + nBucketsB, sizeof(struct _ColorBucket)); 12: 322: if (!result) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 323: return NULL; -: 324: } 24: 325: memcpy(result, bucketsA, sizeof(struct _ColorBucket) * nBucketsA); 24: 326: memcpy(&result[nBucketsA], bucketsB, sizeof(struct _ColorBucket) * nBucketsB); 12: 327: return result; -: 328:} -: 329: -: 330:static Pixel * function create_palette_array called 12 returned 100% blocks executed 100% 12: 331:create_palette_array(const ColorBucket palette, unsigned int paletteLength) { -: 332: Pixel *paletteArray; -: 333: unsigned int i; -: 334: -: 335: /* malloc check ok, calloc for overflow */ 12: 336: paletteArray = calloc(paletteLength, sizeof(Pixel)); 12: 337: if (!paletteArray) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 338: return NULL; -: 339: } -: 340: 2916: 341: for (i=0; i 64). -: 394: -: 395: For a quantization to 256 colors all 64 coarse colors will be used -: 396: plus the 192 most used color buckets from the fine color cube. -: 397: The average of all colors within one bucket is used as the actual -: 398: color for that bucket. -: 399: -: 400: For images with alpha the cubes gets a forth dimension, -: 401: 8x16x8x8 and 4x4x4x4. -: 402: */ -: 403: -: 404: /* create fine cube */ 36: 405: fineCube = new_color_cube(cubeBits[0], cubeBits[1], call 0 returned 100% 24: 406: cubeBits[2], cubeBits[3]); 12: 407: if (!fineCube) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 408: goto error; -: 409: } 202069: 410: for (i=0; i nQuantPixels) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 424: nCoarseColors = nQuantPixels; -: 425: } -: 426: -: 427: /* how many space do we have in our palette for fine colors? */ 12: 428: nFineColors = nQuantPixels - nCoarseColors; -: 429: -: 430: /* create fine color palette */ 12: 431: paletteBucketsFine = create_sorted_color_palette(fineCube); call 0 returned 100% 12: 432: if (!paletteBucketsFine) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 433: goto error; -: 434: } -: 435: -: 436: /* remove the used fine colors from the coarse cube */ 12: 437: subtract_color_buckets(coarseCube, paletteBucketsFine, nFineColors); call 0 returned 100% -: 438: -: 439: /* did the subtraction cleared one or more coarse bucket? */ 70: 440: while (nCoarseColors > count_used_color_buckets(coarseCube)) { branch 0 taken 59% (fallthrough) branch 1 taken 41% -: 441: /* then we can use the free buckets for fine colors */ -: 442: nAlreadySubtracted = nFineColors; 17: 443: nCoarseColors = count_used_color_buckets(coarseCube); 17: 444: nFineColors = nQuantPixels - nCoarseColors; 34: 445: subtract_color_buckets(coarseCube, &paletteBucketsFine[nAlreadySubtracted], call 0 returned 100% 17: 446: nFineColors-nAlreadySubtracted); -: 447: } -: 448: -: 449: /* create our palette buckets with fine and coarse combined */ 12: 450: paletteBucketsCoarse = create_sorted_color_palette(coarseCube); call 0 returned 100% 12: 451: if (!paletteBucketsCoarse) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 452: goto error; -: 453: } 12: 454: paletteBuckets = combined_palette(paletteBucketsCoarse, nCoarseColors, call 0 returned 100% -: 455: paletteBucketsFine, nFineColors); -: 456: 12: 457: free(paletteBucketsFine); 12: 458: paletteBucketsFine = NULL; 12: 459: free(paletteBucketsCoarse); 12: 460: paletteBucketsCoarse = NULL; 12: 461: if (!paletteBuckets) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 462: goto error; -: 463: } -: 464: -: 465: /* add all coarse colors to our coarse lookup cube. */ 36: 466: coarseLookupCube = new_color_cube(cubeBits[4], cubeBits[5], call 0 returned 100% 24: 467: cubeBits[6], cubeBits[7]); 12: 468: if (!coarseLookupCube) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 469: goto error; -: 470: } 12: 471: add_lookup_buckets(coarseLookupCube, paletteBuckets, nCoarseColors, 0); call 0 returned 100% -: 472: -: 473: /* expand coarse cube (64) to larger fine cube (4k). the value of each -: 474: coarse bucket is then present in the according 64 fine buckets. */ 12: 475: lookupCube = copy_color_cube(coarseLookupCube, cubeBits[0], cubeBits[1], call 0 returned 100% -: 476: cubeBits[2], cubeBits[3]); 12: 477: if (!lookupCube) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 478: goto error; -: 479: } -: 480: -: 481: /* add fine colors to the lookup cube */ 12: 482: add_lookup_buckets(lookupCube, paletteBuckets, nFineColors, nCoarseColors); call 0 returned 100% -: 483: -: 484: /* create result pixels and map palette indices */ -: 485: /* malloc check ok, calloc for overflow */ 12: 486: qp = calloc(nPixels, sizeof(Pixel)); 12: 487: if (!qp) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 488: goto error; -: 489: } 12: 490: map_image_pixels(pixelData, nPixels, lookupCube, qp); -: 491: -: 492: /* convert palette buckets to RGB pixel palette */ 12: 493: *palette = create_palette_array(paletteBuckets, nQuantPixels); call 0 returned 100% 12: 494: if (!(*palette)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 495: goto error; -: 496: } -: 497: 12: 498: *quantizedPixels = qp; 12: 499: *paletteLength = nQuantPixels; -: 500: 12: 501: free_color_cube(coarseCube); call 0 returned 100% 12: 502: free_color_cube(fineCube); call 0 returned 100% 12: 503: free_color_cube(lookupCube); call 0 returned 100% 12: 504: free_color_cube(coarseLookupCube); call 0 returned 100% 12: 505: free(paletteBuckets); 12: 506: return 1; -: 507: -: 508:error: -: 509: /* everything is initialized to NULL -: 510: so we are safe to call free */ #####: 511: free(qp); #####: 512: free_color_cube(lookupCube); call 0 never executed #####: 513: free_color_cube(coarseLookupCube); call 0 never executed #####: 514: free(paletteBuckets); #####: 515: free(paletteBucketsCoarse); #####: 516: free(paletteBucketsFine); #####: 517: free_color_cube(coarseCube); call 0 never executed #####: 518: free_color_cube(fineCube); call 0 never executed #####: 519: return 0; -: 520:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#GifDecode.c.gcov -: 0:Source:src/libImaging/GifDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/GifDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/GifDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * a fast, suspendable GIF decoder -: 6: * -: 7: * history: -: 8: * 95-09-03 fl Created -: 9: * 95-09-05 fl Fixed sign problem on 16-bit platforms -: 10: * 95-09-13 fl Added some storage shortcuts -: 11: * 96-03-28 fl Revised API, integrated with PIL -: 12: * 96-12-10 fl Added interlace support -: 13: * 96-12-16 fl Fixed premature termination bug introduced by last fix -: 14: * 97-01-05 fl Don't mess up on bogus configuration -: 15: * 97-01-17 fl Don't mess up on very small, interlaced files -: 16: * 99-02-07 fl Minor speedups -: 17: * -: 18: * Copyright (c) Secret Labs AB 1997-99. -: 19: * Copyright (c) Fredrik Lundh 1995-97. -: 20: * -: 21: * See the README file for information on usage and redistribution. -: 22: */ -: 23: -: 24: -: 25:#include "Imaging.h" -: 26: -: 27:#include -: 28:#include /* memcpy() */ -: 29: -: 30:#include "Gif.h" -: 31: -: 32: -: 33:#define NEWLINE(state, context) {\ -: 34: state->x = 0;\ -: 35: state->y += context->step;\ -: 36: while (state->y >= state->ysize)\ -: 37: switch (context->interlace) {\ -: 38: case 1:\ -: 39: context->repeat = state->y = 4;\ -: 40: context->interlace = 2;\ -: 41: break;\ -: 42: case 2:\ -: 43: context->step = 4;\ -: 44: context->repeat = state->y = 2;\ -: 45: context->interlace = 3;\ -: 46: break;\ -: 47: case 3:\ -: 48: context->step = 2;\ -: 49: context->repeat = state->y = 1;\ -: 50: context->interlace = 0;\ -: 51: break;\ -: 52: default:\ -: 53: return -1;\ -: 54: }\ -: 55: if (state->y < state->ysize) {\ -: 56: out = im->image8[state->y + state->yoff] + state->xoff;\ -: 57: }\ -: 58:} -: 59: -: 60: -: 61:int function ImagingGifDecode called 510 returned 100% blocks executed 90% 510: 62:ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8* buffer, Py_ssize_t bytes) -: 63:{ -: 64: UINT8* p; -: 65: UINT8* out; -: 66: int c, i; -: 67: int thiscode; 510: 68: GIFDECODERSTATE *context = (GIFDECODERSTATE*) state->context; -: 69: 510: 70: UINT8 *ptr = buffer; -: 71: 510: 72: if (!state->state) { branch 0 taken 95% (fallthrough) branch 1 taken 5% -: 73: -: 74: /* Initialise state */ 486: 75: if (context->bits < 0 || context->bits > 12) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 76: state->errcode = IMAGING_CODEC_CONFIG; #####: 77: return -1; -: 78: } -: 79: -: 80: /* Clear code */ 486: 81: context->clear = 1 << context->bits; -: 82: -: 83: /* End code */ 486: 84: context->end = context->clear + 1; -: 85: -: 86: /* Interlace */ 486: 87: if (context->interlace) { branch 0 taken 6% (fallthrough) branch 1 taken 94% 27: 88: context->interlace = 1; 27: 89: context->step = context->repeat = 8; -: 90: } else { 459: 91: context->step = 1; -: 92: } -: 93: 486: 94: state->state = 1; -: 95: } -: 96: 510: 97: out = im->image8[state->y + state->yoff] + state->xoff + state->x; -: 98: -: 99: for (;;) { -: 100: 6809997: 101: if (state->state == 1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 102: -: 103: /* First free entry in table */ 9783: 104: context->next = context->clear + 2; -: 105: -: 106: /* Initial code size */ 9783: 107: context->codesize = context->bits + 1; 9783: 108: context->codemask = (1 << context->codesize) - 1; -: 109: -: 110: /* Buffer pointer. We fill the buffer from right, which -: 111: allows us to return all of it in one operation. */ 9783: 112: context->bufferindex = GIFBUFFER; -: 113: 9783: 114: state->state = 2; -: 115: } -: 116: 6809997: 117: if (context->bufferindex < GIFBUFFER) { branch 0 taken 68% (fallthrough) branch 1 taken 32% -: 118: -: 119: /* Return whole buffer in one chunk */ 2205813: 120: i = GIFBUFFER - context->bufferindex; 2205813: 121: p = &context->buffer[context->bufferindex]; -: 122: 2205813: 123: context->bufferindex = GIFBUFFER; -: 124: -: 125: } else { -: 126: -: 127: /* Get current symbol */ -: 128: 10483769: 129: while (context->bitcount < context->codesize) { branch 0 taken 56% branch 1 taken 44% (fallthrough) -: 130: 5879609: 131: if (context->blocksize > 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 132: -: 133: /* Read next byte */ 5856384: 134: c = *ptr++; bytes--; -: 135: 5856384: 136: context->blocksize--; -: 137: -: 138: /* New bits are shifted in from from the left. */ 5856384: 139: context->bitbuffer |= (INT32) c << context->bitcount; 5856384: 140: context->bitcount += 8; -: 141: -: 142: } else { -: 143: -: 144: /* New GIF block */ -: 145: -: 146: /* We don't start decoding unless we have a full block */ 23225: 147: if (bytes < 1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 24: 148: return ptr - buffer; -: 149: } 23201: 150: c = *ptr; 23201: 151: if (bytes < c+1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 152: return ptr - buffer; -: 153: } -: 154: 23201: 155: context->blocksize = c; -: 156: 23201: 157: ptr++; bytes--; -: 158: -: 159: } -: 160: } -: 161: -: 162: /* Extract current symbol from bit buffer. */ 4604160: 163: c = (int) context->bitbuffer & context->codemask; -: 164: -: 165: /* Adjust buffer */ 4604160: 166: context->bitbuffer >>= context->codesize; 4604160: 167: context->bitcount -= context->codesize; -: 168: -: 169: /* If c is less than "clear", it's a data byte. Otherwise, -: 170: it's either clear/end or a code symbol which should be -: 171: expanded. */ -: 172: 4604160: 173: if (c == context->clear) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 9783: 174: if (state->state != 2) { branch 0 taken 95% (fallthrough) branch 1 taken 5% 9297: 175: state->state = 1; -: 176: } 9783: 177: continue; -: 178: } -: 179: 4594377: 180: if (c == context->end) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 181: break; -: 182: } -: 183: 4594377: 184: i = 1; 4594377: 185: p = &context->lastdata; -: 186: 4594377: 187: if (state->state == 2) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 188: -: 189: /* First valid symbol after clear; use as is */ 9783: 190: if (c > context->clear) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 191: state->errcode = IMAGING_CODEC_BROKEN; #####: 192: return -1; -: 193: } -: 194: 9783: 195: context->lastdata = context->lastcode = c; 9783: 196: state->state = 3; -: 197: -: 198: } else { -: 199: 4584594: 200: thiscode = c; -: 201: 4584594: 202: if (c > context->next) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 203: state->errcode = IMAGING_CODEC_BROKEN; #####: 204: return -1; -: 205: } -: 206: 4584594: 207: if (c == context->next) { branch 0 taken 20% (fallthrough) branch 1 taken 80% -: 208: -: 209: /* c == next is allowed. not sure why. */ -: 210: 911296: 211: if (context->bufferindex <= 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 212: state->errcode = IMAGING_CODEC_BROKEN; #####: 213: return -1; -: 214: } -: 215: 1822592: 216: context->buffer[--context->bufferindex] = 911296: 217: context->lastdata; -: 218: 911296: 219: c = context->lastcode; -: 220: -: 221: } -: 222: 25251852: 223: while (c >= context->clear) { branch 0 taken 82% branch 1 taken 18% (fallthrough) -: 224: -: 225: /* Copy data string to buffer (beginning from right) */ -: 226: 20667258: 227: if (context->bufferindex <= 0 || c >= GIFTABLE) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 228: state->errcode = IMAGING_CODEC_BROKEN; #####: 229: return -1; -: 230: } -: 231: 41334516: 232: context->buffer[--context->bufferindex] = 20667258: 233: context->data[c]; -: 234: 20667258: 235: c = context->link[c]; -: 236: } -: 237: 4584594: 238: context->lastdata = c; -: 239: 4584594: 240: if (context->next < GIFTABLE) { branch 0 taken 82% (fallthrough) branch 1 taken 18% -: 241: -: 242: /* We'll only add this symbol if we have room -: 243: for it (take advise, Netscape!) */ 3741932: 244: context->data[context->next] = c; 3741932: 245: context->link[context->next] = context->lastcode; -: 246: 3741932: 247: if (context->next == context->codemask && branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 92% (fallthrough) branch 3 taken 8% -: 248: context->codesize < GIFBITS) { -: 249: -: 250: /* Expand code size */ 1566: 251: context->codesize++; 1566: 252: context->codemask = (1 << context->codesize) - 1; -: 253: } -: 254: 3741932: 255: context->next++; -: 256: -: 257: } -: 258: 4584594: 259: context->lastcode = thiscode; -: 260: -: 261: } -: 262: } -: 263: -: 264: /* Copy the bytes into the image */ 6800190: 265: if (state->y >= state->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 266: state->errcode = IMAGING_CODEC_OVERRUN; #####: 267: return -1; -: 268: } -: 269: -: 270: /* To squeeze some extra pixels out of this loop, we test for -: 271: some common cases and handle them separately. */ -: 272: -: 273: /* FIXME: should we handle the transparency index in here??? */ -: 274: 6800190: 275: if (i == 1) { branch 0 taken 81% (fallthrough) branch 1 taken 19% 5486134: 276: if (state->x < state->xsize-1) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 277: /* Single pixel, not at the end of the line. */ 5467095: 278: *out++ = p[0]; 5467095: 279: state->x++; 5467095: 280: continue; -: 281: } 1314056: 282: } else if (state->x + i <= state->xsize) { branch 0 taken 5% (fallthrough) branch 1 taken 95% -: 283: /* This string fits into current line. */ 2485966: 284: memcpy(out, p, i); 1242983: 285: out += i; 1242983: 286: state->x += i; 1242983: 287: if (state->x == state->xsize) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 5334: 288: NEWLINE(state, context); branch 0 taken 1% branch 1 taken 1% branch 2 taken 1% branch 3 taken 99% branch 4 taken 7% branch 5 taken 93% (fallthrough) branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 289: } 1242589: 290: continue; -: 291: } -: 292: -: 293: /* No shortcut, copy pixel by pixel */ 8347184: 294: for (c = 0; c < i; c++) { branch 0 taken 1% branch 1 taken 99% 8347276: 295: *out++ = p[c]; 8347276: 296: if (++state->x >= state->xsize) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 90310: 297: NEWLINE(state, context); branch 0 taken 15% branch 1 taken 15% branch 2 taken 15% branch 3 taken 55% branch 4 taken 1% branch 5 taken 99% (fallthrough) branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 298: } -: 299: } -: 300: } -: 301: #####: 302: return ptr - buffer; -: 303:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Convert.c.gcov -: 0:Source:src/libImaging/Convert.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Convert.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Convert.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * convert images -: 6: * -: 7: * history: -: 8: * 1995-06-15 fl created -: 9: * 1995-11-28 fl added some "RGBA" and "CMYK" conversions -: 10: * 1996-04-22 fl added "1" conversions (same as "L") -: 11: * 1996-05-05 fl added palette conversions (hack) -: 12: * 1996-07-23 fl fixed "1" conversions to zero/non-zero convention -: 13: * 1996-11-01 fl fixed "P" to "L" and "RGB" to "1" conversions -: 14: * 1996-12-29 fl set alpha byte in RGB converters -: 15: * 1997-05-12 fl added ImagingConvert2 -: 16: * 1997-05-30 fl added floating point support -: 17: * 1997-08-27 fl added "P" to "1" and "P" to "F" conversions -: 18: * 1998-01-11 fl added integer support -: 19: * 1998-07-01 fl added "YCbCr" support -: 20: * 1998-07-02 fl added "RGBX" conversions (sort of) -: 21: * 1998-07-04 fl added floyd-steinberg dithering -: 22: * 1998-07-12 fl changed "YCrCb" to "YCbCr" (!) -: 23: * 1998-12-29 fl added basic "I;16" and "I;16B" conversions -: 24: * 1999-02-03 fl added "RGBa", and "BGR" conversions (experimental) -: 25: * 2003-09-26 fl added "LA" and "PA" conversions (experimental) -: 26: * 2005-05-05 fl fixed "P" to "1" threshold -: 27: * 2005-12-08 fl fixed palette memory leak in topalette -: 28: * -: 29: * Copyright (c) 1997-2005 by Secret Labs AB. -: 30: * Copyright (c) 1995-1997 by Fredrik Lundh. -: 31: * -: 32: * See the README file for details on usage and redistribution. -: 33: */ -: 34: -: 35: -: 36:#include "Imaging.h" -: 37: -: 38:#define MAX(a, b) (a)>(b) ? (a) : (b) -: 39:#define MIN(a, b) (a)<(b) ? (a) : (b) -: 40: -: 41:#define CLIP16(v) ((v) <= -32768 ? -32768 : (v) >= 32767 ? 32767 : (v)) -: 42: -: 43:/* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ -: 44:#define L(rgb)\ -: 45: ((INT32) (rgb)[0]*299 + (INT32) (rgb)[1]*587 + (INT32) (rgb)[2]*114) -: 46:#define L24(rgb)\ -: 47: ((rgb)[0]*19595 + (rgb)[1]*38470 + (rgb)[2]*7471 + 0x8000) -: 48: -: 49: -: 50:#ifndef round -: 51:double round(double x) { #####: 52: return floor(x+0.5); -: 53:} -: 54:#endif -: 55: -: 56:/* ------------------- */ -: 57:/* 1 (bit) conversions */ -: 58:/* ------------------- */ -: 59: -: 60:static void function bit2l called 833 returned 100% blocks executed 100% 833: 61:bit2l(UINT8* out, const UINT8* in, int xsize) -: 62:{ -: 63: int x; 132930: 64: for (x = 0; x < xsize; x++) branch 0 taken 99% branch 1 taken 1% (fallthrough) 132097: 65: *out++ = (*in++ != 0) ? 255 : 0; branch 0 taken 33% (fallthrough) branch 1 taken 67% 833: 66:} -: 67: -: 68:static void function bit2rgb called 512 returned 100% blocks executed 100% 512: 69:bit2rgb(UINT8* out, const UINT8* in, int xsize) -: 70:{ -: 71: int x; 57856: 72: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 57344: 73: UINT8 v = (*in++ != 0) ? 255 : 0; branch 0 taken 65% (fallthrough) branch 1 taken 35% 57344: 74: *out++ = v; 57344: 75: *out++ = v; 57344: 76: *out++ = v; 57344: 77: *out++ = 255; -: 78: } 512: 79:} -: 80: -: 81:static void function bit2cmyk called 128 returned 100% blocks executed 100% 128: 82:bit2cmyk(UINT8* out, const UINT8* in, int xsize) -: 83:{ -: 84: int x; 16512: 85: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 86: *out++ = 0; 16384: 87: *out++ = 0; 16384: 88: *out++ = 0; 16384: 89: *out++ = (*in++ != 0) ? 0 : 255; branch 0 taken 67% (fallthrough) branch 1 taken 33% -: 90: } 128: 91:} -: 92: -: 93:static void function bit2ycbcr called 128 returned 100% blocks executed 100% 128: 94:bit2ycbcr(UINT8* out, const UINT8* in, int xsize) -: 95:{ -: 96: int x; 16512: 97: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 98: *out++ = (*in++ != 0) ? 255 : 0; branch 0 taken 67% (fallthrough) branch 1 taken 33% 16384: 99: *out++ = 128; 16384: 100: *out++ = 128; 16384: 101: *out++ = 255; -: 102: } 128: 103:} -: 104: -: 105:static void function bit2hsv called 128 returned 100% blocks executed 100% 128: 106:bit2hsv(UINT8* out, const UINT8* in, int xsize) -: 107:{ -: 108: int x; 16512: 109: for (x = 0; x < xsize; x++, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 110: UINT8 v = (*in++ != 0) ? 255 : 0; branch 0 taken 67% (fallthrough) branch 1 taken 33% 16384: 111: out[0] = 0; 16384: 112: out[1] = 0; 16384: 113: out[2] = v; 16384: 114: out[3] = 255; -: 115: } 128: 116:} -: 117: -: 118:/* ----------------- */ -: 119:/* RGB/L conversions */ -: 120:/* ----------------- */ -: 121: -: 122:static void function l2bit called 1 returned 100% blocks executed 83% 1: 123:l2bit(UINT8* out, const UINT8* in, int xsize) -: 124:{ -: 125: int x; 2: 126: for (x = 0; x < xsize; x++) { branch 0 taken 50% branch 1 taken 50% (fallthrough) 1: 127: *out++ = (*in++ >= 128) ? 255 : 0; branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 128: } 1: 129:} -: 130: -: 131:static void function lA2la called 75106 returned 100% blocks executed 100% 75106: 132:lA2la(UINT8* out, const UINT8* in, int xsize) -: 133:{ -: 134: int x; -: 135: unsigned int alpha, pixel, tmp; 37132631: 136: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 37057525: 137: alpha = in[3]; 37057525: 138: pixel = MULDIV255(in[0], alpha, tmp); 37057525: 139: *out++ = (UINT8) pixel; 37057525: 140: *out++ = (UINT8) pixel; 37057525: 141: *out++ = (UINT8) pixel; 37057525: 142: *out++ = (UINT8) alpha; -: 143: } 75106: 144:} -: 145: -: 146:/* RGBa -> RGBA conversion to remove premultiplication -: 147: Needed for correct transforms/resizing on RGBA images */ -: 148:static void function la2lA called 20827 returned 100% blocks executed 100% 20827: 149:la2lA(UINT8* out, const UINT8* in, int xsize) -: 150:{ -: 151: int x; -: 152: unsigned int alpha, pixel; 3420108: 153: for (x = 0; x < xsize; x++, in+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3399281: 154: alpha = in[3]; 3399281: 155: if (alpha == 255 || alpha == 0) { branch 0 taken 48% (fallthrough) branch 1 taken 52% branch 2 taken 1% (fallthrough) branch 3 taken 99% 1779933: 156: pixel = in[0]; -: 157: } else { 1619348: 158: pixel = CLIP8((255 * in[0]) / alpha); branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 159: } 3399281: 160: *out++ = (UINT8) pixel; 3399281: 161: *out++ = (UINT8) pixel; 3399281: 162: *out++ = (UINT8) pixel; 3399281: 163: *out++ = (UINT8) alpha; -: 164: } 20827: 165:} -: 166: -: 167:static void function l2la called 523 returned 100% blocks executed 100% 523: 168:l2la(UINT8* out, const UINT8* in, int xsize) -: 169:{ -: 170: int x; 148690: 171: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% branch 2 taken 99% branch 3 taken 1% (fallthrough) 147527: 172: UINT8 v = *in++; 147527: 173: *out++ = v; 147527: 174: *out++ = v; 147527: 175: *out++ = v; 147527: 176: *out++ = 255; -: 177: } 523: 178:} -: 179: -: 180:static void function l2rgb called 5392 returned 100% blocks executed 100% 5392: 181:l2rgb(UINT8* out, const UINT8* in, int xsize) -: 182:{ -: 183: int x; 1866626: 184: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1861234: 185: UINT8 v = *in++; 1861234: 186: *out++ = v; 1861234: 187: *out++ = v; 1861234: 188: *out++ = v; 1861234: 189: *out++ = 255; -: 190: } 5392: 191:} -: 192: -: 193:static void function l2hsv called 256 returned 100% blocks executed 100% 256: 194:l2hsv(UINT8* out, const UINT8* in, int xsize) -: 195:{ -: 196: int x; 33024: 197: for (x = 0; x < xsize; x++, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 198: UINT8 v = *in++; 32768: 199: out[0] = 0; 32768: 200: out[1] = 0; 32768: 201: out[2] = v; 32768: 202: out[3] = 255; -: 203: } 256: 204:} -: 205: -: 206:static void function la2l called 1024 returned 100% blocks executed 100% 1024: 207:la2l(UINT8* out, const UINT8* in, int xsize) -: 208:{ -: 209: int x; 132096: 210: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 131072: 211: *out++ = in[0]; -: 212: } 1024: 213:} -: 214: -: 215:static void function la2rgb called 896 returned 100% blocks executed 100% 896: 216:la2rgb(UINT8* out, const UINT8* in, int xsize) -: 217:{ -: 218: int x; 115584: 219: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 114688: 220: UINT8 v = in[0]; 114688: 221: *out++ = v; 114688: 222: *out++ = v; 114688: 223: *out++ = v; 114688: 224: *out++ = in[3]; -: 225: } 896: 226:} -: 227: -: 228:static void function la2hsv called 128 returned 100% blocks executed 100% 128: 229:la2hsv(UINT8* out, const UINT8* in, int xsize) -: 230:{ -: 231: int x; 16512: 232: for (x = 0; x < xsize; x++, in += 4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 233: UINT8 v = in[0]; 16384: 234: out[0] = 0; 16384: 235: out[1] = 0; 16384: 236: out[2] = v; 16384: 237: out[3] = in[3]; -: 238: } 128: 239:} -: 240: -: 241:static void function rgb2bit called 0 returned 0% blocks executed 0% #####: 242:rgb2bit(UINT8* out, const UINT8* in, int xsize) -: 243:{ -: 244: int x; #####: 245: for (x = 0; x < xsize; x++, in += 4) { branch 0 never executed branch 1 never executed -: 246: /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ #####: 247: *out++ = (L(in) >= 128000) ? 255 : 0; branch 0 never executed branch 1 never executed -: 248: } #####: 249:} -: 250: -: 251:static void function rgb2l called 5049 returned 100% blocks executed 100% 5049: 252:rgb2l(UINT8* out, const UINT8* in, int xsize) -: 253:{ -: 254: int x; 1502590: 255: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 256: /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ 1497541: 257: *out++ = L24(in) >> 16; -: 258: } 5049: 259:} -: 260: -: 261:static void function rgb2la called 840 returned 100% blocks executed 100% 840: 262:rgb2la(UINT8* out, const UINT8* in, int xsize) -: 263:{ -: 264: int x; 108360: 265: for (x = 0; x < xsize; x++, in += 4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 266: /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ 107520: 267: out[0] = out[1] = out[2] = L24(in) >> 16; 107520: 268: out[3] = 255; -: 269: } 840: 270:} -: 271: -: 272:static void function rgb2i called 1512 returned 100% blocks executed 100% 1512: 273:rgb2i(UINT8* out_, const UINT8* in, int xsize) -: 274:{ -: 275: int x; 191976: 276: for (x = 0; x < xsize; x++, in += 4, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 190464: 277: INT32 v = L24(in) >> 16; 190464: 278: memcpy(out_, &v, sizeof(v)); -: 279: } 1512: 280:} -: 281: -: 282:static void function rgb2f called 1480 returned 100% blocks executed 100% 1480: 283:rgb2f(UINT8* out_, const UINT8* in, int xsize) -: 284:{ -: 285: int x; 190920: 286: for (x = 0; x < xsize; x++, in += 4, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 189440: 287: FLOAT32 v = (float) L(in) / 1000.0F; 189440: 288: memcpy(out_, &v, sizeof(v)); -: 289: } 1480: 290:} -: 291: -: 292:static void function rgb2bgr15 called 128 returned 100% blocks executed 100% 128: 293:rgb2bgr15(UINT8* out_, const UINT8* in, int xsize) -: 294:{ -: 295: int x; 16512: 296: for (x = 0; x < xsize; x++, in += 4, out_ += 2) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 49152: 297: UINT16 v = 16384: 298: ((((UINT16)in[0])<<7)&0x7c00) + 16384: 299: ((((UINT16)in[1])<<2)&0x03e0) + 16384: 300: ((((UINT16)in[2])>>3)&0x001f); 16384: 301: memcpy(out_, &v, sizeof(v)); -: 302: } 128: 303:} -: 304: -: 305:static void function rgb2bgr16 called 0 returned 0% blocks executed 0% #####: 306:rgb2bgr16(UINT8* out_, const UINT8* in, int xsize) -: 307:{ -: 308: int x; #####: 309: for (x = 0; x < xsize; x++, in += 4, out_ += 2) { branch 0 never executed branch 1 never executed #####: 310: UINT16 v = #####: 311: ((((UINT16)in[0])<<8)&0xf800) + #####: 312: ((((UINT16)in[1])<<3)&0x07e0) + #####: 313: ((((UINT16)in[2])>>3)&0x001f); #####: 314: memcpy(out_, &v, sizeof(v)); -: 315: } #####: 316:} -: 317: -: 318:static void function rgb2bgr24 called 0 returned 0% blocks executed 0% #####: 319:rgb2bgr24(UINT8* out, const UINT8* in, int xsize) -: 320:{ -: 321: int x; #####: 322: for (x = 0; x < xsize; x++, in += 4) { branch 0 never executed branch 1 never executed #####: 323: *out++ = in[2]; #####: 324: *out++ = in[1]; #####: 325: *out++ = in[0]; -: 326: } #####: 327:} -: 328: -: 329:static void function rgb2hsv_row called 150528 returned 100% blocks executed 100% 150528: 330:rgb2hsv_row(UINT8* out, const UINT8* in) -: 331:{ // following colorsys.py -: 332: float h,s,rc,gc,bc,cr; -: 333: UINT8 maxc,minc; -: 334: UINT8 r, g, b; -: 335: UINT8 uh,us,uv; -: 336: 150528: 337: r = in[0]; 150528: 338: g = in[1]; 150528: 339: b = in[2]; 150528: 340: maxc = MAX(r,MAX(g,b)); branch 0 taken 27% (fallthrough) branch 1 taken 73% 150528: 341: minc = MIN(r,MIN(g,b)); branch 0 taken 64% (fallthrough) branch 1 taken 36% 150528: 342: uv = maxc; 150528: 343: if (minc == maxc){ branch 0 taken 97% (fallthrough) branch 1 taken 3% -: 344: uh = 0; -: 345: us = 0; -: 346: } else { 145485: 347: cr = (float)(maxc-minc); 145485: 348: s = cr/(float)maxc; 145485: 349: rc = ((float)(maxc-r))/cr; 145485: 350: gc = ((float)(maxc-g))/cr; 145485: 351: bc = ((float)(maxc-b))/cr; 145485: 352: if (r == maxc) { branch 0 taken 39% (fallthrough) branch 1 taken 61% 56561: 353: h = bc-gc; 88924: 354: } else if (g == maxc) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 6569: 355: h = 2.0 + rc-bc; -: 356: } else { 82355: 357: h = 4.0 + gc-rc; -: 358: } -: 359: // incorrect hue happens if h/6 is negative. 145485: 360: h = fmod((h/6.0 + 1.0), 1.0); -: 361: 145485: 362: uh = (UINT8)CLIP8((int)(h*255.0)); branch 0 taken 96% (fallthrough) branch 1 taken 4% branch 2 taken 100% (fallthrough) branch 3 taken 0% 145485: 363: us = (UINT8)CLIP8((int)(s*255.0)); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 364: } 150528: 365: out[0] = uh; 150528: 366: out[1] = us; 150528: 367: out[2] = uv; 150528: 368:} -: 369: -: 370:static void function rgb2hsv called 800 returned 100% blocks executed 100% 800: 371:rgb2hsv(UINT8* out, const UINT8* in, int xsize) -: 372:{ -: 373: int x; 102176: 374: for (x = 0; x < xsize; x++, in += 4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 101376: 375: rgb2hsv_row(out, in); call 0 returned 100% 101376: 376: out[3] = in[3]; -: 377: } 800: 378:} -: 379: -: 380: -: 381: -: 382:static void function hsv2rgb called 1696 returned 100% blocks executed 100% 1696: 383:hsv2rgb(UINT8* out, const UINT8* in, int xsize) -: 384:{ // following colorsys.py -: 385: -: 386: int p,q,t; -: 387: UINT8 up,uq,ut; -: 388: int i, x; -: 389: float f, fs; -: 390: UINT8 h,s,v; -: 391: 217760: 392: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 216064: 393: h = in[0]; 216064: 394: s = in[1]; 216064: 395: v = in[2]; -: 396: 216064: 397: if (s==0){ branch 0 taken 1% (fallthrough) branch 1 taken 99% 506: 398: *out++ = v; 506: 399: *out++ = v; 506: 400: *out++ = v; -: 401: } else { 215558: 402: i = floor((float)h * 6.0 / 255.0); // 0 - 6 215558: 403: f = (float)h * 6.0 / 255.0 - (float)i; // 0-1 : remainder. 215558: 404: fs = ((float)s)/255.0; -: 405: 215558: 406: p = round((float)v * (1.0-fs)); 215558: 407: q = round((float)v * (1.0-fs*f)); 215558: 408: t = round((float)v * (1.0-fs*(1.0-f))); 215558: 409: up = (UINT8)CLIP8(p); branch 0 taken 98% (fallthrough) branch 1 taken 2% branch 2 taken 100% (fallthrough) branch 3 taken 0% 215558: 410: uq = (UINT8)CLIP8(q); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% 215558: 411: ut = (UINT8)CLIP8(t); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 412: 215558: 413: switch (i%6) { branch 0 taken 27% branch 1 taken 1% branch 2 taken 1% branch 3 taken 35% branch 4 taken 26% branch 5 taken 10% branch 6 taken 0% -: 414: case 0: 58630: 415: *out++ = v; 58630: 416: *out++ = ut; 58630: 417: *out++ = up; 58630: 418: break; -: 419: case 1: 1910: 420: *out++ = uq; 1910: 421: *out++ = v; 1910: 422: *out++ = up; 1910: 423: break; -: 424: case 2: 3014: 425: *out++ = up; 3014: 426: *out++ = v; 3014: 427: *out++ = ut; 3014: 428: break; -: 429: case 3: 75724: 430: *out++ = up; 75724: 431: *out++ = uq; 75724: 432: *out++ = v; 75724: 433: break; -: 434: case 4: 55608: 435: *out++ = ut; 55608: 436: *out++ = up; 55608: 437: *out++ = v; 55608: 438: break; -: 439: case 5: 20672: 440: *out++ = v; 20672: 441: *out++ = up; 20672: 442: *out++ = uq; 20672: 443: break; -: 444: -: 445: } -: 446: } 216064: 447: *out++ = in[3]; -: 448: } 1696: 449:} -: 450: -: 451: -: 452: -: 453:/* ---------------- */ -: 454:/* RGBA conversions */ -: 455:/* ---------------- */ -: 456: -: 457:static void function rgb2rgba called 3340 returned 100% blocks executed 100% 3340: 458:rgb2rgba(UINT8* out, const UINT8* in, int xsize) -: 459:{ -: 460: int x; 462892: 461: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 459552: 462: *out++ = *in++; 459552: 463: *out++ = *in++; 459552: 464: *out++ = *in++; 459552: 465: *out++ = 255; in++; -: 466: } 3340: 467:} -: 468: -: 469:static void function rgba2la called 512 returned 100% blocks executed 100% 512: 470:rgba2la(UINT8* out, const UINT8* in, int xsize) -: 471:{ -: 472: int x; 66048: 473: for (x = 0; x < xsize; x++, in += 4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 474: /* ITU-R Recommendation 601-2 (assuming nonlinear RGB) */ 65536: 475: out[0] = out[1] = out[2] = L24(in) >> 16; 65536: 476: out[3] = in[3]; -: 477: } 512: 478:} -: 479: -: 480:static void function rgba2rgb called 5744 returned 100% blocks executed 100% 5744: 481:rgba2rgb(UINT8* out, const UINT8* in, int xsize) -: 482:{ -: 483: int x; 4247636: 484: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 4241892: 485: *out++ = *in++; 4241892: 486: *out++ = *in++; 4241892: 487: *out++ = *in++; 4241892: 488: *out++ = 255; in++; -: 489: } 5744: 490:} -: 491: -: 492:static void function rgbA2rgba called 78896 returned 100% blocks executed 100% 78896: 493:rgbA2rgba(UINT8* out, const UINT8* in, int xsize) -: 494:{ -: 495: int x; -: 496: unsigned int alpha, tmp; 39281569: 497: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 39202673: 498: alpha = in[3]; 39202673: 499: *out++ = MULDIV255(*in++, alpha, tmp); 39202673: 500: *out++ = MULDIV255(*in++, alpha, tmp); 39202673: 501: *out++ = MULDIV255(*in++, alpha, tmp); 39202673: 502: *out++ = *in++; -: 503: } 78896: 504:} -: 505: -: 506:/* RGBa -> RGBA conversion to remove premultiplication -: 507: Needed for correct transforms/resizing on RGBA images */ -: 508:static void function rgba2rgbA called 21983 returned 100% blocks executed 100% 21983: 509:rgba2rgbA(UINT8* out, const UINT8* in, int xsize) -: 510:{ -: 511: int x; -: 512: unsigned int alpha; 3559028: 513: for (x = 0; x < xsize; x++, in+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3537045: 514: alpha = in[3]; 3537045: 515: if (alpha == 255 || alpha == 0) { branch 0 taken 46% (fallthrough) branch 1 taken 54% branch 2 taken 1% (fallthrough) branch 3 taken 99% 1916339: 516: *out++ = in[0]; 1916339: 517: *out++ = in[1]; 1916339: 518: *out++ = in[2]; -: 519: } else { 1620706: 520: *out++ = CLIP8((255 * in[0]) / alpha); branch 0 taken 99% (fallthrough) branch 1 taken 1% 1620706: 521: *out++ = CLIP8((255 * in[1]) / alpha); branch 0 taken 99% (fallthrough) branch 1 taken 1% 1620706: 522: *out++ = CLIP8((255 * in[2]) / alpha); branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 523: } 3537045: 524: *out++ = in[3]; -: 525: } 21983: 526:} -: 527: -: 528:/* -: 529: * Conversion of RGB + single transparent color to RGBA, -: 530: * where any pixel that matches the color will have the -: 531: * alpha channel set to 0 -: 532: */ -: 533: -: 534:static void function rgbT2rgba called 576 returned 100% blocks executed 100% 576: 535:rgbT2rgba(UINT8* out, int xsize, int r, int g, int b) -: 536:{ -: 537:#ifdef WORDS_BIGENDIAN -: 538: UINT32 trns = ((r & 0xff)<<24) | ((g & 0xff)<<16) | ((b & 0xff)<<8) | 0xff; -: 539: UINT32 repl = trns & 0xffffff00; -: 540:#else 576: 541: UINT32 trns = (0xff <<24) | ((b & 0xff)<<16) | ((g & 0xff)<<8) | (r & 0xff); 576: 542: UINT32 repl = trns & 0x00ffffff; -: 543:#endif -: 544: -: 545: int i; -: 546: 45632: 547: for (i=0; i < xsize; i++ ,out += sizeof(trns)) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 548: UINT32 v; 45056: 549: memcpy(&v, out, sizeof(v)); 45056: 550: if (v==trns) { branch 0 taken 16% (fallthrough) branch 1 taken 84% -: 551: memcpy(out, &repl, sizeof(repl)); -: 552: } -: 553: } 576: 554:} -: 555: -: 556: -: 557:/* ---------------- */ -: 558:/* CMYK conversions */ -: 559:/* ---------------- */ -: 560: -: 561:static void function l2cmyk called 389 returned 100% blocks executed 100% 389: 562:l2cmyk(UINT8* out, const UINT8* in, int xsize) -: 563:{ -: 564: int x; 49576: 565: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 49187: 566: *out++ = 0; 49187: 567: *out++ = 0; 49187: 568: *out++ = 0; 49187: 569: *out++ = ~(*in++); -: 570: } 389: 571:} -: 572: -: 573:static void function la2cmyk called 128 returned 100% blocks executed 100% 128: 574:la2cmyk(UINT8* out, const UINT8* in, int xsize) -: 575:{ -: 576: int x; 16512: 577: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 578: *out++ = 0; 16384: 579: *out++ = 0; 16384: 580: *out++ = 0; 16384: 581: *out++ = ~(in[0]); -: 582: } 128: 583:} -: 584: -: 585:static void function rgb2cmyk called 1024 returned 100% blocks executed 100% 1024: 586:rgb2cmyk(UINT8* out, const UINT8* in, int xsize) -: 587:{ -: 588: int x; 164864: 589: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) branch 4 taken 99% branch 5 taken 1% (fallthrough) -: 590: /* Note: no undercolour removal */ 163840: 591: *out++ = ~(*in++); 163840: 592: *out++ = ~(*in++); 163840: 593: *out++ = ~(*in++); 163840: 594: *out++ = 0; in++; -: 595: } 1024: 596:} -: 597: -: 598:static void function cmyk2rgb called 1408 returned 100% blocks executed 100% 1408: 599:cmyk2rgb(UINT8* out, const UINT8* in, int xsize) -: 600:{ -: 601: int x, nk, tmp; 181632: 602: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 180224: 603: nk = 255 - in[3]; 180224: 604: out[0] = CLIP8(nk - MULDIV255(in[0], nk, tmp)); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% 180224: 605: out[1] = CLIP8(nk - MULDIV255(in[1], nk, tmp)); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% 180224: 606: out[2] = CLIP8(nk - MULDIV255(in[2], nk, tmp)); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% 180224: 607: out[3] = 255; 180224: 608: out += 4; 180224: 609: in += 4; -: 610: } 1408: 611:} -: 612: -: 613:static void function cmyk2hsv called 128 returned 100% blocks executed 100% 128: 614:cmyk2hsv(UINT8* out, const UINT8* in, int xsize) -: 615:{ -: 616: int x, nk, tmp; 16512: 617: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 618: nk = 255 - in[3]; 16384: 619: out[0] = CLIP8(nk - MULDIV255(in[0], nk, tmp)); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% 16384: 620: out[1] = CLIP8(nk - MULDIV255(in[1], nk, tmp)); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% 16384: 621: out[2] = CLIP8(nk - MULDIV255(in[2], nk, tmp)); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% 16384: 622: rgb2hsv_row(out, out); call 0 returned 100% 16384: 623: out[3] = 255; 16384: 624: out += 4; 16384: 625: in += 4; -: 626: } 128: 627:} -: 628: -: 629:/* ------------- */ -: 630:/* I conversions */ -: 631:/* ------------- */ -: 632: -: 633:static void function bit2i called 256 returned 100% blocks executed 100% 256: 634:bit2i(UINT8* out_, const UINT8* in, int xsize) -: 635:{ -: 636: int x; 32896: 637: for (x = 0; x < xsize; x++, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32640: 638: INT32 v = (*in++ != 0) ? 255 : 0; branch 0 taken 69% (fallthrough) branch 1 taken 31% 32640: 639: memcpy(out_, &v, sizeof(v)); -: 640: } 256: 641:} -: 642: -: 643:static void function l2i called 617345 returned 100% blocks executed 100% 617345: 644:l2i(UINT8* out_, const UINT8* in, int xsize) -: 645:{ -: 646: int x; 191584602: 647: for (x = 0; x < xsize; x++, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 190967257: 648: INT32 v = *in++; 190967257: 649: memcpy(out_, &v, sizeof(v)); -: 650: } 617345: 651:} -: 652: -: 653:static void function i2l called 313825 returned 100% blocks executed 100% 313825: 654:i2l(UINT8* out, const UINT8* in_, int xsize) -: 655:{ -: 656: int x; 96871322: 657: for (x = 0; x < xsize; x++, out++, in_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 658: INT32 v; 96557497: 659: memcpy(&v, in_, sizeof(v)); 96557497: 660: if (v <= 0) { branch 0 taken 86% (fallthrough) branch 1 taken 14% 82876779: 661: *out = 0; 13680718: 662: } else if (v >= 255) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 18918: 663: *out = 255; -: 664: } else { 13661800: 665: *out = (UINT8) v; -: 666: } -: 667: } 313825: 668:} -: 669: -: 670:static void function i2f called 326 returned 100% blocks executed 100% 326: 671:i2f(UINT8* out_, const UINT8* in_, int xsize) -: 672:{ -: 673: int x; 37196: 674: for (x = 0; x < xsize; x++, in_ += 4, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 675: INT32 i; -: 676: FLOAT32 f; 36870: 677: memcpy(&i, in_, sizeof(i)); 36870: 678: f = i; 36870: 679: memcpy(out_, &f, sizeof(f)); -: 680: } 326: 681:} -: 682: -: 683:static void function i2rgb called 513 returned 100% blocks executed 100% 513: 684:i2rgb(UINT8* out, const UINT8* in_, int xsize) -: 685:{ -: 686: int x; 513: 687: INT32* in = (INT32*) in_; 57858: 688: for (x = 0; x < xsize; x++, in++, out+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 57345: 689: if (*in <= 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 110: 690: out[0] = out[1] = out[2] = 0; 57235: 691: } else if (*in >= 255) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 1121: 692: out[0] = out[1] = out[2] = 255; -: 693: } else { 56114: 694: out[0] = out[1] = out[2] = (UINT8) *in; -: 695: } 57345: 696: out[3] = 255; -: 697: } 513: 698:} -: 699: -: 700:static void function i2hsv called 128 returned 100% blocks executed 89% 128: 701:i2hsv(UINT8* out, const UINT8* in_, int xsize) -: 702:{ -: 703: int x; 128: 704: INT32* in = (INT32*) in_; 16512: 705: for (x = 0; x < xsize; x++, in++, out+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 706: out[0] = 0; 16384: 707: out[1] = 0; 16384: 708: if (*in <= 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 709: out[2] = 0; 16384: 710: } else if (*in >= 255) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 711: out[2] = 255; -: 712: } else { 16383: 713: out[2] = (UINT8) *in; -: 714: } 16384: 715: out[3] = 255; -: 716: } 128: 717:} -: 718: -: 719:/* ------------- */ -: 720:/* F conversions */ -: 721:/* ------------- */ -: 722: -: 723:static void function bit2f called 128 returned 100% blocks executed 100% 128: 724:bit2f(UINT8* out_, const UINT8* in, int xsize) -: 725:{ -: 726: int x; 16512: 727: for (x = 0; x < xsize; x++, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 728: FLOAT32 f = (*in++ != 0) ? 255.0F : 0.0F; branch 0 taken 67% (fallthrough) branch 1 taken 33% 16384: 729: memcpy(out_, &f, sizeof(f)); -: 730: } 128: 731:} -: 732: -: 733:static void function l2f called 1037 returned 100% blocks executed 100% 1037: 734:l2f(UINT8* out_, const UINT8* in, int xsize) -: 735:{ -: 736: int x; 328760: 737: for (x = 0; x < xsize; x++, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 327723: 738: FLOAT32 f = (FLOAT32) *in++; 327723: 739: memcpy(out_, &f, sizeof(f)); -: 740: } 1037: 741:} -: 742: -: 743:static void function f2l called 5905 returned 100% blocks executed 100% 5905: 744:f2l(UINT8* out, const UINT8* in_, int xsize) -: 745:{ -: 746: int x; 1281663: 747: for (x = 0; x < xsize; x++, out++, in_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 748: FLOAT32 v; 1275758: 749: memcpy(&v, in_, sizeof(v)); 1275758: 750: if (v <= 0.0) { branch 0 taken 83% (fallthrough) branch 1 taken 17% 1055550: 751: *out = 0; 220208: 752: } else if (v >= 255.0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 12: 753: *out = 255; -: 754: } else { 220196: 755: *out = (UINT8) v; -: 756: } -: 757: } 5905: 758:} -: 759: -: 760:static void function f2i called 129 returned 100% blocks executed 100% 129: 761:f2i(UINT8* out_, const UINT8* in_, int xsize) -: 762:{ -: 763: int x; 16514: 764: for (x = 0; x < xsize; x++, in_ += 4, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 765: FLOAT32 f; -: 766: INT32 i; 16385: 767: memcpy(&f, in_, sizeof(f)); 16385: 768: i = f; 16385: 769: memcpy(out_, &i, sizeof(i)); -: 770: } 129: 771:} -: 772: -: 773:/* ----------------- */ -: 774:/* YCbCr conversions */ -: 775:/* ----------------- */ -: 776: -: 777:/* See ConvertYCbCr.c for RGB/YCbCr tables */ -: 778: -: 779:static void function l2ycbcr called 389 returned 100% blocks executed 100% 389: 780:l2ycbcr(UINT8* out, const UINT8* in, int xsize) -: 781:{ -: 782: int x; 49576: 783: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 49187: 784: *out++ = *in++; 49187: 785: *out++ = 128; 49187: 786: *out++ = 128; 49187: 787: *out++ = 255; -: 788: } 389: 789:} -: 790: -: 791:static void function la2ycbcr called 128 returned 100% blocks executed 100% 128: 792:la2ycbcr(UINT8* out, const UINT8* in, int xsize) -: 793:{ -: 794: int x; 16512: 795: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 796: *out++ = in[0]; 16384: 797: *out++ = 128; 16384: 798: *out++ = 128; 16384: 799: *out++ = 255; -: 800: } 128: 801:} -: 802: -: 803:static void function ycbcr2l called 128 returned 100% blocks executed 100% 128: 804:ycbcr2l(UINT8* out, const UINT8* in, int xsize) -: 805:{ -: 806: int x; 16512: 807: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 808: *out++ = in[0]; -: 809: } 128: 810:} -: 811: -: 812:static void function ycbcr2la called 128 returned 100% blocks executed 100% 128: 813:ycbcr2la(UINT8* out, const UINT8* in, int xsize) -: 814:{ -: 815: int x; 16512: 816: for (x = 0; x < xsize; x++, in += 4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 817: out[0] = out[1] = out[2] = in[0]; 16384: 818: out[3] = 255; -: 819: } 128: 820:} -: 821: -: 822:/* ------------------------- */ -: 823:/* I;16 (16-bit) conversions */ -: 824:/* ------------------------- */ -: 825: -: 826:static void function I_I16L called 544 returned 100% blocks executed 100% 544: 827:I_I16L(UINT8* out, const UINT8* in_, int xsize) -: 828:{ -: 829: int x, v; 54816: 830: for (x = 0; x < xsize; x++, in_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 831: INT32 i; 54272: 832: memcpy(&i, in_, sizeof(i)); 54272: 833: v = CLIP16(i); branch 0 taken 100% (fallthrough) branch 1 taken 0% 54272: 834: *out++ = (UINT8) v; 54272: 835: *out++ = (UINT8) (v >> 8); -: 836: } 544: 837:} -: 838: -: 839:static void function I_I16B called 256 returned 100% blocks executed 100% 256: 840:I_I16B(UINT8* out, const UINT8* in_, int xsize) -: 841:{ -: 842: int x, v; 20736: 843: for (x = 0; x < xsize; x++, in_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 844: INT32 i; 20480: 845: memcpy(&i, in_, sizeof(i)); 20480: 846: v = CLIP16(i); branch 0 taken 100% (fallthrough) branch 1 taken 0% 20480: 847: *out++ = (UINT8) (v >> 8); 20480: 848: *out++ = (UINT8) v; -: 849: } 256: 850:} -: 851: -: 852: -: 853:static void function I16L_I called 452 returned 100% blocks executed 100% 452: 854:I16L_I(UINT8* out_, const UINT8* in, int xsize) -: 855:{ -: 856: int x; 31956: 857: for (x = 0; x < xsize; x++, in += 2, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 31504: 858: INT32 v = in[0] + ((int) in[1] << 8); 31504: 859: memcpy(out_, &v, sizeof(v)); -: 860: } 452: 861:} -: 862: -: 863: -: 864:static void function I16B_I called 32 returned 100% blocks executed 100% 32: 865:I16B_I(UINT8* out_, const UINT8* in, int xsize) -: 866:{ -: 867: int x; 1056: 868: for (x = 0; x < xsize; x++, in += 2, out_ += 4) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 1024: 869: INT32 v = in[1] + ((int) in[0] << 8); 1024: 870: memcpy(out_, &v, sizeof(v)); -: 871: } 32: 872:} -: 873: -: 874:static void function I16L_F called 64 returned 100% blocks executed 100% 64: 875:I16L_F(UINT8* out_, const UINT8* in, int xsize) -: 876:{ -: 877: int x; 4160: 878: for (x = 0; x < xsize; x++, in += 2, out_ += 4) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 4096: 879: FLOAT32 v = in[0] + ((int) in[1] << 8); 4096: 880: memcpy(out_, &v, sizeof(v)); -: 881: } 64: 882:} -: 883: -: 884: -: 885:static void function I16B_F called 0 returned 0% blocks executed 0% #####: 886:I16B_F(UINT8* out_, const UINT8* in, int xsize) -: 887:{ -: 888: int x; #####: 889: for (x = 0; x < xsize; x++, in += 2, out_ += 4) { branch 0 never executed branch 1 never executed #####: 890: FLOAT32 v = in[1] + ((int) in[0] << 8); #####: 891: memcpy(out_, &v, sizeof(v)); -: 892: } #####: 893:} -: 894: -: 895:static void function L_I16L called 0 returned 0% blocks executed 0% #####: 896:L_I16L(UINT8* out, const UINT8* in, int xsize) -: 897:{ -: 898: int x; #####: 899: for (x = 0; x < xsize; x++, in++) { branch 0 never executed branch 1 never executed #####: 900: *out++ = *in; #####: 901: *out++ = 0; -: 902: } #####: 903:} -: 904: -: 905:static void function L_I16B called 0 returned 0% blocks executed 0% #####: 906:L_I16B(UINT8* out, const UINT8* in, int xsize) -: 907:{ -: 908: int x; #####: 909: for (x = 0; x < xsize; x++, in++) { branch 0 never executed branch 1 never executed #####: 910: *out++ = 0; #####: 911: *out++ = *in; -: 912: } #####: 913:} -: 914: -: 915:static void function I16L_L called 288 returned 100% blocks executed 86% 288: 916:I16L_L(UINT8* out, const UINT8* in, int xsize) -: 917:{ -: 918: int x; 34080: 919: for (x = 0; x < xsize; x++, in += 2) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 33792: 920: if (in[1] != 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 921: *out++ = 255; -: 922: } else { 33792: 923: *out++ = in[0]; -: 924: } -: 925: } 288: 926:} -: 927: -: 928:static void function I16B_L called 32 returned 100% blocks executed 86% 32: 929:I16B_L(UINT8* out, const UINT8* in, int xsize) -: 930:{ -: 931: int x; 1056: 932: for (x = 0; x < xsize; x++, in += 2) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 1024: 933: if (in[0] != 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 934: *out++ = 255; -: 935: } else { 1024: 936: *out++ = in[1]; -: 937: } -: 938: } 32: 939:} -: 940: -: 941:static struct { -: 942: const char* from; -: 943: const char* to; -: 944: ImagingShuffler convert; -: 945:} converters[] = { -: 946: -: 947: { "1", "L", bit2l }, -: 948: { "1", "I", bit2i }, -: 949: { "1", "F", bit2f }, -: 950: { "1", "RGB", bit2rgb }, -: 951: { "1", "RGBA", bit2rgb }, -: 952: { "1", "RGBX", bit2rgb }, -: 953: { "1", "CMYK", bit2cmyk }, -: 954: { "1", "YCbCr", bit2ycbcr }, -: 955: { "1", "HSV", bit2hsv }, -: 956: -: 957: { "L", "1", l2bit }, -: 958: { "L", "LA", l2la }, -: 959: { "L", "I", l2i }, -: 960: { "L", "F", l2f }, -: 961: { "L", "RGB", l2rgb }, -: 962: { "L", "RGBA", l2rgb }, -: 963: { "L", "RGBX", l2rgb }, -: 964: { "L", "CMYK", l2cmyk }, -: 965: { "L", "YCbCr", l2ycbcr }, -: 966: { "L", "HSV", l2hsv }, -: 967: -: 968: { "LA", "L", la2l }, -: 969: { "LA", "La", lA2la }, -: 970: { "LA", "RGB", la2rgb }, -: 971: { "LA", "RGBA", la2rgb }, -: 972: { "LA", "RGBX", la2rgb }, -: 973: { "LA", "CMYK", la2cmyk }, -: 974: { "LA", "YCbCr", la2ycbcr }, -: 975: { "LA", "HSV", la2hsv }, -: 976: -: 977: { "La", "LA", la2lA }, -: 978: -: 979: { "I", "L", i2l }, -: 980: { "I", "F", i2f }, -: 981: { "I", "RGB", i2rgb }, -: 982: { "I", "RGBA", i2rgb }, -: 983: { "I", "RGBX", i2rgb }, -: 984: { "I", "HSV", i2hsv }, -: 985: -: 986: { "F", "L", f2l }, -: 987: { "F", "I", f2i }, -: 988: -: 989: { "RGB", "1", rgb2bit }, -: 990: { "RGB", "L", rgb2l }, -: 991: { "RGB", "LA", rgb2la }, -: 992: { "RGB", "I", rgb2i }, -: 993: { "RGB", "F", rgb2f }, -: 994: { "RGB", "BGR;15", rgb2bgr15 }, -: 995: { "RGB", "BGR;16", rgb2bgr16 }, -: 996: { "RGB", "BGR;24", rgb2bgr24 }, -: 997: { "RGB", "RGBA", rgb2rgba }, -: 998: { "RGB", "RGBX", rgb2rgba }, -: 999: { "RGB", "CMYK", rgb2cmyk }, -: 1000: { "RGB", "YCbCr", ImagingConvertRGB2YCbCr }, -: 1001: { "RGB", "HSV", rgb2hsv }, -: 1002: -: 1003: { "RGBA", "1", rgb2bit }, -: 1004: { "RGBA", "L", rgb2l }, -: 1005: { "RGBA", "LA", rgba2la }, -: 1006: { "RGBA", "I", rgb2i }, -: 1007: { "RGBA", "F", rgb2f }, -: 1008: { "RGBA", "RGB", rgba2rgb }, -: 1009: { "RGBA", "RGBa", rgbA2rgba }, -: 1010: { "RGBA", "RGBX", rgb2rgba }, -: 1011: { "RGBA", "CMYK", rgb2cmyk }, -: 1012: { "RGBA", "YCbCr", ImagingConvertRGB2YCbCr }, -: 1013: { "RGBA", "HSV", rgb2hsv }, -: 1014: -: 1015: { "RGBa", "RGBA", rgba2rgbA }, -: 1016: -: 1017: { "RGBX", "1", rgb2bit }, -: 1018: { "RGBX", "L", rgb2l }, -: 1019: { "RGBX", "LA", rgb2la }, -: 1020: { "RGBX", "I", rgb2i }, -: 1021: { "RGBX", "F", rgb2f }, -: 1022: { "RGBX", "RGB", rgba2rgb }, -: 1023: { "RGBX", "CMYK", rgb2cmyk }, -: 1024: { "RGBX", "YCbCr", ImagingConvertRGB2YCbCr }, -: 1025: { "RGBX", "HSV", rgb2hsv }, -: 1026: -: 1027: { "CMYK", "RGB", cmyk2rgb }, -: 1028: { "CMYK", "RGBA", cmyk2rgb }, -: 1029: { "CMYK", "RGBX", cmyk2rgb }, -: 1030: { "CMYK", "HSV", cmyk2hsv }, -: 1031: -: 1032: { "YCbCr", "L", ycbcr2l }, -: 1033: { "YCbCr", "LA", ycbcr2la }, -: 1034: { "YCbCr", "RGB", ImagingConvertYCbCr2RGB }, -: 1035: -: 1036: { "HSV", "RGB", hsv2rgb }, -: 1037: -: 1038: { "I", "I;16", I_I16L }, -: 1039: { "I;16", "I", I16L_I }, -: 1040: { "L", "I;16", L_I16L }, -: 1041: { "I;16", "L", I16L_L }, -: 1042: -: 1043: { "I", "I;16L", I_I16L }, -: 1044: { "I;16L", "I", I16L_I }, -: 1045: { "I", "I;16B", I_I16B }, -: 1046: { "I;16B", "I", I16B_I }, -: 1047: -: 1048: { "L", "I;16L", L_I16L }, -: 1049: { "I;16L", "L", I16L_L }, -: 1050: { "L", "I;16B", L_I16B }, -: 1051: { "I;16B", "L", I16B_L }, -: 1052: -: 1053: { "I;16", "F", I16L_F }, -: 1054: { "I;16L", "F", I16L_F }, -: 1055: { "I;16B", "F", I16B_F }, -: 1056: -: 1057: { NULL } -: 1058:}; -: 1059: -: 1060:/* FIXME: translate indexed versions to pointer versions below this line */ -: 1061: -: 1062:/* ------------------- */ -: 1063:/* Palette conversions */ -: 1064:/* ------------------- */ -: 1065: -: 1066:static void function p2bit called 128 returned 100% blocks executed 100% 128: 1067:p2bit(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1068:{ -: 1069: int x; -: 1070: /* FIXME: precalculate greyscale palette? */ 16512: 1071: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1072: *out++ = (L(&palette[in[x]*4]) >= 128000) ? 255 : 0; branch 0 taken 69% (fallthrough) branch 1 taken 31% -: 1073: } 128: 1074:} -: 1075: -: 1076:static void function pa2bit called 128 returned 100% blocks executed 100% 128: 1077:pa2bit(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1078:{ -: 1079: int x; -: 1080: /* FIXME: precalculate greyscale palette? */ 16512: 1081: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1082: *out++ = (L(&palette[in[0]*4]) >= 128000) ? 255 : 0; branch 0 taken 69% (fallthrough) branch 1 taken 31% -: 1083: } 128: 1084:} -: 1085: -: 1086:static void function p2l called 9276 returned 100% blocks executed 100% 9276: 1087:p2l(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1088:{ -: 1089: int x; -: 1090: /* FIXME: precalculate greyscale palette? */ 2493970: 1091: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2484694: 1092: *out++ = L(&palette[in[x]*4]) / 1000; -: 1093: } 9276: 1094:} -: 1095: -: 1096:static void function pa2l called 128 returned 100% blocks executed 100% 128: 1097:pa2l(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1098:{ -: 1099: int x; -: 1100: /* FIXME: precalculate greyscale palette? */ 16512: 1101: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1102: *out++ = L(&palette[in[0]*4]) / 1000; -: 1103: } 128: 1104:} -: 1105: -: 1106:static void function p2pa called 129 returned 100% blocks executed 100% 129: 1107:p2pa(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1108:{ -: 1109: int x; 16514: 1110: for (x = 0; x < xsize; x++, in++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16385: 1111: const UINT8* rgba = &palette[in[0]]; 16385: 1112: *out++ = in[0]; 16385: 1113: *out++ = in[0]; 16385: 1114: *out++ = in[0]; 16385: 1115: *out++ = rgba[3]; -: 1116: } 129: 1117:} -: 1118: -: 1119:static void function p2la called 256 returned 100% blocks executed 100% 256: 1120:p2la(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1121:{ -: 1122: int x; -: 1123: /* FIXME: precalculate greyscale palette? */ 33024: 1124: for (x = 0; x < xsize; x++, out+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 1125: const UINT8* rgba = &palette[*in++ * 4]; 32768: 1126: out[0] = out[1] = out[2] = L(rgba) / 1000; 32768: 1127: out[3] = rgba[3]; -: 1128: } 256: 1129:} -: 1130: -: 1131:static void function pa2la called 128 returned 100% blocks executed 100% 128: 1132:pa2la(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1133:{ -: 1134: int x; -: 1135: /* FIXME: precalculate greyscale palette? */ 16512: 1136: for (x = 0; x < xsize; x++, in += 4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1137: out[0] = out[1] = out[2] = L(&palette[in[0]*4]) / 1000; 16384: 1138: out[3] = in[3]; -: 1139: } 128: 1140:} -: 1141: -: 1142:static void function p2i called 128 returned 100% blocks executed 100% 128: 1143:p2i(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) -: 1144:{ -: 1145: int x; 16512: 1146: for (x = 0; x < xsize; x++, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1147: INT32 v = L(&palette[in[x]*4]) / 1000; 16384: 1148: memcpy(out_, &v, sizeof(v)); -: 1149: } 128: 1150:} -: 1151: -: 1152:static void function pa2i called 128 returned 100% blocks executed 100% 128: 1153:pa2i(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) -: 1154:{ -: 1155: int x; 128: 1156: INT32* out = (INT32*) out_; 16512: 1157: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1158: *out++ = L(&palette[in[0]*4]) / 1000; -: 1159: } 128: 1160:} -: 1161: -: 1162:static void function p2f called 128 returned 100% blocks executed 100% 128: 1163:p2f(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) -: 1164:{ -: 1165: int x; 16512: 1166: for (x = 0; x < xsize; x++, out_ += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1167: FLOAT32 v = L(&palette[in[x]*4]) / 1000.0F; 16384: 1168: memcpy(out_, &v, sizeof(v)); -: 1169: } 128: 1170:} -: 1171: -: 1172:static void function pa2f called 128 returned 100% blocks executed 100% 128: 1173:pa2f(UINT8* out_, const UINT8* in, int xsize, const UINT8* palette) -: 1174:{ -: 1175: int x; 128: 1176: FLOAT32* out = (FLOAT32*) out_; 16512: 1177: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1178: *out++ = (float) L(&palette[in[0]*4]) / 1000.0F; -: 1179: } 128: 1180:} -: 1181: -: 1182:static void function p2rgb called 31696 returned 100% blocks executed 100% 31696: 1183:p2rgb(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1184:{ -: 1185: int x; 9528336: 1186: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) branch 4 taken 99% branch 5 taken 1% (fallthrough) 9496384: 1187: const UINT8* rgb = &palette[*in++ * 4]; 9496384: 1188: *out++ = rgb[0]; 9496384: 1189: *out++ = rgb[1]; 9496384: 1190: *out++ = rgb[2]; 9496384: 1191: *out++ = 255; -: 1192: } 31696: 1193:} -: 1194: -: 1195:static void function pa2rgb called 512 returned 100% blocks executed 100% 512: 1196:pa2rgb(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1197:{ -: 1198: int x; 99072: 1199: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) branch 4 taken 99% branch 5 taken 1% (fallthrough) 98304: 1200: const UINT8* rgb = &palette[in[0] * 4]; 98304: 1201: *out++ = rgb[0]; 98304: 1202: *out++ = rgb[1]; 98304: 1203: *out++ = rgb[2]; 98304: 1204: *out++ = 255; -: 1205: } 512: 1206:} -: 1207: -: 1208:static void function p2hsv called 128 returned 100% blocks executed 100% 128: 1209:p2hsv(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1210:{ -: 1211: int x; 16512: 1212: for (x = 0; x < xsize; x++, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1213: const UINT8* rgb = &palette[*in++ * 4]; 16384: 1214: rgb2hsv_row(out, rgb); call 0 returned 100% 16384: 1215: out[3] = 255; -: 1216: } 128: 1217:} -: 1218: -: 1219:static void function pa2hsv called 128 returned 100% blocks executed 100% 128: 1220:pa2hsv(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1221:{ -: 1222: int x; 16512: 1223: for (x = 0; x < xsize; x++, in += 4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1224: const UINT8* rgb = &palette[in[0] * 4]; 16384: 1225: rgb2hsv_row(out, rgb); call 0 returned 100% 16384: 1226: out[3] = 255; -: 1227: } 128: 1228:} -: 1229: -: 1230:static void function p2rgba called 73064 returned 100% blocks executed 100% 73064: 1231:p2rgba(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1232:{ -: 1233: int x; 18106192: 1234: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 18033128: 1235: const UINT8* rgba = &palette[*in++ * 4]; 18033128: 1236: *out++ = rgba[0]; 18033128: 1237: *out++ = rgba[1]; 18033128: 1238: *out++ = rgba[2]; 18033128: 1239: *out++ = rgba[3]; -: 1240: } 73064: 1241:} -: 1242: -: 1243:static void function pa2rgba called 256 returned 100% blocks executed 100% 256: 1244:pa2rgba(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1245:{ -: 1246: int x; 33024: 1247: for (x = 0; x < xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 1248: const UINT8* rgb = &palette[in[0] * 4]; 32768: 1249: *out++ = rgb[0]; 32768: 1250: *out++ = rgb[1]; 32768: 1251: *out++ = rgb[2]; 32768: 1252: *out++ = in[3]; -: 1253: } 256: 1254:} -: 1255: -: 1256:static void function p2cmyk called 128 returned 100% blocks executed 100% 128: 1257:p2cmyk(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1258:{ -: 1259: p2rgb(out, in, xsize, palette); 128: 1260: rgb2cmyk(out, out, xsize); 128: 1261:} -: 1262: -: 1263:static void function pa2cmyk called 128 returned 100% blocks executed 100% 128: 1264:pa2cmyk(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1265:{ -: 1266: pa2rgb(out, in, xsize, palette); 128: 1267: rgb2cmyk(out, out, xsize); 128: 1268:} -: 1269: -: 1270:static void function p2ycbcr called 128 returned 100% blocks executed 100% 128: 1271:p2ycbcr(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1272:{ 128: 1273: p2rgb(out, in, xsize, palette); 128: 1274: ImagingConvertRGB2YCbCr(out, out, xsize); call 0 returned 100% 128: 1275:} -: 1276: -: 1277:static void function pa2ycbcr called 128 returned 100% blocks executed 100% 128: 1278:pa2ycbcr(UINT8* out, const UINT8* in, int xsize, const UINT8* palette) -: 1279:{ 128: 1280: pa2rgb(out, in, xsize, palette); 128: 1281: ImagingConvertRGB2YCbCr(out, out, xsize); call 0 returned 100% 128: 1282:} -: 1283: -: 1284:static Imaging function frompalette called 696 returned 100% blocks executed 99% 696: 1285:frompalette(Imaging imOut, Imaging imIn, const char *mode) -: 1286:{ -: 1287: ImagingSectionCookie cookie; -: 1288: int alpha; -: 1289: int y; -: 1290: void (*convert)(UINT8*, const UINT8*, int, const UINT8*); -: 1291: -: 1292: /* Map palette image to L, RGB, RGBA, or CMYK */ -: 1293: 696: 1294: if (!imIn->palette) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1295: return (Imaging) ImagingError_ValueError("no palette"); call 0 never executed -: 1296: } -: 1297: 696: 1298: alpha = !strcmp(imIn->mode, "PA"); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 2% (fallthrough) branch 3 taken 98% -: 1299: 696: 1300: if (strcmp(mode, "1") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 1% (fallthrough) branch 3 taken 99% 2: 1301: convert = alpha ? pa2bit : p2bit; branch 0 taken 50% (fallthrough) branch 1 taken 50% 694: 1302: } else if (strcmp(mode, "L") == 0) { branch 0 taken 11% (fallthrough) branch 1 taken 89% branch 2 taken 11% (fallthrough) branch 3 taken 89% 74: 1303: convert = alpha ? pa2l : p2l; branch 0 taken 99% (fallthrough) branch 1 taken 1% 620: 1304: } else if (strcmp(mode, "LA") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 1% (fallthrough) branch 5 taken 99% 3: 1305: convert = alpha ? pa2la : p2la; branch 0 taken 67% (fallthrough) branch 1 taken 33% 617: 1306: } else if (strcmp(mode, "PA") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 67% (fallthrough) branch 3 taken 33% branch 4 taken 99% (fallthrough) branch 5 taken 1% -: 1307: convert = p2pa; 615: 1308: } else if (strcmp(mode, "I") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 1% (fallthrough) branch 3 taken 99% 2: 1309: convert = alpha ? pa2i : p2i; branch 0 taken 50% (fallthrough) branch 1 taken 50% 613: 1310: } else if (strcmp(mode, "F") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 1% (fallthrough) branch 3 taken 99% 2: 1311: convert = alpha ? pa2f : p2f; branch 0 taken 50% (fallthrough) branch 1 taken 50% 611: 1312: } else if (strcmp(mode, "RGB") == 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 38% (fallthrough) branch 7 taken 62% 231: 1313: convert = alpha ? pa2rgb : p2rgb; branch 0 taken 98% (fallthrough) branch 1 taken 2% 380: 1314: } else if (strcmp(mode, "RGBA") == 0) { branch 0 taken 98% (fallthrough) branch 1 taken 2% 371: 1315: convert = alpha ? pa2rgba : p2rgba; branch 0 taken 99% (fallthrough) branch 1 taken 1% 9: 1316: } else if (strcmp(mode, "RGBX") == 0) { branch 0 taken 22% (fallthrough) branch 1 taken 78% 2: 1317: convert = alpha ? pa2rgba : p2rgba; branch 0 taken 50% (fallthrough) branch 1 taken 50% 7: 1318: } else if (strcmp(mode, "CMYK") == 0) { branch 0 taken 29% (fallthrough) branch 1 taken 71% 2: 1319: convert = alpha ? pa2cmyk : p2cmyk; branch 0 taken 50% (fallthrough) branch 1 taken 50% 5: 1320: } else if (strcmp(mode, "YCbCr") == 0) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 2: 1321: convert = alpha ? pa2ycbcr : p2ycbcr; branch 0 taken 50% (fallthrough) branch 1 taken 50% 3: 1322: } else if (strcmp(mode, "HSV") == 0) { branch 0 taken 67% (fallthrough) branch 1 taken 33% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 67% (fallthrough) branch 7 taken 33% 2: 1323: convert = alpha ? pa2hsv : p2hsv; branch 0 taken 50% (fallthrough) branch 1 taken 50% -: 1324: } else { 1: 1325: return (Imaging) ImagingError_ValueError("conversion not supported"); call 0 returned 100% -: 1326: } -: 1327: 695: 1328: imOut = ImagingNew2Dirty(mode, imOut, imIn); call 0 returned 100% 695: 1329: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1330: return NULL; -: 1331: } -: 1332: 695: 1333: ImagingSectionEnter(&cookie); 117676: 1334: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 233962: 1335: (*convert)((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], call 0 returned 100% 116981: 1336: imIn->xsize, imIn->palette->palette); -: 1337: } 695: 1338: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1339: 695: 1340: return imOut; -: 1341:} -: 1342: -: 1343:#if defined(_MSC_VER) -: 1344:#pragma optimize("", off) -: 1345:#endif -: 1346:static Imaging function topalette called 130 returned 100% blocks executed 88% 130: 1347:topalette(Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalette, int dither) -: 1348:{ -: 1349: ImagingSectionCookie cookie; -: 1350: int alpha; -: 1351: int x, y; 130: 1352: ImagingPalette palette = inpalette;; -: 1353: -: 1354: /* Map L or RGB/RGBX/RGBA to palette image */ 130: 1355: if (strcmp(imIn->mode, "L") != 0 && strncmp(imIn->mode, "RGB", 3) != 0) { branch 0 taken 13% (fallthrough) branch 1 taken 87% branch 2 taken 88% (fallthrough) branch 3 taken 12% branch 4 taken 35% (fallthrough) branch 5 taken 65% 40: 1356: return (Imaging) ImagingError_ValueError("conversion not supported"); call 0 returned 100% -: 1357: } -: 1358: 90: 1359: alpha = !strcmp(mode, "PA"); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 40% (fallthrough) branch 3 taken 60% -: 1360: 90: 1361: if (palette == NULL) { branch 0 taken 94% (fallthrough) branch 1 taken 6% -: 1362: /* FIXME: make user configurable */ 85: 1363: if (imIn->bands == 1) { branch 0 taken 18% (fallthrough) branch 1 taken 82% 15: 1364: palette = ImagingPaletteNew("RGB"); /* Initialised to grey ramp */ call 0 returned 100% -: 1365: } else { 70: 1366: palette = ImagingPaletteNewBrowser(); /* Standard colour cube */ call 0 returned 100% -: 1367: } -: 1368: } -: 1369: 90: 1370: if (!palette) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1371: return (Imaging) ImagingError_ValueError("no palette"); call 0 never executed -: 1372: } -: 1373: 90: 1374: imOut = ImagingNew2Dirty(mode, imOut, imIn); call 0 returned 100% 90: 1375: if (!imOut) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1376: if (palette != inpalette) { branch 0 never executed branch 1 never executed #####: 1377: ImagingPaletteDelete(palette); call 0 never executed -: 1378: } -: 1379: return NULL; -: 1380: } -: 1381: 90: 1382: ImagingPaletteDelete(imOut->palette); call 0 returned 100% 90: 1383: imOut->palette = ImagingPaletteDuplicate(palette); call 0 returned 100% -: 1384: 90: 1385: if (imIn->bands == 1) { branch 0 taken 17% (fallthrough) branch 1 taken 83% -: 1386: /* greyscale image */ -: 1387: -: 1388: /* Greyscale palette: copy data as is */ 15: 1389: ImagingSectionEnter(&cookie); 2940: 1390: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 2925: 1391: if (alpha) { branch 0 taken 22% (fallthrough) branch 1 taken 78% 640: 1392: l2la((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], imIn->xsize); -: 1393: } else { 2285: 1394: memcpy(imOut->image[y], imIn->image[y], imIn->linesize); -: 1395: } -: 1396: } 15: 1397: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1398: -: 1399: } else { -: 1400: /* colour image */ -: 1401: -: 1402: /* Create mapping cache */ 75: 1403: if (ImagingPaletteCachePrepare(palette) < 0) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1404: ImagingDelete(imOut); call 0 never executed #####: 1405: if (palette != inpalette) { branch 0 never executed branch 1 never executed #####: 1406: ImagingPaletteDelete(palette); call 0 never executed -: 1407: } -: 1408: return NULL; -: 1409: } -: 1410: 75: 1411: if (dither) { branch 0 taken 97% (fallthrough) branch 1 taken 3% -: 1412: /* floyd-steinberg dither */ -: 1413: -: 1414: int* errors; 73: 1415: errors = calloc(imIn->xsize + 1, sizeof(int) * 3); 73: 1416: if (!errors) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1417: ImagingDelete(imOut); call 0 never executed #####: 1418: return ImagingError_MemoryError(); call 0 never executed -: 1419: } -: 1420: -: 1421: /* Map each pixel to the nearest palette entry */ 73: 1422: ImagingSectionEnter(&cookie); 5643: 1423: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) -: 1424: int r, r0, r1, r2; -: 1425: int g, g0, g1, g2; -: 1426: int b, b0, b1, b2; 5570: 1427: UINT8* in = (UINT8*) imIn->image[y]; 5570: 1428: UINT8* out = alpha ? (UINT8*) imOut->image32[y] : imOut->image8[y]; branch 0 taken 41% (fallthrough) branch 1 taken 59% 5570: 1429: int* e = errors; -: 1430: 5570: 1431: r = r0 = r1 = 0; 5570: 1432: g = g0 = g1 = 0; 5570: 1433: b = b0 = b1 = b2 = 0; -: 1434: 748404: 1435: for (x = 0; x < imIn->xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 1436: int d2; -: 1437: INT16* cache; -: 1438: 742834: 1439: r = CLIP8(in[0] + (r + e[3+0])/16); branch 0 taken 92% (fallthrough) branch 1 taken 8% 742834: 1440: g = CLIP8(in[1] + (g + e[3+1])/16); branch 0 taken 86% (fallthrough) branch 1 taken 14% 742834: 1441: b = CLIP8(in[2] + (b + e[3+2])/16); branch 0 taken 87% (fallthrough) branch 1 taken 13% -: 1442: -: 1443: /* get closest colour */ 742834: 1444: cache = &ImagingPaletteCache(palette, r, g, b); 742834: 1445: if (cache[0] == 0x100) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 5999: 1446: ImagingPaletteCacheUpdate(palette, r, g, b); call 0 returned 100% -: 1447: } 742834: 1448: if (alpha) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 294912: 1449: out[x*4] = out[x*4+1] = out[x*4+2] = (UINT8) cache[0]; 294912: 1450: out[x*4+3] = 255; -: 1451: } else { 447922: 1452: out[x] = (UINT8) cache[0]; -: 1453: } -: 1454: 742834: 1455: r -= (int) palette->palette[cache[0]*4]; 742834: 1456: g -= (int) palette->palette[cache[0]*4+1]; 742834: 1457: b -= (int) palette->palette[cache[0]*4+2]; -: 1458: -: 1459: /* propagate errors (don't ask ;-) */ 742834: 1460: r2 = r; d2 = r + r; r += d2; e[0] = r + r0; 742834: 1461: r += d2; r0 = r + r1; r1 = r2; r += d2; 742834: 1462: g2 = g; d2 = g + g; g += d2; e[1] = g + g0; 742834: 1463: g += d2; g0 = g + g1; g1 = g2; g += d2; 742834: 1464: b2 = b; d2 = b + b; b += d2; e[2] = b + b0; 742834: 1465: b += d2; b0 = b + b1; b1 = b2; b += d2; -: 1466: 742834: 1467: e += 3; -: 1468: -: 1469: } -: 1470: 5570: 1471: e[0] = b0; 5570: 1472: e[1] = b1; 5570: 1473: e[2] = b2; -: 1474: -: 1475: } 73: 1476: ImagingSectionLeave(&cookie); call 0 returned 100% 73: 1477: free(errors); -: 1478: -: 1479: } else { -: 1480: -: 1481: /* closest colour */ 2: 1482: ImagingSectionEnter(&cookie); 258: 1483: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) -: 1484: int r, g, b; 256: 1485: UINT8* in = (UINT8*) imIn->image[y]; 256: 1486: UINT8* out = alpha ? (UINT8*) imOut->image32[y] : imOut->image8[y]; branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 1487: 33024: 1488: for (x = 0; x < imIn->xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 1489: INT16* cache; -: 1490: 32768: 1491: r = in[0]; g = in[1]; b = in[2]; -: 1492: -: 1493: /* get closest colour */ 32768: 1494: cache = &ImagingPaletteCache(palette, r, g, b); 32768: 1495: if (cache[0] == 0x100) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 191: 1496: ImagingPaletteCacheUpdate(palette, r, g, b); call 0 returned 100% -: 1497: } 32768: 1498: if (alpha) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1499: out[x*4] = out[x*4+1] = out[x*4+2] = (UINT8) cache[0]; #####: 1500: out[x*4+3] = 255; -: 1501: } else { 32768: 1502: out[x] = (UINT8) cache[0]; -: 1503: } -: 1504: } -: 1505: } 2: 1506: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1507: -: 1508: } 75: 1509: if (inpalette != palette) { branch 0 taken 93% (fallthrough) branch 1 taken 7% 70: 1510: ImagingPaletteCacheDelete(palette); call 0 returned 100% -: 1511: } -: 1512: } -: 1513: 90: 1514: if (inpalette != palette) { branch 0 taken 94% (fallthrough) branch 1 taken 6% 85: 1515: ImagingPaletteDelete(palette); call 0 returned 100% -: 1516: } -: 1517: -: 1518: return imOut; -: 1519:} -: 1520: -: 1521:static Imaging function tobilevel.isra.0 called 55 returned 100% blocks executed 95% 55: 1522:tobilevel(Imaging imOut, Imaging imIn, int dither) -: 1523:{ -: 1524: ImagingSectionCookie cookie; -: 1525: int x, y; -: 1526: int* errors; -: 1527: -: 1528: /* Map L or RGB to dithered 1 image */ 55: 1529: if (strcmp(imIn->mode, "L") != 0 && strcmp(imIn->mode, "RGB") != 0) { branch 0 taken 18% (fallthrough) branch 1 taken 82% branch 2 taken 84% (fallthrough) branch 3 taken 16% branch 4 taken 57% (fallthrough) branch 5 taken 43% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 48% (fallthrough) branch 11 taken 52% 22: 1530: return (Imaging) ImagingError_ValueError("conversion not supported"); call 0 returned 100% -: 1531: } -: 1532: 33: 1533: imOut = ImagingNew2Dirty("1", imOut, imIn); call 0 returned 100% 33: 1534: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1535: return NULL; -: 1536: } -: 1537: 33: 1538: errors = calloc(imIn->xsize + 1, sizeof(int)); 33: 1539: if (!errors) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1540: ImagingDelete(imOut); call 0 never executed #####: 1541: return ImagingError_MemoryError(); call 0 never executed -: 1542: } -: 1543: 33: 1544: if (imIn->bands == 1) { branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 1545: -: 1546: /* map each pixel to black or white, using error diffusion */ 9: 1547: ImagingSectionEnter(&cookie); 2529: 1548: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) -: 1549: int l, l0, l1, l2, d2; 2520: 1550: UINT8* in = (UINT8*) imIn->image[y]; 2520: 1551: UINT8* out = imOut->image8[y]; -: 1552: 2520: 1553: l = l0 = l1 = 0; -: 1554: 2068102: 1555: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 1556: -: 1557: /* pick closest colour */ 2065582: 1558: l = CLIP8(in[x] + (l + errors[x+1])/16); branch 0 taken 99% (fallthrough) branch 1 taken 1% 2065582: 1559: out[x] = (l > 128) ? 255 : 0; branch 0 taken 67% (fallthrough) branch 1 taken 33% -: 1560: -: 1561: /* propagate errors */ 2065582: 1562: l -= (int) out[x]; 2065582: 1563: l2 = l; d2 = l + l; l += d2; errors[x] = l + l0; 2065582: 1564: l += d2; l0 = l + l1; l1 = l2; l += d2; -: 1565: } -: 1566: 2520: 1567: errors[x] = l0; -: 1568: -: 1569: } 9: 1570: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1571: -: 1572: } else { -: 1573: -: 1574: /* map each pixel to black or white, using error diffusion */ 24: 1575: ImagingSectionEnter(&cookie); 1432: 1576: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 98% branch 2 taken 2% (fallthrough) -: 1577: int l, l0, l1, l2, d2; 1408: 1578: UINT8* in = (UINT8*) imIn->image[y]; 1408: 1579: UINT8* out = imOut->image8[y]; -: 1580: 1408: 1581: l = l0 = l1 = 0; -: 1582: 181632: 1583: for (x = 0; x < imIn->xsize; x++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 1584: -: 1585: /* pick closest colour */ 180224: 1586: l = CLIP8(L(in)/1000 + (l + errors[x+1])/16); branch 0 taken 99% (fallthrough) branch 1 taken 1% 180224: 1587: out[x] = (l > 128) ? 255 : 0; branch 0 taken 67% (fallthrough) branch 1 taken 33% -: 1588: -: 1589: /* propagate errors */ 180224: 1590: l -= (int) out[x]; 180224: 1591: l2 = l; d2 = l + l; l += d2; errors[x] = l + l0; 180224: 1592: l += d2; l0 = l + l1; l1 = l2; l += d2; -: 1593: -: 1594: } -: 1595: 1408: 1596: errors[x] = l0; -: 1597: -: 1598: } 24: 1599: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1600: } -: 1601: 33: 1602: free(errors); -: 1603: -: 1604: return imOut; -: 1605:} -: 1606:#if defined(_MSC_VER) -: 1607:#pragma optimize("", on) -: 1608:#endif -: 1609: -: 1610:static Imaging function convert called 7902 returned 100% blocks executed 91% 7902: 1611:convert(Imaging imOut, Imaging imIn, const char *mode, -: 1612: ImagingPalette palette, int dither) -: 1613:{ -: 1614: ImagingSectionCookie cookie; -: 1615: ImagingShuffler convert; -: 1616: int y; -: 1617: 7902: 1618: if (!imIn) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1619: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 1620: } -: 1621: 7902: 1622: if (!mode) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 1623: /* Map palette image to full depth */ #####: 1624: if (!imIn->palette) { branch 0 never executed branch 1 never executed #####: 1625: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 1626: } #####: 1627: mode = imIn->palette->mode; -: 1628: } else { -: 1629: /* Same mode? */ 7902: 1630: if (!strcmp(imIn->mode, mode)) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 192: 1631: return ImagingCopy2(imOut, imIn); call 0 returned 100% -: 1632: } -: 1633: } -: 1634: -: 1635: -: 1636: /* test for special conversions */ -: 1637: 7710: 1638: if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "PA") == 0) { branch 0 taken 9% (fallthrough) branch 1 taken 91% branch 2 taken 91% (fallthrough) branch 3 taken 9% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 1% (fallthrough) branch 9 taken 99% 696: 1639: return frompalette(imOut, imIn, mode); call 0 returned 100% -: 1640: } -: 1641: 7014: 1642: if (strcmp(mode, "P") == 0 || strcmp(mode, "PA") == 0) { branch 0 taken 2% (fallthrough) branch 1 taken 98% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 1% (fallthrough) branch 9 taken 99% 130: 1643: return topalette(imOut, imIn, mode, palette, dither); call 0 returned 100% -: 1644: } -: 1645: 6884: 1646: if (dither && strcmp(mode, "1") == 0) { branch 0 taken 97% (fallthrough) branch 1 taken 3% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 99% (fallthrough) branch 5 taken 1% 55: 1647: return tobilevel(imOut, imIn, dither); call 0 returned 100% -: 1648: } -: 1649: -: 1650: -: 1651: /* standard conversion machinery */ -: 1652: -: 1653: convert = NULL; -: 1654: 166498: 1655: for (y = 0; converters[y].from; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 190540: 1656: if (!strcmp(imIn->mode, converters[y].from) && branch 0 taken 10% (fallthrough) branch 1 taken 90% branch 2 taken 39% (fallthrough) branch 3 taken 61% 17350: 1657: !strcmp(mode, converters[y].to)) { 6692: 1658: convert = converters[y].convert; 6692: 1659: break; -: 1660: } -: 1661: } -: 1662: 6829: 1663: if (!convert) { branch 0 taken 2% (fallthrough) branch 1 taken 98% -: 1664:#ifdef notdef -: 1665: return (Imaging) ImagingError_ValueError("conversion not supported"); -: 1666:#else -: 1667: static char buf[256]; -: 1668: /* FIXME: may overflow if mode is too large */ 274: 1669: sprintf(buf, "conversion from %s to %s not supported", imIn->mode, mode); 137: 1670: return (Imaging) ImagingError_ValueError(buf); call 0 returned 100% -: 1671:#endif -: 1672: } -: 1673: 6692: 1674: imOut = ImagingNew2Dirty(mode, imOut, imIn); call 0 returned 100% 6692: 1675: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1676: return NULL; -: 1677: } -: 1678: 6692: 1679: ImagingSectionEnter(&cookie); 1181390: 1680: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 1174698: 1681: (*convert)((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], call 0 returned 100% -: 1682: imIn->xsize); -: 1683: } 6692: 1684: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1685: 6692: 1686: return imOut; -: 1687:} -: 1688: -: 1689:Imaging function ImagingConvert called 7902 returned 100% blocks executed 100% 7902: 1690:ImagingConvert(Imaging imIn, const char *mode, -: 1691: ImagingPalette palette, int dither) -: 1692:{ 7902: 1693: return convert(NULL, imIn, mode, palette, dither); call 0 returned 100% -: 1694:} -: 1695: -: 1696:Imaging function ImagingConvert2 called 0 returned 0% blocks executed 0% #####: 1697:ImagingConvert2(Imaging imOut, Imaging imIn) -: 1698:{ #####: 1699: return convert(imOut, imIn, imOut->mode, NULL, 0); call 0 never executed -: 1700:} -: 1701: -: 1702: -: 1703:Imaging function ImagingConvertTransparent called 8 returned 100% blocks executed 95% 8: 1704:ImagingConvertTransparent(Imaging imIn, const char *mode, -: 1705: int r, int g, int b) -: 1706:{ -: 1707: ImagingSectionCookie cookie; -: 1708: ImagingShuffler convert; 8: 1709: Imaging imOut = NULL; -: 1710: int y; -: 1711: 8: 1712: if (!imIn){ branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1713: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 1714: } -: 1715: 22: 1716: if (!((strcmp(imIn->mode, "RGB") == 0 || branch 0 taken 25% (fallthrough) branch 1 taken 75% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 75% (fallthrough) branch 7 taken 25% branch 8 taken 67% (fallthrough) branch 9 taken 33% branch 10 taken 0% (fallthrough) branch 11 taken 100% 10: 1717: strcmp(imIn->mode, "1") == 0 || branch 0 taken 33% (fallthrough) branch 1 taken 67% branch 2 taken 50% (fallthrough) branch 3 taken 50% 6: 1718: strcmp(imIn->mode, "I") == 0 || branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 100% (fallthrough) branch 3 taken 0% 2: 1719: strcmp(imIn->mode, "L") == 0) branch 0 taken 100% (fallthrough) branch 1 taken 0% 8: 1720: && strcmp(mode, "RGBA") == 0)) -: 1721:#ifdef notdef -: 1722: { -: 1723: return (Imaging) ImagingError_ValueError("conversion not supported"); -: 1724: } -: 1725:#else -: 1726: { -: 1727: static char buf[256]; -: 1728: /* FIXME: may overflow if mode is too large */ #####: 1729: sprintf(buf, "conversion from %s to %s not supported in convert_transparent", imIn->mode, mode); #####: 1730: return (Imaging) ImagingError_ValueError(buf); call 0 never executed -: 1731: } -: 1732:#endif -: 1733: 8: 1734: if (strcmp(imIn->mode, "RGB") == 0) { branch 0 taken 25% (fallthrough) branch 1 taken 75% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 75% (fallthrough) branch 7 taken 25% -: 1735: convert = rgb2rgba; -: 1736: } else { 6: 1737: if (strcmp(imIn->mode, "1") == 0) { branch 0 taken 33% (fallthrough) branch 1 taken 67% branch 2 taken 67% (fallthrough) branch 3 taken 33% -: 1738: convert = bit2rgb; 4: 1739: } else if (strcmp(imIn->mode, "I") == 0) { branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 50% (fallthrough) branch 3 taken 50% -: 1740: convert = i2rgb; -: 1741: } else { 2: 1742: convert = l2rgb; -: 1743: } -: 1744: g = b = r; -: 1745: } -: 1746: 8: 1747: imOut = ImagingNew2Dirty(mode, imOut, imIn); call 0 returned 100% 8: 1748: if (!imOut){ branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1749: return NULL; -: 1750: } -: 1751: 8: 1752: ImagingSectionEnter(&cookie); 584: 1753: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 576: 1754: (*convert)((UINT8*) imOut->image[y], (UINT8*) imIn->image[y], call 0 returned 100% -: 1755: imIn->xsize); 576: 1756: rgbT2rgba((UINT8*) imOut->image[y], imIn->xsize, r, g, b); call 0 returned 100% -: 1757: } 8: 1758: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1759: 8: 1760: return imOut; -: 1761: -: 1762:} -: 1763: -: 1764:Imaging function ImagingConvertInPlace called 6 returned 100% blocks executed 100% 6: 1765:ImagingConvertInPlace(Imaging imIn, const char* mode) -: 1766:{ -: 1767: ImagingSectionCookie cookie; -: 1768: ImagingShuffler convert; -: 1769: int y; -: 1770: -: 1771: /* limited support for inplace conversion */ 6: 1772: if (strcmp(imIn->mode, "L") == 0 && strcmp(mode, "1") == 0) { branch 0 taken 33% (fallthrough) branch 1 taken 67% branch 2 taken 33% (fallthrough) branch 3 taken 67% branch 4 taken 50% (fallthrough) branch 5 taken 50% branch 6 taken 50% (fallthrough) branch 7 taken 50% -: 1773: convert = l2bit; 5: 1774: } else if (strcmp(imIn->mode, "1") == 0 && strcmp(mode, "L") == 0) { branch 0 taken 20% (fallthrough) branch 1 taken 80% branch 2 taken 20% (fallthrough) branch 3 taken 80% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% -: 1775: convert = bit2l; -: 1776: } else { 4: 1777: return ImagingError_ModeError(); call 0 returned 100% -: 1778: } -: 1779: 2: 1780: ImagingSectionEnter(&cookie); 4: 1781: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 50% branch 2 taken 50% (fallthrough) 2: 1782: (*convert)((UINT8*) imIn->image[y], (UINT8*) imIn->image[y], call 0 returned 100% -: 1783: imIn->xsize); -: 1784: } 2: 1785: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1786: 2: 1787: return imIn; -: 1788:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Resample.c.gcov -: 0:Source:src/libImaging/Resample.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Resample.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Resample.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:#include "Imaging.h" -: 2: -: 3:#include -: 4: -: 5: -: 6:#define ROUND_UP(f) ((int) ((f) >= 0.0 ? (f) + 0.5F : (f) - 0.5F)) -: 7: -: 8: -: 9:struct filter { -: 10: double (*filter)(double x); -: 11: double support; -: 12:}; -: 13: function box_filter called 280707 returned 100% blocks executed 75% 280707: 14:static inline double box_filter(double x) -: 15:{ 280707: 16: if (x > -0.5 && x <= 0.5) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 17: return 1.0; -: 18: } #####: 19: return 0.0; -: 20:} -: 21: function bilinear_filter called 19979 returned 100% blocks executed 100% 19979: 22:static inline double bilinear_filter(double x) -: 23:{ 19979: 24: if (x < 0.0) { branch 0 taken 46% (fallthrough) branch 1 taken 54% 9217: 25: x = -x; -: 26: } 19979: 27: if (x < 1.0) { branch 0 taken 96% (fallthrough) branch 1 taken 4% 19208: 28: return 1.0-x; -: 29: } -: 30: return 0.0; -: 31:} -: 32: function hamming_filter called 3616 returned 100% blocks executed 100% 3616: 33:static inline double hamming_filter(double x) -: 34:{ 3616: 35: if (x < 0.0) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 1810: 36: x = -x; -: 37: } 3616: 38: if (x == 0.0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 39: return 1.0; -: 40: } 3616: 41: if (x >= 1.0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 42: return 0.0; -: 43: } 3616: 44: x = x * M_PI; 3616: 45: return sin(x) / x * (0.54f + 0.46f * cos(x)); -: 46:} -: 47: function bicubic_filter called 6968196 returned 100% blocks executed 100% 6968196: 48:static inline double bicubic_filter(double x) -: 49:{ -: 50: /* https://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm */ -: 51:#define a -0.5 6968196: 52: if (x < 0.0) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 3482613: 53: x = -x; -: 54: } 6968196: 55: if (x < 1.0) { branch 0 taken 56% (fallthrough) branch 1 taken 44% 3884549: 56: return ((a + 2.0) * x - (a + 3.0)) * x*x + 1; -: 57: } 3083647: 58: if (x < 2.0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 3082259: 59: return (((x - 5) * x + 8) * x - 4) * a; -: 60: } -: 61: return 0.0; -: 62:#undef a -: 63:} -: 64: -: 65:static inline double sinc_filter(double x) -: 66:{ 181416: 67: if (x == 0.0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% -: 68: return 1.0; -: 69: } 181352: 70: x = x * M_PI; 181352: 71: return sin(x) / x; -: 72:} -: 73: function lanczos_filter called 90734 returned 100% blocks executed 100% 90734: 74:static inline double lanczos_filter(double x) -: 75:{ -: 76: /* truncated sinc */ 90734: 77: if (-3.0 <= x && x < 3.0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 99% (fallthrough) branch 3 taken 1% 181416: 78: return sinc_filter(x) * sinc_filter(x/3); -: 79: } -: 80: return 0.0; -: 81:} -: 82: -: 83:static struct filter BOX = { box_filter, 0.5 }; -: 84:static struct filter BILINEAR = { bilinear_filter, 1.0 }; -: 85:static struct filter HAMMING = { hamming_filter, 1.0 }; -: 86:static struct filter BICUBIC = { bicubic_filter, 2.0 }; -: 87:static struct filter LANCZOS = { lanczos_filter, 3.0 }; -: 88: -: 89: -: 90:/* 8 bits for result. Filter can have negative areas. -: 91: In one cases the sum of the coefficients will be negative, -: 92: in the other it will be more than 1.0. That is why we need -: 93: two extra bits for overflow and int type. */ -: 94:#define PRECISION_BITS (32 - 8 - 2) -: 95: -: 96: -: 97:/* Handles values form -640 to 639. */ -: 98:UINT8 _clip8_lookups[1280] = { -: 99: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 100: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 101: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 102: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 103: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 104: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 105: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 106: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 107: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 108: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 109: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 110: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 111: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 112: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 113: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 114: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 115: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 116: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 117: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 118: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 119: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 120: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 121: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 122: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 123: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 124: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 125: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 126: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 127: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 128: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 129: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 130: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 131: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 132: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 133: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 134: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 135: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 136: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 137: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 138: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -: 139: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -: 140: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, -: 141: 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, -: 142: 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -: 143: 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, -: 144: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, -: 145: 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, -: 146: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, -: 147: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, -: 148: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, -: 149: 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, -: 150: 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -: 151: 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, -: 152: 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, -: 153: 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, -: 154: 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, -: 155: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 156: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 157: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 158: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 159: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 160: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 161: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 162: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 163: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 164: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 165: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 166: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 167: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 168: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 169: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 170: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 171: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 172: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 173: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 174: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 175: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 176: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 177: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 178: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -: 179:}; -: 180: -: 181:UINT8 *clip8_lookups = &_clip8_lookups[640]; -: 182: -: 183:static inline UINT8 clip8(int in) -: 184:{ 46201071: 185: return clip8_lookups[in >> PRECISION_BITS]; -: 186:} -: 187: -: 188: -: 189:int function precompute_coeffs called 21741 returned 100% blocks executed 88% 21741: 190:precompute_coeffs(int inSize, float in0, float in1, int outSize, -: 191: struct filter *filterp, int **boundsp, double **kkp) { -: 192: double support, scale, filterscale; -: 193: double center, ww, ss; -: 194: int xx, x, ksize, xmin, xmax; -: 195: int *bounds; -: 196: double *kk, *k; -: 197: -: 198: /* prepare for horizontal stretch */ 21741: 199: filterscale = scale = (double) (in1 - in0) / outSize; 21741: 200: if (filterscale < 1.0) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 366: 201: filterscale = 1.0; -: 202: } -: 203: -: 204: /* determine support size (length of resampling filter) */ 21741: 205: support = filterp->support * filterscale; -: 206: -: 207: /* maximum number of coeffs */ 21741: 208: ksize = (int) ceil(support) * 2 + 1; -: 209: -: 210: // check for overflow 21741: 211: if (outSize > INT_MAX / (ksize * sizeof(double))) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2: 212: ImagingError_MemoryError(); call 0 returned 100% 2: 213: return 0; -: 214: } -: 215: -: 216: /* coefficient buffer */ -: 217: /* malloc check ok, overflow checked above */ 21739: 218: kk = malloc(outSize * ksize * sizeof(double)); 21739: 219: if ( ! kk) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 220: ImagingError_MemoryError(); call 0 never executed #####: 221: return 0; -: 222: } -: 223: -: 224: /* malloc check ok, ksize*sizeof(double) > 2*sizeof(int) */ 21739: 225: bounds = malloc(outSize * 2 * sizeof(int)); 21739: 226: if ( ! bounds) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 227: free(kk); #####: 228: ImagingError_MemoryError(); call 0 never executed #####: 229: return 0; -: 230: } -: 231: 196078: 232: for (xx = 0; xx < outSize; xx++) { branch 0 taken 90% branch 1 taken 10% (fallthrough) 196078: 233: center = in0 + (xx + 0.5) * scale; 196078: 234: ww = 0.0; 196078: 235: ss = 1.0 / filterscale; -: 236: // Round the value 196078: 237: xmin = (int) (center - support + 0.5); 196078: 238: if (xmin < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2676: 239: xmin = 0; -: 240: } -: 241: // Round the value 196078: 242: xmax = (int) (center + support + 0.5); 196078: 243: if (xmax > inSize) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 5274: 244: xmax = inSize; -: 245: } 196078: 246: xmax -= xmin; 196078: 247: k = &kk[xx * ksize]; 7559310: 248: for (x = 0; x < xmax; x++) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 7363232: 249: double w = filterp->filter((x + xmin - center + 0.5) * ss); call 0 returned 100% 7363232: 250: k[x] = w; 7363232: 251: ww += w; -: 252: } 7363232: 253: for (x = 0; x < xmax; x++) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 7363232: 254: if (ww != 0.0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 7363232: 255: k[x] /= ww; -: 256: } -: 257: } -: 258: // Remaining values should stay empty if they are used despite of xmax. 1931874: 259: for (; x < ksize; x++) { branch 0 taken 91% branch 1 taken 9% (fallthrough) 1931874: 260: k[x] = 0; -: 261: } 196078: 262: bounds[xx * 2 + 0] = xmin; 196078: 263: bounds[xx * 2 + 1] = xmax; -: 264: } 21739: 265: *boundsp = bounds; 21739: 266: *kkp = kk; 21739: 267: return ksize; -: 268:} -: 269: -: 270: -: 271:void function normalize_coeffs_8bpc called 21425 returned 100% blocks executed 100% 21425: 272:normalize_coeffs_8bpc(int outSize, int ksize, double *prekk) -: 273:{ -: 274: int x; -: 275: INT32 *kk; -: 276: -: 277: // use the same buffer for normalized coefficients 21425: 278: kk = (INT32 *) prekk; -: 279: 9015326: 280: for (x = 0; x < outSize * ksize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 8993901: 281: if (prekk[x] < 0) { branch 0 taken 34% (fallthrough) branch 1 taken 66% 3091603: 282: kk[x] = (int) (-0.5 + prekk[x] * (1 << PRECISION_BITS)); -: 283: } else { 5902298: 284: kk[x] = (int) (0.5 + prekk[x] * (1 << PRECISION_BITS)); -: 285: } -: 286: } 21425: 287:} -: 288: -: 289: -: 290: -: 291:void function ImagingResampleHorizontal_8bpc called 10711 returned 100% blocks executed 100% 10711: 292:ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, int offset, -: 293: int ksize, int *bounds, double *prekk) -: 294:{ -: 295: ImagingSectionCookie cookie; -: 296: int ss0, ss1, ss2, ss3; -: 297: int xx, yy, x, xmin, xmax; -: 298: INT32 *k, *kk; -: 299: -: 300: // use the same buffer for normalized coefficients 10711: 301: kk = (INT32 *) prekk; 10711: 302: normalize_coeffs_8bpc(imOut->xsize, ksize, prekk); call 0 returned 100% -: 303: 10711: 304: ImagingSectionEnter(&cookie); call 0 returned 100% 10711: 305: if (imIn->image8) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 22792: 306: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 1691949: 307: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1691949: 308: xmin = bounds[xx * 2 + 0]; 1691949: 309: xmax = bounds[xx * 2 + 1]; 1691949: 310: k = &kk[xx * ksize]; 1691949: 311: ss0 = 1 << (PRECISION_BITS -1); 28570110: 312: for (x = 0; x < xmax; x++) { branch 0 taken 94% branch 1 taken 6% (fallthrough) 26878161: 313: ss0 += ((UINT8) imIn->image8[yy + offset][x + xmin]) * k[x]; -: 314: } 3383898: 315: imOut->image8[yy][xx] = clip8(ss0); -: 316: } -: 317: } 10586: 318: } else if (imIn->type == IMAGING_TYPE_UINT8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 10586: 319: if (imIn->bands == 2) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 32543: 320: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 2851373: 321: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 322: UINT32 v; 2851373: 323: xmin = bounds[xx * 2 + 0]; 2851373: 324: xmax = bounds[xx * 2 + 1]; 2851373: 325: k = &kk[xx * ksize]; 2851373: 326: ss0 = ss3 = 1 << (PRECISION_BITS -1); 13852432: 327: for (x = 0; x < xmax; x++) { branch 0 taken 79% branch 1 taken 21% (fallthrough) 11001059: 328: ss0 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 0]) * k[x]; 11001059: 329: ss3 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 3]) * k[x]; -: 330: } 5702746: 331: v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); 5702746: 332: memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); -: 333: } -: 334: } 10453: 335: } else if (imIn->bands == 3) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 122407: 336: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 92% (fallthrough) branch 1 taken 8% 2762142: 337: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 96% branch 1 taken 4% (fallthrough) -: 338: UINT32 v; 2762142: 339: xmin = bounds[xx * 2 + 0]; 2762142: 340: xmax = bounds[xx * 2 + 1]; 2762142: 341: k = &kk[xx * ksize]; 2762142: 342: ss0 = ss1 = ss2 = 1 << (PRECISION_BITS -1); 22081149: 343: for (x = 0; x < xmax; x++) { branch 0 taken 87% branch 1 taken 13% (fallthrough) 19319007: 344: ss0 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 0]) * k[x]; 19319007: 345: ss1 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 1]) * k[x]; 19319007: 346: ss2 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 2]) * k[x]; -: 347: } 8286426: 348: v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), 0); 5524284: 349: memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); -: 350: } -: 351: } -: 352: } else { 35869: 353: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 3267021: 354: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 355: UINT32 v; 3267021: 356: xmin = bounds[xx * 2 + 0]; 3267021: 357: xmax = bounds[xx * 2 + 1]; 3267021: 358: k = &kk[xx * ksize]; 3267021: 359: ss0 = ss1 = ss2 = ss3 = 1 << (PRECISION_BITS -1); 23152920: 360: for (x = 0; x < xmax; x++) { branch 0 taken 86% branch 1 taken 14% (fallthrough) 19885899: 361: ss0 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 0]) * k[x]; 19885899: 362: ss1 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 1]) * k[x]; 19885899: 363: ss2 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 2]) * k[x]; 19885899: 364: ss3 += ((UINT8) imIn->image[yy + offset][(x + xmin)*4 + 3]) * k[x]; -: 365: } 13068084: 366: v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); 6534042: 367: memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); -: 368: } -: 369: } -: 370: } -: 371: } 10711: 372: ImagingSectionLeave(&cookie); call 0 returned 100% 10711: 373:} -: 374: -: 375: -: 376:void function ImagingResampleVertical_8bpc called 10714 returned 100% blocks executed 100% 10714: 377:ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, int offset, -: 378: int ksize, int *bounds, double *prekk) -: 379:{ -: 380: ImagingSectionCookie cookie; -: 381: int ss0, ss1, ss2, ss3; -: 382: int xx, yy, y, ymin, ymax; -: 383: INT32 *k, *kk; -: 384: -: 385: // use the same buffer for normalized coefficients 10714: 386: kk = (INT32 *) prekk; 10714: 387: normalize_coeffs_8bpc(imOut->ysize, ksize, prekk); call 0 returned 100% -: 388: 10714: 389: ImagingSectionEnter(&cookie); call 0 returned 100% 10714: 390: if (imIn->image8) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 6175: 391: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 98% branch 1 taken 2% 6175: 392: k = &kk[yy * ksize]; 6175: 393: ymin = bounds[yy * 2 + 0]; 6175: 394: ymax = bounds[yy * 2 + 1]; 985467: 395: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 396: ss0 = 1 << (PRECISION_BITS -1); 5206623: 397: for (y = 0; y < ymax; y++) { branch 0 taken 84% branch 1 taken 16% (fallthrough) 5206623: 398: ss0 += ((UINT8) imIn->image8[y + ymin][xx]) * k[y]; -: 399: } 1958584: 400: imOut->image8[yy][xx] = clip8(ss0); -: 401: } -: 402: } 10593: 403: } else if (imIn->type == IMAGING_TYPE_UINT8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 10593: 404: if (imIn->bands == 2) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 7041: 405: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 98% branch 1 taken 2% 7041: 406: k = &kk[yy * ksize]; 7041: 407: ymin = bounds[yy * 2 + 0]; 7041: 408: ymax = bounds[yy * 2 + 1]; 1479338: 409: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 410: UINT32 v; -: 411: ss0 = ss3 = 1 << (PRECISION_BITS -1); 5036777: 412: for (y = 0; y < ymax; y++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 5036777: 413: ss0 += ((UINT8) imIn->image[y + ymin][xx*4 + 0]) * k[y]; 5036777: 414: ss3 += ((UINT8) imIn->image[y + ymin][xx*4 + 3]) * k[y]; -: 415: } 2944594: 416: v = MAKE_UINT32(clip8(ss0), 0, 0, clip8(ss3)); 2944594: 417: memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); -: 418: } -: 419: } 10457: 420: } else if (imIn->bands == 3) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 33287: 421: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 76% branch 1 taken 24% 33287: 422: k = &kk[yy * ksize]; 33287: 423: ymin = bounds[yy * 2 + 0]; 33287: 424: ymax = bounds[yy * 2 + 1]; 2455295: 425: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 426: UINT32 v; -: 427: ss0 = ss1 = ss2 = 1 << (PRECISION_BITS -1); 10788207: 428: for (y = 0; y < ymax; y++) { branch 0 taken 82% branch 1 taken 18% (fallthrough) 10788207: 429: ss0 += ((UINT8) imIn->image[y + ymin][xx*4 + 0]) * k[y]; 10788207: 430: ss1 += ((UINT8) imIn->image[y + ymin][xx*4 + 1]) * k[y]; 10788207: 431: ss2 += ((UINT8) imIn->image[y + ymin][xx*4 + 2]) * k[y]; -: 432: } 7266024: 433: v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), 0); 4844016: 434: memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); -: 435: } -: 436: } -: 437: } else { 7905: 438: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 7905: 439: k = &kk[yy * ksize]; 7905: 440: ymin = bounds[yy * 2 + 0]; 7905: 441: ymax = bounds[yy * 2 + 1]; 1573394: 442: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 443: UINT32 v; -: 444: ss0 = ss1 = ss2 = ss3 = 1 << (PRECISION_BITS -1); 6835869: 445: for (y = 0; y < ymax; y++) { branch 0 taken 81% branch 1 taken 19% (fallthrough) 6835869: 446: ss0 += ((UINT8) imIn->image[y + ymin][xx*4 + 0]) * k[y]; 6835869: 447: ss1 += ((UINT8) imIn->image[y + ymin][xx*4 + 1]) * k[y]; 6835869: 448: ss2 += ((UINT8) imIn->image[y + ymin][xx*4 + 2]) * k[y]; 6835869: 449: ss3 += ((UINT8) imIn->image[y + ymin][xx*4 + 3]) * k[y]; -: 450: } 6261956: 451: v = MAKE_UINT32(clip8(ss0), clip8(ss1), clip8(ss2), clip8(ss3)); 3130978: 452: memcpy(imOut->image[yy] + xx * sizeof(v), &v, sizeof(v)); -: 453: } -: 454: } -: 455: } -: 456: } 10714: 457: ImagingSectionLeave(&cookie); call 0 returned 100% 10714: 458:} -: 459: -: 460: -: 461:void function ImagingResampleHorizontal_32bpc called 90 returned 100% blocks executed 100% 90: 462:ImagingResampleHorizontal_32bpc(Imaging imOut, Imaging imIn, int offset, -: 463: int ksize, int *bounds, double *kk) -: 464:{ -: 465: ImagingSectionCookie cookie; -: 466: double ss; -: 467: int xx, yy, x, xmin, xmax; -: 468: double *k; -: 469: 90: 470: ImagingSectionEnter(&cookie); call 0 returned 100% 90: 471: switch(imIn->type) { branch 0 taken 49% branch 1 taken 51% branch 2 taken 0% -: 472: case IMAGING_TYPE_INT32: 11501: 473: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 994987: 474: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 994987: 475: xmin = bounds[xx * 2 + 0]; 994987: 476: xmax = bounds[xx * 2 + 1]; 994987: 477: k = &kk[xx * ksize]; 994987: 478: ss = 0.0; 5068456: 479: for (x = 0; x < xmax; x++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 4073469: 480: ss += IMAGING_PIXEL_I(imIn, x + xmin, yy + offset) * k[x]; -: 481: } 994987: 482: IMAGING_PIXEL_I(imOut, xx, yy) = ROUND_UP(ss); branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 483: } -: 484: } -: 485: break; -: 486: -: 487: case IMAGING_TYPE_FLOAT32: 11323: 488: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 989291: 489: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 989291: 490: xmin = bounds[xx * 2 + 0]; 989291: 491: xmax = bounds[xx * 2 + 1]; 989291: 492: k = &kk[xx * ksize]; 989291: 493: ss = 0.0; 5031608: 494: for (x = 0; x < xmax; x++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 4042317: 495: ss += IMAGING_PIXEL_F(imIn, x + xmin, yy + offset) * k[x]; -: 496: } 989291: 497: IMAGING_PIXEL_F(imOut, xx, yy) = ss; -: 498: } -: 499: } -: 500: break; -: 501: } 90: 502: ImagingSectionLeave(&cookie); call 0 returned 100% 90: 503:} -: 504: -: 505: -: 506:void function ImagingResampleVertical_32bpc called 92 returned 100% blocks executed 100% 92: 507:ImagingResampleVertical_32bpc(Imaging imOut, Imaging imIn, int offset, -: 508: int ksize, int *bounds, double *kk) -: 509:{ -: 510: ImagingSectionCookie cookie; -: 511: double ss; -: 512: int xx, yy, y, ymin, ymax; -: 513: double *k; -: 514: 92: 515: ImagingSectionEnter(&cookie); call 0 returned 100% 92: 516: switch(imIn->type) { branch 0 taken 49% branch 1 taken 51% branch 2 taken 0% -: 517: case IMAGING_TYPE_INT32: 4730: 518: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 99% branch 1 taken 1% 4730: 519: ymin = bounds[yy * 2 + 0]; 4730: 520: ymax = bounds[yy * 2 + 1]; 4730: 521: k = &kk[yy * ksize]; 561725: 522: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 523: ss = 0.0; 2005613: 524: for (y = 0; y < ymax; y++) { branch 0 taken 78% branch 1 taken 22% (fallthrough) 2005613: 525: ss += IMAGING_PIXEL_I(imIn, xx, y + ymin) * k[y]; -: 526: } 556995: 527: IMAGING_PIXEL_I(imOut, xx, yy) = ROUND_UP(ss); branch 0 taken 98% (fallthrough) branch 1 taken 2% -: 528: } -: 529: } -: 530: break; -: 531: -: 532: case IMAGING_TYPE_FLOAT32: 4666: 533: for (yy = 0; yy < imOut->ysize; yy++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 4666: 534: ymin = bounds[yy * 2 + 0]; 4666: 535: ymax = bounds[yy * 2 + 1]; 4666: 536: k = &kk[yy * ksize]; 559613: 537: for (xx = 0; xx < imOut->xsize; xx++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 538: ss = 0.0; 1994413: 539: for (y = 0; y < ymax; y++) { branch 0 taken 78% branch 1 taken 22% (fallthrough) 1994413: 540: ss += IMAGING_PIXEL_F(imIn, xx, y + ymin) * k[y]; -: 541: } 554947: 542: IMAGING_PIXEL_F(imOut, xx, yy) = ss; -: 543: } -: 544: } -: 545: break; -: 546: } 92: 547: ImagingSectionLeave(&cookie); call 0 returned 100% 92: 548:} -: 549: -: 550: -: 551:typedef void (*ResampleFunction)(Imaging imOut, Imaging imIn, int offset, -: 552: int ksize, int *bounds, double *kk); -: 553: -: 554: -: 555:Imaging -: 556:ImagingResampleInner(Imaging imIn, int xsize, int ysize, -: 557: struct filter *filterp, float box[4], -: 558: ResampleFunction ResampleHorizontal, -: 559: ResampleFunction ResampleVertical); -: 560: -: 561: -: 562:Imaging function ImagingResample called 10875 returned 100% blocks executed 95% 10875: 563:ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]) -: 564:{ -: 565: struct filter *filterp; -: 566: ResampleFunction ResampleHorizontal; -: 567: ResampleFunction ResampleVertical; -: 568: 10875: 569: if (strcmp(imIn->mode, "P") == 0 || strcmp(imIn->mode, "1") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 1% (fallthrough) branch 7 taken 99% 2: 570: return (Imaging) ImagingError_ModeError(); call 0 returned 100% -: 571: } -: 572: 10873: 573: if (imIn->type == IMAGING_TYPE_SPECIAL) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 574: return (Imaging) ImagingError_ModeError(); call 0 returned 100% 10872: 575: } else if (imIn->image8) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 576: ResampleHorizontal = ImagingResampleHorizontal_8bpc; -: 577: ResampleVertical = ImagingResampleVertical_8bpc; -: 578: } else { 10736: 579: switch(imIn->type) { branch 0 taken 1% branch 1 taken 0% branch 2 taken 99% -: 580: case IMAGING_TYPE_UINT8: -: 581: ResampleHorizontal = ImagingResampleHorizontal_8bpc; -: 582: ResampleVertical = ImagingResampleVertical_8bpc; -: 583: break; -: 584: case IMAGING_TYPE_INT32: -: 585: case IMAGING_TYPE_FLOAT32: 102: 586: ResampleHorizontal = ImagingResampleHorizontal_32bpc; 102: 587: ResampleVertical = ImagingResampleVertical_32bpc; 102: 588: break; -: 589: default: #####: 590: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 591: } -: 592: } -: 593: -: 594: /* check filter */ 10872: 595: switch (filter) { branch 0 taken 1% branch 1 taken 1% branch 2 taken 94% branch 3 taken 1% branch 4 taken 1% branch 5 taken 4% -: 596: case IMAGING_TRANSFORM_BOX: -: 597: filterp = &BOX; -: 598: break; -: 599: case IMAGING_TRANSFORM_BILINEAR: 71: 600: filterp = &BILINEAR; 71: 601: break; -: 602: case IMAGING_TRANSFORM_HAMMING: 40: 603: filterp = &HAMMING; 40: 604: break; -: 605: case IMAGING_TRANSFORM_BICUBIC: 10234: 606: filterp = &BICUBIC; 10234: 607: break; -: 608: case IMAGING_TRANSFORM_LANCZOS: 68: 609: filterp = &LANCZOS; 68: 610: break; -: 611: default: 1: 612: return (Imaging) ImagingError_ValueError( call 0 returned 100% -: 613: "unsupported resampling filter" -: 614: ); -: 615: } -: 616: 10871: 617: return ImagingResampleInner(imIn, xsize, ysize, filterp, box, call 0 returned 100% -: 618: ResampleHorizontal, ResampleVertical); -: 619:} -: 620: -: 621: -: 622:Imaging function ImagingResampleInner called 10871 returned 100% blocks executed 94% 10871: 623:ImagingResampleInner(Imaging imIn, int xsize, int ysize, -: 624: struct filter *filterp, float box[4], -: 625: ResampleFunction ResampleHorizontal, -: 626: ResampleFunction ResampleVertical) -: 627:{ 10871: 628: Imaging imTemp = NULL; 10871: 629: Imaging imOut = NULL; -: 630: -: 631: int i, need_horizontal, need_vertical; -: 632: int ybox_first, ybox_last; -: 633: int ksize_horiz, ksize_vert; -: 634: int *bounds_horiz, *bounds_vert; -: 635: double *kk_horiz, *kk_vert; -: 636: 10871: 637: need_horizontal = xsize != imIn->xsize || box[0] || box[2] != xsize; branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 100% (fallthrough) branch 5 taken 0% 10871: 638: need_vertical = ysize != imIn->ysize || box[1] || box[3] != ysize; branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 98% (fallthrough) branch 3 taken 2% branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 639: 10871: 640: ksize_horiz = precompute_coeffs(imIn->xsize, box[0], box[2], xsize, call 0 returned 100% -: 641: filterp, &bounds_horiz, &kk_horiz); 10871: 642: if ( ! ksize_horiz) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 643: return NULL; -: 644: } -: 645: 10870: 646: ksize_vert = precompute_coeffs(imIn->ysize, box[1], box[3], ysize, call 0 returned 100% -: 647: filterp, &bounds_vert, &kk_vert); 10870: 648: if ( ! ksize_vert) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 649: free(bounds_horiz); 1: 650: free(kk_horiz); 1: 651: return NULL; -: 652: } -: 653: -: 654: // First used row in the source image 10869: 655: ybox_first = bounds_vert[0]; -: 656: // Last used row in the source image 10869: 657: ybox_last = bounds_vert[ysize*2 - 2] + bounds_vert[ysize*2 - 1]; -: 658: -: 659: -: 660: /* two-pass resize, horizontal pass */ 10869: 661: if (need_horizontal) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 662: // Shift bounds for vertical pass 82859: 663: for (i = 0; i < ysize; i++) { branch 0 taken 88% branch 1 taken 12% (fallthrough) 82859: 664: bounds_vert[i * 2] -= ybox_first; -: 665: } -: 666: 10801: 667: imTemp = ImagingNewDirty(imIn->mode, xsize, ybox_last - ybox_first); call 0 returned 100% 10801: 668: if (imTemp) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 10801: 669: ResampleHorizontal(imTemp, imIn, ybox_first, call 0 returned 100% -: 670: ksize_horiz, bounds_horiz, kk_horiz); -: 671: } 10801: 672: free(bounds_horiz); 10801: 673: free(kk_horiz); 10801: 674: if ( ! imTemp) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 675: free(bounds_vert); #####: 676: free(kk_vert); #####: 677: return NULL; -: 678: } -: 679: imOut = imIn = imTemp; -: 680: } else { -: 681: // Free in any case 68: 682: free(bounds_horiz); 68: 683: free(kk_horiz); -: 684: } -: 685: -: 686: /* vertical pass */ 10869: 687: if (need_vertical) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 10806: 688: imOut = ImagingNewDirty(imIn->mode, imIn->xsize, ysize); call 0 returned 100% 10806: 689: if (imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 690: /* imIn can be the original image or horizontally resampled one */ 10806: 691: ResampleVertical(imOut, imIn, 0, call 0 returned 100% -: 692: ksize_vert, bounds_vert, kk_vert); -: 693: } -: 694: /* it's safe to call ImagingDelete with empty value -: 695: if previous step was not performed. */ 10806: 696: ImagingDelete(imTemp); call 0 returned 100% 10806: 697: free(bounds_vert); 10806: 698: free(kk_vert); 10806: 699: if ( ! imOut) { branch 0 taken 100% branch 1 taken 0% -: 700: return NULL; -: 701: } -: 702: } else { -: 703: // Free in any case 63: 704: free(bounds_vert); 63: 705: free(kk_vert); -: 706: } -: 707: -: 708: /* none of the previous steps are performed, copying */ 10869: 709: if ( ! imOut) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 710: imOut = ImagingCopy(imIn); call 0 never executed -: 711: } -: 712: -: 713: return imOut; -: 714:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Palette.c.gcov -: 0:Source:src/libImaging/Palette.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Palette.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Palette.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * imaging palette object -: 6: * -: 7: * history: -: 8: * 1996-05-05 fl Added to library -: 9: * 1996-05-27 fl Added colour mapping stuff -: 10: * 1997-05-12 fl Support RGBA palettes -: 11: * 2005-02-09 fl Removed grayscale entries from web palette -: 12: * -: 13: * Copyright (c) Secret Labs AB 1997-2005. All rights reserved. -: 14: * Copyright (c) Fredrik Lundh 1995-1997. -: 15: * -: 16: * See the README file for information on usage and redistribution. -: 17: */ -: 18: -: 19: -: 20:#include "Imaging.h" -: 21: -: 22:#include -: 23: -: 24: -: 25:ImagingPalette function ImagingPaletteNew called 3048 returned 100% blocks executed 77% 3048: 26:ImagingPaletteNew(const char* mode) -: 27:{ -: 28: /* Create a palette object */ -: 29: -: 30: int i; -: 31: ImagingPalette palette; -: 32: 3048: 33: if (strcmp(mode, "RGB") && strcmp(mode, "RGBA")) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 never executed branch 9 never executed #####: 34: return (ImagingPalette) ImagingError_ModeError(); call 0 never executed -: 35: } -: 36: 3048: 37: palette = calloc(1, sizeof(struct ImagingPaletteInstance)); 3048: 38: if (!palette) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 39: return (ImagingPalette) ImagingError_MemoryError(); call 0 never executed -: 40: } -: 41: 6096: 42: strncpy(palette->mode, mode, IMAGING_MODE_LENGTH-1); 3048: 43: palette->mode[IMAGING_MODE_LENGTH-1] = 0; -: 44: -: 45: /* Initialize to ramp */ 783336: 46: for (i = 0; i < 256; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 780288: 47: palette->palette[i*4+0] = 1560576: 48: palette->palette[i*4+1] = 780288: 49: palette->palette[i*4+2] = (UINT8) i; 780288: 50: palette->palette[i*4+3] = 255; /* opaque */ -: 51: } -: 52: -: 53: return palette; -: 54:} -: 55: -: 56:ImagingPalette function ImagingPaletteNewBrowser called 70 returned 100% blocks executed 100% 70: 57:ImagingPaletteNewBrowser(void) -: 58:{ -: 59: /* Create a standard "browser" palette object */ -: 60: -: 61: int i, r, g, b; -: 62: ImagingPalette palette; -: 63: 70: 64: palette = ImagingPaletteNew("RGB"); call 0 returned 100% 70: 65: if (!palette) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 66: return NULL; -: 67: } -: 68: -: 69: /* Blank out unused entries */ -: 70: /* FIXME: Add 10-level windows palette here? */ -: 71: 700: 72: for (i = 0; i < 10; i++) { branch 0 taken 91% branch 1 taken 9% (fallthrough) 700: 73: palette->palette[i*4+0] = 1400: 74: palette->palette[i*4+1] = 700: 75: palette->palette[i*4+2] = 0; -: 76: } -: 77: -: 78: /* Simple 6x6x6 colour cube */ -: 79: 420: 80: for (b = 0; b < 256; b += 51) { branch 0 taken 86% (fallthrough) branch 1 taken 14% 2520: 81: for (g = 0; g < 256; g += 51) { branch 0 taken 86% (fallthrough) branch 1 taken 14% 15120: 82: for (r = 0; r < 256; r += 51) { branch 0 taken 86% branch 1 taken 14% (fallthrough) 15120: 83: palette->palette[i*4+0] = r; 15120: 84: palette->palette[i*4+1] = g; 15120: 85: palette->palette[i*4+2] = b; 15120: 86: i++; -: 87: } -: 88: } -: 89: } -: 90: -: 91: /* Blank out unused entries */ -: 92: /* FIXME: add 30-level greyscale wedge here? */ -: 93: 2100: 94: for (; i < 256; i++) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 2100: 95: palette->palette[i*4+0] = 4200: 96: palette->palette[i*4+1] = 2100: 97: palette->palette[i*4+2] = 0; -: 98: } -: 99: -: 100: return palette; -: 101:} -: 102: -: 103:ImagingPalette function ImagingPaletteDuplicate called 1421 returned 100% blocks executed 80% 1421: 104:ImagingPaletteDuplicate(ImagingPalette palette) -: 105:{ -: 106: /* Duplicate palette descriptor */ -: 107: -: 108: ImagingPalette new_palette; -: 109: 1421: 110: if (!palette) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 111: return NULL; -: 112: } -: 113: /* malloc check ok, small constant allocation */ 1421: 114: new_palette = malloc(sizeof(struct ImagingPaletteInstance)); 1421: 115: if (!new_palette) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 116: return (ImagingPalette) ImagingError_MemoryError(); call 0 never executed -: 117: } -: 118: 1421: 119: memcpy(new_palette, palette, sizeof(struct ImagingPaletteInstance)); -: 120: -: 121: /* Don't share the cache */ 1421: 122: new_palette->cache = NULL; -: 123: 1421: 124: return new_palette; -: 125:} -: 126: -: 127:void function ImagingPaletteDelete called 4596 returned 100% blocks executed 100% 4596: 128:ImagingPaletteDelete(ImagingPalette palette) -: 129:{ -: 130: /* Destroy palette object */ -: 131: 4596: 132: if (palette) { branch 0 taken 97% (fallthrough) branch 1 taken 3% 4469: 133: if (palette->cache) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 4: 134: free(palette->cache); -: 135: } 4469: 136: free(palette); -: 137: } 4596: 138:} -: 139: -: 140: -: 141:/* -------------------------------------------------------------------- */ -: 142:/* Colour mapping */ -: 143:/* -------------------------------------------------------------------- */ -: 144: -: 145:/* This code is used to map RGB triplets to palette indices, using -: 146: a palette index cache. */ -: 147: -: 148:/* -: 149: * This implementation is loosely based on the corresponding code in -: 150: * the IJG JPEG library by Thomas G. Lane. Original algorithms by -: 151: * Paul Heckbert and Spencer W. Thomas. -: 152: * -: 153: * The IJG JPEG library is copyright (C) 1991-1995, Thomas G. Lane. */ -: 154: -: 155:#define DIST(a, b, s) (a - b) * (a - b) * s -: 156: -: 157:/* Colour weights (no scaling, for now) */ -: 158:#define RSCALE 1 -: 159:#define GSCALE 1 -: 160:#define BSCALE 1 -: 161: -: 162:/* Calculated scaled distances */ -: 163:#define RDIST(a, b) DIST(a, b, RSCALE*RSCALE) -: 164:#define GDIST(a, b) DIST(a, b, GSCALE*GSCALE) -: 165:#define BDIST(a, b) DIST(a, b, BSCALE*BSCALE) -: 166: -: 167:/* Incremental steps */ -: 168:#define RSTEP (4 * RSCALE) -: 169:#define GSTEP (4 * GSCALE) -: 170:#define BSTEP (4 * BSCALE) -: 171: -: 172:#define BOX 8 -: 173: -: 174:#define BOXVOLUME BOX*BOX*BOX -: 175: -: 176:void function ImagingPaletteCacheUpdate called 6190 returned 100% blocks executed 100% 6190: 177:ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) -: 178:{ -: 179: int i, j; -: 180: unsigned int dmin[256], dmax; -: 181: int r0, g0, b0; -: 182: int r1, g1, b1; -: 183: int rc, gc, bc; -: 184: unsigned int d[BOXVOLUME]; -: 185: UINT8 c[BOXVOLUME]; -: 186: -: 187: /* Get box boundaries for the given (r,g,b)-triplet. Each box -: 188: covers eight cache slots (32 colour values, that is). */ -: 189: 6190: 190: r0 = r & 0xe0; r1 = r0 + 0x1f; rc = (r0 + r1) / 2; 6190: 191: g0 = g & 0xe0; g1 = g0 + 0x1f; gc = (g0 + g1) / 2; 6190: 192: b0 = b & 0xe0; b1 = b0 + 0x1f; bc = (b0 + b1) / 2; -: 193: -: 194: /* Step 1 -- Select relevant palette entries (after Heckbert) */ -: 195: -: 196: /* For each palette entry, calculate the min and max distances to -: 197: * any position in the box given by the colour we're looking for. */ -: 198: 6190: 199: dmax = (unsigned int) ~0; -: 200: 1590830: 201: for (i = 0; i < 256; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 202: -: 203: int r, g, b; -: 204: unsigned int tmin, tmax; -: 205: -: 206: /* Find min and max distances to any point in the box */ 1584640: 207: r = palette->palette[i*4+0]; 1584640: 208: tmin = (r < r0) ? RDIST(r, r1) : (r > r1) ? RDIST(r, r0) : 0; branch 0 taken 58% (fallthrough) branch 1 taken 42% branch 2 taken 73% (fallthrough) branch 3 taken 27% 1584640: 209: tmax = (r <= rc) ? RDIST(r, r1) : RDIST(r, r0); branch 0 taken 64% (fallthrough) branch 1 taken 36% -: 210: 1584640: 211: g = palette->palette[i*4+1]; 1584640: 212: tmin += (g < g0) ? GDIST(g, g1) : (g > g1) ? GDIST(g, g0) : 0; branch 0 taken 45% (fallthrough) branch 1 taken 55% branch 2 taken 78% (fallthrough) branch 3 taken 22% 1584640: 213: tmax += (g <= gc) ? GDIST(g, g1) : GDIST(g, g0); branch 0 taken 52% (fallthrough) branch 1 taken 48% -: 214: 1584640: 215: b = palette->palette[i*4+2]; 1584640: 216: tmin += (b < b0) ? BDIST(b, b1) : (b > b1) ? BDIST(b, b0) : 0; branch 0 taken 46% (fallthrough) branch 1 taken 54% branch 2 taken 78% (fallthrough) branch 3 taken 22% 1584640: 217: tmax += (b <= bc) ? BDIST(b, b1) : BDIST(b, b0); branch 0 taken 53% (fallthrough) branch 1 taken 47% -: 218: 1584640: 219: dmin[i] = tmin; 1584640: 220: if (tmax < dmax) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 125602: 221: dmax = tmax; /* keep the smallest max distance only */ -: 222: } -: 223: -: 224: } -: 225: -: 226: /* Step 2 -- Incrementally update cache slot (after Thomas) */ -: 227: -: 228: /* Find the box containing the nearest palette entry, and update -: 229: * all slots in that box. We only check boxes for which the min -: 230: * distance is less than or equal the smallest max distance */ -: 231: 3169280: 232: for (i = 0; i < BOXVOLUME; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3169280: 233: d[i] = (unsigned int) ~0; -: 234: } -: 235: 1584640: 236: for (i = 0; i < 256; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 237: 1584640: 238: if (dmin[i] <= dmax) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 239: -: 240: int rd, gd, bd; -: 241: int ri, gi, bi; -: 242: int rx, gx, bx; -: 243: 18473: 244: ri = (r0 - palette->palette[i*4+0]) * RSCALE; 18473: 245: gi = (g0 - palette->palette[i*4+1]) * GSCALE; 18473: 246: bi = (b0 - palette->palette[i*4+2]) * BSCALE; -: 247: 18473: 248: rd = ri*ri + gi*gi + bi*bi; -: 249: 18473: 250: ri = ri * (2 * RSTEP) + RSTEP * RSTEP; 18473: 251: gi = gi * (2 * GSTEP) + GSTEP * GSTEP; 18473: 252: bi = bi * (2 * BSTEP) + BSTEP * BSTEP; -: 253: 18473: 254: rx = ri; 166257: 255: for (r = j = 0; r < BOX; r++) { branch 0 taken 89% (fallthrough) branch 1 taken 11% -: 256: gd = rd; gx = gi; 1182272: 257: for (g = 0; g < BOX; g++) { branch 0 taken 89% (fallthrough) branch 1 taken 11% -: 258: bd = gd; bx = bi; 9458176: 259: for (b = 0; b < BOX; b++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 9458176: 260: if ((unsigned int) bd < d[j]) { branch 0 taken 60% (fallthrough) branch 1 taken 40% 5655490: 261: d[j] = bd; 5655490: 262: c[j] = (UINT8) i; -: 263: } 9458176: 264: bd += bx; 9458176: 265: bx += 2 * BSTEP * BSTEP; 9458176: 266: j++; -: 267: } 1182272: 268: gd += gx; 1182272: 269: gx += 2 * GSTEP * GSTEP; -: 270: } 147784: 271: rd += rx; 147784: 272: rx += 2 * RSTEP * RSTEP; -: 273: } -: 274: } -: 275: } -: 276: -: 277: /* Step 3 -- Update cache */ -: 278: -: 279: /* The c array now contains the closest match for each -: 280: * cache slot in the box. Update the cache. */ -: 281: -: 282: j = 0; 49520: 283: for (r = r0; r < r1; r+=4) { branch 0 taken 89% (fallthrough) branch 1 taken 11% 396160: 284: for (g = g0; g < g1; g+=4) { branch 0 taken 89% (fallthrough) branch 1 taken 11% 3169280: 285: for (b = b0; b < b1; b+=4) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 3169280: 286: ImagingPaletteCache(palette, r, g, b) = c[j++]; -: 287: } -: 288: } -: 289: } 6190: 290:} -: 291: -: 292: -: 293:int function ImagingPaletteCachePrepare called 75 returned 100% blocks executed 75% 75: 294:ImagingPaletteCachePrepare(ImagingPalette palette) -: 295:{ -: 296: /* Add a colour cache to a palette */ -: 297: -: 298: int i; 75: 299: int entries = 64*64*64; -: 300: 75: 301: if (palette->cache == NULL) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 302: -: 303: /* The cache is 512k. It might be a good idea to break it -: 304: up into a pointer array (e.g. an 8-bit image?) */ -: 305: -: 306: /* malloc check ok, small constant allocation */ 74: 307: palette->cache = (INT16*) malloc(entries * sizeof(INT16)); 74: 308: if (!palette->cache) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 309: (void) ImagingError_MemoryError(); call 0 never executed #####: 310: return -1; -: 311: } -: 312: -: 313: /* Mark all entries as empty */ 19398656: 314: for (i = 0; i < entries; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 19398656: 315: palette->cache[i] = 0x100; -: 316: } -: 317: -: 318: } -: 319: -: 320: return 0; -: 321:} -: 322: -: 323: -: 324:void function ImagingPaletteCacheDelete called 70 returned 100% blocks executed 100% 70: 325:ImagingPaletteCacheDelete(ImagingPalette palette) -: 326:{ -: 327: /* Release the colour cache, if any */ -: 328: 70: 329: if (palette && palette->cache) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 70: 330: free(palette->cache); 70: 331: palette->cache = NULL; -: 332: } 70: 333:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#JpegDecode.c.gcov -: 0:Source:src/libImaging/JpegDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/JpegDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/JpegDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for JPEG image data. -: 6: * -: 7: * history: -: 8: * 1996-05-02 fl Created -: 9: * 1996-05-05 fl Handle small JPEG files correctly -: 10: * 1996-05-28 fl Added "draft mode" support -: 11: * 1997-01-25 fl Added colour conversion override -: 12: * 1998-01-31 fl Adapted to libjpeg 6a -: 13: * 1998-07-12 fl Extended YCbCr support -: 14: * 1998-12-29 fl Added new state to handle suspension in multipass modes -: 15: * 2000-10-12 fl Suppress warnings -: 16: * 2000-12-04 fl Suppress errors beyond end of image data -: 17: * -: 18: * Copyright (c) 1998-2000 Secret Labs AB -: 19: * Copyright (c) 1996-2000 Fredrik Lundh -: 20: * -: 21: * See the README file for details on usage and redistribution. -: 22: */ -: 23: -: 24: -: 25:#include "Imaging.h" -: 26: -: 27:#ifdef HAVE_LIBJPEG -: 28: -: 29:#undef HAVE_PROTOTYPES -: 30:#undef HAVE_STDLIB_H -: 31:#undef HAVE_STDDEF_H -: 32:#undef UINT8 -: 33:#undef UINT16 -: 34:#undef UINT32 -: 35:#undef INT16 -: 36:#undef INT32 -: 37: -: 38:#include "Jpeg.h" -: 39: -: 40: -: 41:#define STRINGIFY(x) #x -: 42:#define TOSTRING(x) STRINGIFY(x) -: 43: -: 44:// There is no way to compare versions on compile time, -: 45:// so we have to do that in runtime. -: 46:#ifdef LIBJPEG_TURBO_VERSION -: 47:char *libjpeg_turbo_version = TOSTRING(LIBJPEG_TURBO_VERSION); -: 48:#else -: 49:char *libjpeg_turbo_version = NULL; -: 50:#endif -: 51: -: 52:int function ImagingJpegUseJCSExtensions called 348 returned 100% blocks executed 100% 348: 53:ImagingJpegUseJCSExtensions() -: 54:{ 348: 55: int use_jcs_extensions = 0; -: 56: #ifdef JCS_EXTENSIONS -: 57: #if defined(LIBJPEG_TURBO_VERSION_NUMBER) -: 58: #if LIBJPEG_TURBO_VERSION_NUMBER >= 1002010 -: 59: use_jcs_extensions = 1; -: 60: #endif -: 61: #else 348: 62: if (libjpeg_turbo_version) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 348: 63: use_jcs_extensions = strcmp(libjpeg_turbo_version, "1.2.1") >= 0; -: 64: } -: 65: #endif -: 66: #endif 348: 67: return use_jcs_extensions; -: 68:} -: 69: -: 70:/* -------------------------------------------------------------------- */ -: 71:/* Suspending input handler */ -: 72:/* -------------------------------------------------------------------- */ -: 73: -: 74:METHODDEF(void) function stub called 380 returned 100% blocks executed 100% 380: 75:stub(j_decompress_ptr cinfo) -: 76:{ -: 77: /* empty */ 380: 78:} -: 79: -: 80:METHODDEF(boolean) function fill_input_buffer called 26 returned 100% blocks executed 100% 26: 81:fill_input_buffer(j_decompress_ptr cinfo) -: 82:{ -: 83: /* Suspension */ 26: 84: return FALSE; -: 85:} -: 86: -: 87:METHODDEF(void) function skip_input_data called 179 returned 100% blocks executed 100% 179: 88:skip_input_data(j_decompress_ptr cinfo, long num_bytes) -: 89:{ 185: 90: JPEGSOURCE* source = (JPEGSOURCE*) cinfo->src; -: 91: 185: 92: if (num_bytes > (long) source->pub.bytes_in_buffer) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 3% (fallthrough) branch 3 taken 97% -: 93: /* We need to skip more data than we have in the buffer. -: 94: This will force the JPEG library to suspend decoding. */ 6: 95: source->skip = num_bytes - source->pub.bytes_in_buffer; 6: 96: source->pub.next_input_byte += source->pub.bytes_in_buffer; 6: 97: source->pub.bytes_in_buffer = 0; -: 98: } else { -: 99: /* Skip portion of the buffer */ 179: 100: source->pub.bytes_in_buffer -= num_bytes; 179: 101: source->pub.next_input_byte += num_bytes; 179: 102: source->skip = 0; -: 103: } 179: 104:} -: 105: -: 106: -: 107:GLOBAL(void) function jpeg_buffer_src called 191 returned 100% blocks executed 100% 191: 108:jpeg_buffer_src(j_decompress_ptr cinfo, JPEGSOURCE* source) -: 109:{ 191: 110: cinfo->src = (void*) source; -: 111: -: 112: /* Prepare for suspending reader */ 191: 113: source->pub.init_source = stub; 191: 114: source->pub.fill_input_buffer = fill_input_buffer; 191: 115: source->pub.skip_input_data = skip_input_data; 191: 116: source->pub.resync_to_restart = jpeg_resync_to_restart; 191: 117: source->pub.term_source = stub; 191: 118: source->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ -: 119: 191: 120: source->skip = 0; 191: 121:} -: 122: -: 123: -: 124:/* -------------------------------------------------------------------- */ -: 125:/* Error handler */ -: 126:/* -------------------------------------------------------------------- */ -: 127: -: 128:METHODDEF(void) function error called 0 returned 0% blocks executed 0% #####: 129:error(j_common_ptr cinfo) -: 130:{ -: 131: JPEGERROR* error; #####: 132: error = (JPEGERROR*) cinfo->err; #####: 133: longjmp(error->setjmp_buffer, 1); -: 134:} -: 135: -: 136:METHODDEF(void) function output called 1 returned 100% blocks executed 100% 1: 137:output(j_common_ptr cinfo) -: 138:{ -: 139: /* nothing */ 1: 140:} -: 141: -: 142:/* -------------------------------------------------------------------- */ -: 143:/* Decoder */ -: 144:/* -------------------------------------------------------------------- */ -: 145: -: 146:int function ImagingJpegDecode called 215 returned 100% blocks executed 75% 215: 147:ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 148:{ 215: 149: JPEGSTATE* context = (JPEGSTATE*) state->context; -: 150: int ok; -: 151: 215: 152: if (setjmp(context->error.setjmp_buffer)) { branch 0 taken 0% branch 1 taken 100% -: 153: /* JPEG error handler */ #####: 154: jpeg_destroy_decompress(&context->cinfo); call 0 never executed #####: 155: state->errcode = IMAGING_CODEC_BROKEN; #####: 156: return -1; -: 157: } -: 158: 215: 159: if (!state->state) { branch 0 taken 89% (fallthrough) branch 1 taken 11% -: 160: -: 161: /* Setup decompression context */ 191: 162: context->cinfo.err = jpeg_std_error(&context->error.pub); call 0 returned 100% 191: 163: context->error.pub.error_exit = error; 191: 164: context->error.pub.output_message = output; 191: 165: jpeg_create_decompress(&context->cinfo); call 0 returned 100% 191: 166: jpeg_buffer_src(&context->cinfo, &context->source); call 0 returned 100% -: 167: -: 168: /* Ready to decode */ 191: 169: state->state = 1; -: 170: -: 171: } -: 172: -: 173: /* Load the source buffer */ 215: 174: context->source.pub.next_input_byte = buf; 215: 175: context->source.pub.bytes_in_buffer = bytes; -: 176: 215: 177: if (context->source.skip > 0) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 12: 178: skip_input_data(&context->cinfo, context->source.skip); 6: 179: if (context->source.skip > 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 180: return context->source.pub.next_input_byte - buf; -: 181: } -: 182: } -: 183: 215: 184: switch (state->state) { branch 0 taken 92% branch 1 taken 1% branch 2 taken 7% branch 3 taken 0% branch 4 taken 0% -: 185: -: 186: case 1: -: 187: -: 188: /* Read JPEG header, until we find an image body. */ -: 189: do { -: 190: -: 191: /* Note that we cannot return unless we have decoded -: 192: as much data as possible. */ 197: 193: ok = jpeg_read_header(&context->cinfo, FALSE); call 0 returned 100% -: 194: 197: 195: } while (ok == JPEG_HEADER_TABLES_ONLY); branch 0 taken 0% branch 1 taken 100% (fallthrough) -: 196: 197: 197: if (ok == JPEG_SUSPENDED) { branch 0 taken 97% (fallthrough) branch 1 taken 3% -: 198: break; -: 199: } -: 200: -: 201: /* Decoder settings */ -: 202: -: 203: /* jpegmode indicates whats in the file; if not set, we'll -: 204: trust the decoder */ 191: 205: if (strcmp(context->jpegmode, "L") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 206: context->cinfo.jpeg_color_space = JCS_GRAYSCALE; 191: 207: } else if (strcmp(context->jpegmode, "RGB") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 208: context->cinfo.jpeg_color_space = JCS_RGB; 191: 209: } else if (strcmp(context->jpegmode, "CMYK") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 210: context->cinfo.jpeg_color_space = JCS_CMYK; 191: 211: } else if (strcmp(context->jpegmode, "YCbCr") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 212: context->cinfo.jpeg_color_space = JCS_YCbCr; 191: 213: } else if (strcmp(context->jpegmode, "YCbCrK") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 214: context->cinfo.jpeg_color_space = JCS_YCCK; -: 215: } -: 216: -: 217: /* rawmode indicates what we want from the decoder. if not -: 218: set, conversions are disabled */ 191: 219: if (strcmp(context->rawmode, "L") == 0) { branch 0 taken 15% (fallthrough) branch 1 taken 85% branch 2 taken 15% (fallthrough) branch 3 taken 85% 29: 220: context->cinfo.out_color_space = JCS_GRAYSCALE; 162: 221: } else if (strcmp(context->rawmode, "RGB") == 0) { branch 0 taken 88% (fallthrough) branch 1 taken 12% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 222: context->cinfo.out_color_space = JCS_RGB; -: 223: } -: 224: #ifdef JCS_EXTENSIONS 162: 225: else if (strcmp(context->rawmode, "RGBX") == 0) { branch 0 taken 88% (fallthrough) branch 1 taken 12% 142: 226: context->cinfo.out_color_space = JCS_EXT_RGBX; -: 227: } -: 228: #endif 40: 229: else if (strcmp(context->rawmode, "CMYK") == 0 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 95% (fallthrough) branch 3 taken 5% 20: 230: strcmp(context->rawmode, "CMYK;I") == 0) { 19: 231: context->cinfo.out_color_space = JCS_CMYK; 1: 232: } else if (strcmp(context->rawmode, "YCbCr") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 233: context->cinfo.out_color_space = JCS_YCbCr; #####: 234: } else if (strcmp(context->rawmode, "YCbCrK") == 0) { branch 0 never executed branch 1 never executed #####: 235: context->cinfo.out_color_space = JCS_YCCK; -: 236: } else { -: 237: /* Disable decoder conversions */ #####: 238: context->cinfo.jpeg_color_space = JCS_UNKNOWN; #####: 239: context->cinfo.out_color_space = JCS_UNKNOWN; -: 240: } -: 241: 191: 242: if (context->scale > 1) { branch 0 taken 10% (fallthrough) branch 1 taken 90% 19: 243: context->cinfo.scale_num = 1; 19: 244: context->cinfo.scale_denom = context->scale; -: 245: } 191: 246: if (context->draft) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 247: context->cinfo.do_fancy_upsampling = FALSE; #####: 248: context->cinfo.dct_method = JDCT_FASTEST; -: 249: } -: 250: 191: 251: state->state++; -: 252: /* fall through */ -: 253: -: 254: case 2: -: 255: -: 256: /* Set things up for decompression (this processes the entire -: 257: file if necessary to return data line by line) */ 193: 258: if (!jpeg_start_decompress(&context->cinfo)) { call 0 returned 100% branch 1 taken 98% (fallthrough) branch 2 taken 2% -: 259: break; -: 260: } -: 261: 189: 262: state->state++; -: 263: /* fall through */ -: 264: -: 265: case 3: -: 266: -: 267: /* Decompress a single line of data */ -: 268: ok = 1; 35605: 269: while (state->y < state->ysize) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 35416: 270: ok = jpeg_read_scanlines(&context->cinfo, &state->buffer, 1); call 0 returned 100% 35416: 271: if (ok != 1) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 272: break; -: 273: } 106200: 274: state->shuffle((UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 70800: 275: state->xoff * im->pixelsize, state->buffer, -: 276: state->xsize); 35400: 277: state->y++; -: 278: } 205: 279: if (ok != 1) { branch 0 taken 92% (fallthrough) branch 1 taken 8% -: 280: break; -: 281: } 189: 282: state->state++; -: 283: /* fall through */ -: 284: -: 285: case 4: -: 286: -: 287: /* Finish decompression */ 189: 288: if (!jpeg_finish_decompress(&context->cinfo)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 289: /* FIXME: add strictness mode test */ #####: 290: if (state->y < state->ysize) { branch 0 never executed branch 1 never executed -: 291: break; -: 292: } -: 293: } -: 294: -: 295: /* Clean up */ 189: 296: jpeg_destroy_decompress(&context->cinfo); call 0 returned 100% -: 297: /* if (jerr.pub.num_warnings) return BROKEN; */ -: 298: return -1; -: 299: -: 300: } -: 301: -: 302: /* Return number of bytes consumed */ 26: 303: return context->source.pub.next_input_byte - buf; -: 304: -: 305:} -: 306: -: 307:/* -------------------------------------------------------------------- */ -: 308:/* Cleanup */ -: 309:/* -------------------------------------------------------------------- */ -: 310: function ImagingJpegDecodeCleanup called 382 returned 100% blocks executed 100% 382: 311:int ImagingJpegDecodeCleanup(ImagingCodecState state){ -: 312: /* called to free the decompression engine when the decode terminates -: 313: due to a corrupt or truncated image -: 314: */ 382: 315: JPEGSTATE* context = (JPEGSTATE*) state->context; -: 316: -: 317: /* Clean up */ 382: 318: jpeg_destroy_decompress(&context->cinfo); call 0 returned 100% 382: 319: return -1; -: 320:} -: 321: -: 322:#endif -: 323: <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ZipDecode.c.gcov -: 0:Source:src/libImaging/ZipDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ZipDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ZipDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for ZIP (deflated) image data. -: 6: * -: 7: * history: -: 8: * 1996-12-14 fl Created (for PNG) -: 9: * 1997-01-15 fl Prepared to read TIFF/ZIP -: 10: * 2001-11-19 fl PNG incomplete read patch (from Bernhard Herzog) -: 11: * -: 12: * Copyright (c) Fredrik Lundh 1996. -: 13: * Copyright (c) Secret Labs AB 1997-2001. -: 14: * -: 15: * See the README file for information on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21:#ifdef HAVE_LIBZ -: 22: -: 23:#include "ZipCodecs.h" -: 24: -: 25:static const int OFFSET[] = { 7, 3, 3, 1, 1, 0, 0 }; -: 26:static const int STARTING_COL[] = { 0, 4, 0, 2, 0, 1, 0 }; -: 27:static const int STARTING_ROW[] = { 0, 0, 4, 0, 2, 0, 1 }; -: 28:static const int COL_INCREMENT[] = { 8, 8, 4, 4, 2, 2, 1 }; -: 29:static const int ROW_INCREMENT[] = { 8, 8, 8, 4, 4, 2, 2 }; -: 30: -: 31:/* Get the length in bytes of a scanline in the pass specified, -: 32: * for interlaced images */ -: 33:static int get_row_len(ImagingCodecState state, int pass) -: 34:{ 124: 35: int row_len = (state->xsize + OFFSET[pass]) / COL_INCREMENT[pass]; 124: 36: return ((row_len * state->bits) + 7) / 8; -: 37:} -: 38: -: 39:/* -------------------------------------------------------------------- */ -: 40:/* Decoder */ -: 41:/* -------------------------------------------------------------------- */ -: 42: -: 43:int function ImagingZipDecode called 1501 returned 100% blocks executed 80% 1501: 44:ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 45:{ 1501: 46: ZIPSTATE* context = (ZIPSTATE*) state->context; -: 47: int err; -: 48: int n; -: 49: UINT8* ptr; -: 50: int i, bpp; -: 51: int row_len; -: 52: 1501: 53: if (!state->state) { branch 0 taken 68% (fallthrough) branch 1 taken 32% -: 54: -: 55: /* Initialization */ 1015: 56: if (context->mode == ZIP_PNG || context->mode == ZIP_PNG_PALETTE) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1015: 57: context->prefix = 1; /* PNG */ -: 58: } -: 59: -: 60: /* overflow check for malloc */ 1015: 61: if (state->bytes > INT_MAX - 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 62: state->errcode = IMAGING_CODEC_MEMORY; #####: 63: return -1; -: 64: } -: 65: /* Expand standard buffer to make room for the (optional) filter -: 66: prefix, and allocate a buffer to hold the previous line */ 1015: 67: free(state->buffer); -: 68: /* malloc check ok, overflow checked above */ 1015: 69: state->buffer = (UINT8*) malloc(state->bytes+1); 1015: 70: context->previous = (UINT8*) malloc(state->bytes+1); 1015: 71: if (!state->buffer || !context->previous) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 72: state->errcode = IMAGING_CODEC_MEMORY; #####: 73: return -1; -: 74: } -: 75: 1015: 76: context->last_output = 0; -: 77: -: 78: /* Initialize to black */ 2030: 79: memset(context->previous, 0, state->bytes+1); -: 80: -: 81: /* Setup decompression context */ 1015: 82: context->z_stream.zalloc = (alloc_func) NULL; 1015: 83: context->z_stream.zfree = (free_func) NULL; 1015: 84: context->z_stream.opaque = (voidpf) NULL; -: 85: 1015: 86: err = inflateInit(&context->z_stream); call 0 returned 100% 1015: 87: if (err < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 88: state->errcode = IMAGING_CODEC_CONFIG; #####: 89: free(context->previous); #####: 90: context->previous = NULL; #####: 91: return -1; -: 92: } -: 93: 1015: 94: if (context->interlaced) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 15: 95: context->pass = 0; 15: 96: state->y = STARTING_ROW[context->pass]; -: 97: } -: 98: -: 99: /* Ready to decode */ 1015: 100: state->state = 1; -: 101: -: 102: } -: 103: 1501: 104: if (context->interlaced) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 68: 105: row_len = get_row_len(state, context->pass); -: 106: } else { 1467: 107: row_len = state->bytes; -: 108: } -: 109: -: 110: /* Setup the source buffer */ 1501: 111: context->z_stream.next_in = buf; 1501: 112: context->z_stream.avail_in = bytes; -: 113: -: 114: /* Decompress what we've got this far */ 176563: 115: while (context->z_stream.avail_in > 0) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 116: 175050: 117: context->z_stream.next_out = state->buffer + context->last_output; 175050: 118: context->z_stream.avail_out = 175050: 119: row_len + context->prefix - context->last_output; -: 120: 175050: 121: err = inflate(&context->z_stream, Z_NO_FLUSH); call 0 returned 100% -: 122: 175050: 123: if (err < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 124: /* Something went wrong inside the compression library */ #####: 125: if (err == Z_DATA_ERROR) { branch 0 never executed branch 1 never executed #####: 126: state->errcode = IMAGING_CODEC_BROKEN; #####: 127: } else if (err == Z_MEM_ERROR) { branch 0 never executed branch 1 never executed #####: 128: state->errcode = IMAGING_CODEC_MEMORY; -: 129: } else { #####: 130: state->errcode = IMAGING_CODEC_CONFIG; -: 131: } #####: 132: free(context->previous); #####: 133: context->previous = NULL; #####: 134: inflateEnd(&context->z_stream); call 0 never executed #####: 135: return -1; -: 136: } -: 137: 175050: 138: n = row_len + context->prefix - context->z_stream.avail_out; -: 139: 175050: 140: if (n < row_len + context->prefix) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 580: 141: context->last_output = n; 580: 142: break; /* need more input data */ -: 143: } -: 144: -: 145: /* Apply predictor */ 174470: 146: switch (context->mode) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% -: 147: case ZIP_PNG: 174470: 148: switch (state->buffer[0]) { branch 0 taken 41% branch 1 taken 5% branch 2 taken 2% branch 3 taken 16% branch 4 taken 1% branch 5 taken 36% -: 149: case 0: -: 150: break; -: 151: case 1: -: 152: /* prior */ 8668: 153: bpp = (state->bits + 7) / 8; 11359273: 154: for (i = bpp+1; i <= row_len; i++) { branch 0 taken 99% branch 1 taken 1% 11350605: 155: state->buffer[i] += state->buffer[i-bpp]; -: 156: } -: 157: break; -: 158: case 2: -: 159: /* up */ 209240594: 160: for (i = 1; i <= row_len; i++) { branch 0 taken 99% branch 1 taken 1% 209240594: 161: state->buffer[i] += context->previous[i]; -: 162: } -: 163: break; -: 164: case 3: -: 165: /* average */ 2624: 166: bpp = (state->bits + 7) / 8; 10757: 167: for (i = 1; i <= bpp; i++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 8133: 168: state->buffer[i] += context->previous[i]/2; -: 169: } 2705611: 170: for (; i <= row_len; i++) { branch 0 taken 99% branch 1 taken 1% 5411222: 171: state->buffer[i] += 2705611: 172: (state->buffer[i-bpp] + context->previous[i])/2; -: 173: } -: 174: break; -: 175: case 4: -: 176: /* paeth filtering */ 27894: 177: bpp = (state->bits + 7) / 8; 106501: 178: for (i = 1; i <= bpp; i++) { branch 0 taken 74% branch 1 taken 26% (fallthrough) 78607: 179: state->buffer[i] += context->previous[i]; -: 180: } 61557676: 181: for (; i <= row_len; i++) { branch 0 taken 99% branch 1 taken 1% -: 182: int a, b, c; -: 183: int pa, pb, pc; -: 184: -: 185: /* fetch pixels */ 61557676: 186: a = state->buffer[i-bpp]; 61557676: 187: b = context->previous[i]; 61557676: 188: c = context->previous[i-bpp]; -: 189: -: 190: /* distances to surrounding pixels */ 61557676: 191: pa = abs(b - c); 61557676: 192: pb = abs(a - c); 61557676: 193: pc = abs(a + b - 2*c); -: 194: -: 195: /* pick predictor with the shortest distance */ 78979393: 196: state->buffer[i] += branch 0 taken 76% (fallthrough) branch 1 taken 24% branch 2 taken 80% (fallthrough) branch 3 taken 20% 46955093: 197: (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c; branch 0 taken 6% (fallthrough) branch 1 taken 94% -: 198: -: 199: } -: 200: break; -: 201: default: 3: 202: state->errcode = IMAGING_CODEC_UNKNOWN; 3: 203: free(context->previous); 3: 204: context->previous = NULL; 3: 205: inflateEnd(&context->z_stream); call 0 returned 100% 3: 206: return -1; -: 207: } -: 208: break; -: 209: case ZIP_TIFF_PREDICTOR: #####: 210: bpp = (state->bits + 7) / 8; #####: 211: for (i = bpp+1; i <= row_len; i++) { branch 0 never executed branch 1 never executed #####: 212: state->buffer[i] += state->buffer[i-bpp]; -: 213: } -: 214: break; -: 215: } -: 216: -: 217: /* Stuff data into the image */ 174467: 218: if (context->interlaced) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 4230: 219: int col = STARTING_COL[context->pass]; 4230: 220: if (state->bits >= 8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 221: /* Stuff pixels in their correct location, one by one */ 364500: 222: for (i = 0; i < row_len; i += ((state->bits + 7) / 8)) { branch 0 taken 99% branch 1 taken 1% 1093500: 223: state->shuffle((UINT8*) im->image[state->y] + call 0 returned 100% 364500: 224: col * im->pixelsize, 364500: 225: state->buffer + context->prefix + i, 1); 364500: 226: col += COL_INCREMENT[context->pass]; -: 227: } -: 228: } else { -: 229: /* Handle case with more than a pixel in each byte */ #####: 230: int row_bits = ((state->xsize + OFFSET[context->pass]) #####: 231: / COL_INCREMENT[context->pass]) * state->bits; #####: 232: for (i = 0; i < row_bits; i += state->bits) { branch 0 never executed branch 1 never executed #####: 233: UINT8 byte = *(state->buffer + context->prefix + (i / 8)); #####: 234: byte <<= (i % 8); #####: 235: state->shuffle((UINT8*) im->image[state->y] + call 0 never executed #####: 236: col * im->pixelsize, &byte, 1); #####: 237: col += COL_INCREMENT[context->pass]; -: 238: } -: 239: } -: 240: /* Find next valid scanline */ 4230: 241: state->y += ROW_INCREMENT[context->pass]; 8550: 242: while (state->y >= state->ysize || row_len <= 0) { branch 0 taken 2% branch 1 taken 98% (fallthrough) branch 2 taken 0% branch 3 taken 100% 105: 243: context->pass++; 105: 244: if (context->pass == 7) { branch 0 taken 14% (fallthrough) branch 1 taken 86% -: 245: /* Force exit below */ 15: 246: state->y = state->ysize; 15: 247: break; -: 248: } 90: 249: state->y = STARTING_ROW[context->pass]; 180: 250: row_len = get_row_len(state, context->pass); -: 251: /* Since we're moving to the "first" line, the previous line -: 252: * should be black to make filters work correctly */ 90: 253: memset(state->buffer, 0, state->bytes+1); -: 254: } -: 255: } else { 510711: 256: state->shuffle((UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 170237: 257: state->xoff * im->pixelsize, 170237: 258: state->buffer + context->prefix, -: 259: state->xsize); 170237: 260: state->y++; -: 261: } -: 262: -: 263: /* all inflate output has been consumed */ 174467: 264: context->last_output = 0; -: 265: 174467: 266: if (state->y >= state->ysize || err == Z_STREAM_END) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 267: -: 268: /* The image and the data should end simultaneously */ -: 269: /* if (state->y < state->ysize || err != Z_STREAM_END) -: 270: state->errcode = IMAGING_CODEC_BROKEN; */ -: 271: 906: 272: free(context->previous); 906: 273: context->previous = NULL; 906: 274: inflateEnd(&context->z_stream); call 0 returned 100% 906: 275: return -1; /* end of file (errcode=0) */ -: 276: -: 277: } -: 278: -: 279: /* Swap buffer pointers */ 173561: 280: ptr = state->buffer; 173561: 281: state->buffer = context->previous; 173561: 282: context->previous = ptr; -: 283: -: 284: } -: 285: 592: 286: return bytes; /* consumed all of it */ -: 287: -: 288:} -: 289: -: 290: function ImagingZipDecodeCleanup called 2032 returned 100% blocks executed 100% 2032: 291:int ImagingZipDecodeCleanup(ImagingCodecState state){ -: 292: /* called to free the decompression engine when the decode terminates -: 293: due to a corrupt or truncated image -: 294: */ 2032: 295: ZIPSTATE* context = (ZIPSTATE*) state->context; -: 296: -: 297: /* Clean up */ 2032: 298: if (context->previous) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 106: 299: inflateEnd(&context->z_stream); call 0 returned 100% 106: 300: free(context->previous); 106: 301: context->previous = NULL; -: 302: } 2032: 303: return -1; -: 304:} -: 305: -: 306:#endif <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Point.c.gcov -: 0:Source:src/libImaging/Point.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Point.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Point.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * point (pixel) translation -: 6: * -: 7: * history: -: 8: * 1995-11-27 fl Created -: 9: * 1996-03-31 fl Fixed colour support -: 10: * 1996-08-13 fl Support 8-bit to "1" thresholding -: 11: * 1997-05-31 fl Added floating point transform -: 12: * 1998-07-02 fl Added integer point transform -: 13: * 1998-07-17 fl Support L to anything lookup -: 14: * 2004-12-18 fl Refactored; added I to L lookup -: 15: * -: 16: * Copyright (c) 1997-2004 by Secret Labs AB. -: 17: * Copyright (c) 1995-2004 by Fredrik Lundh. -: 18: * -: 19: * See the README file for information on usage and redistribution. -: 20: */ -: 21: -: 22: -: 23:#include "Imaging.h" -: 24: -: 25:typedef struct { -: 26: const void* table; -: 27:} im_point_context; -: 28: -: 29:static void function im_point_8_8 called 19 returned 100% blocks executed 100% 19: 30:im_point_8_8(Imaging imOut, Imaging imIn, im_point_context* context) -: 31:{ -: 32: int x, y; -: 33: /* 8-bit source, 8-bit destination */ 19: 34: UINT8* table = (UINT8*) context->table; 2399: 35: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2380: 36: UINT8* in = imIn->image8[y]; 2380: 37: UINT8* out = imOut->image8[y]; 706108: 38: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 703728: 39: out[x] = table[in[x]]; -: 40: } -: 41: } 19: 42:} -: 43: -: 44:static void function im_point_2x8_2x8 called 0 returned 0% blocks executed 0% #####: 45:im_point_2x8_2x8(Imaging imOut, Imaging imIn, im_point_context* context) -: 46:{ -: 47: int x, y; -: 48: /* 2x8-bit source, 2x8-bit destination */ #####: 49: UINT8* table = (UINT8*) context->table; #####: 50: for (y = 0; y < imIn->ysize; y++) { branch 0 never executed branch 1 never executed #####: 51: UINT8* in = (UINT8*) imIn->image[y]; #####: 52: UINT8* out = (UINT8*) imOut->image[y]; #####: 53: for (x = 0; x < imIn->xsize; x++) { branch 0 never executed branch 1 never executed #####: 54: out[0] = table[in[0]]; #####: 55: out[3] = table[in[3]+256]; #####: 56: in += 4; out += 4; -: 57: } -: 58: } #####: 59:} -: 60: -: 61:static void function im_point_3x8_3x8 called 18 returned 100% blocks executed 100% 18: 62:im_point_3x8_3x8(Imaging imOut, Imaging imIn, im_point_context* context) -: 63:{ -: 64: int x, y; -: 65: /* 3x8-bit source, 3x8-bit destination */ 18: 66: UINT8* table = (UINT8*) context->table; 2448: 67: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2430: 68: UINT8* in = (UINT8*) imIn->image[y]; 2430: 69: UINT8* out = (UINT8*) imOut->image[y]; 805214: 70: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 802784: 71: out[0] = table[in[0]]; 802784: 72: out[1] = table[in[1]+256]; 802784: 73: out[2] = table[in[2]+512]; 802784: 74: in += 4; out += 4; -: 75: } -: 76: } 18: 77:} -: 78: -: 79:static void function im_point_4x8_4x8 called 0 returned 0% blocks executed 0% #####: 80:im_point_4x8_4x8(Imaging imOut, Imaging imIn, im_point_context* context) -: 81:{ -: 82: int x, y; -: 83: /* 4x8-bit source, 4x8-bit destination */ #####: 84: UINT8* table = (UINT8*) context->table; #####: 85: for (y = 0; y < imIn->ysize; y++) { branch 0 never executed branch 1 never executed #####: 86: UINT8* in = (UINT8*) imIn->image[y]; #####: 87: UINT8* out = (UINT8*) imOut->image[y]; #####: 88: for (x = 0; x < imIn->xsize; x++) { branch 0 never executed branch 1 never executed #####: 89: out[0] = table[in[0]]; #####: 90: out[1] = table[in[1]+256]; #####: 91: out[2] = table[in[2]+512]; #####: 92: out[3] = table[in[3]+768]; #####: 93: in += 4; out += 4; -: 94: } -: 95: } #####: 96:} -: 97: -: 98:static void function im_point_8_32 called 1 returned 100% blocks executed 100% 1: 99:im_point_8_32(Imaging imOut, Imaging imIn, im_point_context* context) -: 100:{ -: 101: int x, y; -: 102: /* 8-bit source, 32-bit destination */ 1: 103: char* table = (char*) context->table; 129: 104: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 128: 105: UINT8* in = imIn->image8[y]; 128: 106: INT32* out = imOut->image32[y]; 16512: 107: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 108: memcpy(out + x, table + in[x] * sizeof(INT32), sizeof(INT32)); -: 109: } -: 110: } 1: 111:} -: 112: -: 113:static void function im_point_32_8 called 1 returned 100% blocks executed 90% 1: 114:im_point_32_8(Imaging imOut, Imaging imIn, im_point_context* context) -: 115:{ -: 116: int x, y; -: 117: /* 32-bit source, 8-bit destination */ 1: 118: UINT8* table = (UINT8*) context->table; 129: 119: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 128: 120: INT32* in = imIn->image32[y]; 128: 121: UINT8* out = imOut->image8[y]; 16512: 122: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 123: int v = in[x]; 16384: 124: if (v < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 125: v = 0; 16384: 126: } else if (v > 65535) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 127: v = 65535; -: 128: } 16384: 129: out[x] = table[v]; -: 130: } -: 131: } 1: 132:} -: 133: -: 134:Imaging function ImagingPoint called 40 returned 100% blocks executed 89% 40: 135:ImagingPoint(Imaging imIn, const char* mode, const void* table) -: 136:{ -: 137: /* lookup table transform */ -: 138: -: 139: ImagingSectionCookie cookie; -: 140: Imaging imOut; -: 141: im_point_context context; -: 142: void (*point)(Imaging imIn, Imaging imOut, im_point_context* context); -: 143: 40: 144: if (!imIn) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 145: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 146: } -: 147: 40: 148: if (!mode) { branch 0 taken 93% (fallthrough) branch 1 taken 8% 37: 149: mode = imIn->mode; -: 150: } -: 151: 40: 152: if (imIn->type != IMAGING_TYPE_UINT8) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 2: 153: if (imIn->type != IMAGING_TYPE_INT32 || strcmp(mode, "L") != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 50% (fallthrough) branch 3 taken 50% branch 4 taken 50% branch 5 taken 50% -: 154: goto mode_mismatch; -: 155: } 38: 156: } else if (!imIn->image8 && strcmp(imIn->mode, mode) != 0) { branch 0 taken 47% (fallthrough) branch 1 taken 53% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 157: goto mode_mismatch; -: 158: } -: 159: 39: 160: imOut = ImagingNew(mode, imIn->xsize, imIn->ysize); call 0 returned 100% 39: 161: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 162: return NULL; -: 163: } -: 164: -: 165: /* find appropriate handler */ 39: 166: if (imIn->type == IMAGING_TYPE_UINT8) { branch 0 taken 97% (fallthrough) branch 1 taken 3% 38: 167: if (imIn->bands == imOut->bands && imIn->type == imOut->type) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 97% (fallthrough) branch 3 taken 3% 37: 168: switch (imIn->bands) { branch 0 taken 0% branch 1 taken 49% branch 2 taken 0% branch 3 taken 51% -: 169: case 1: -: 170: point = im_point_8_8; -: 171: break; -: 172: case 2: #####: 173: point = im_point_2x8_2x8; #####: 174: break; -: 175: case 3: 18: 176: point = im_point_3x8_3x8; 18: 177: break; -: 178: case 4: #####: 179: point = im_point_4x8_4x8; #####: 180: break; -: 181: default: -: 182: /* this cannot really happen */ -: 183: point = im_point_8_8; -: 184: break; -: 185: } -: 186: } else { -: 187: point = im_point_8_32; -: 188: } -: 189: } else { -: 190: point = im_point_32_8; -: 191: } -: 192: 39: 193: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 194: 39: 195: ImagingSectionEnter(&cookie); call 0 returned 100% -: 196: 39: 197: context.table = table; 39: 198: point(imOut, imIn, &context); call 0 returned 100% -: 199: 39: 200: ImagingSectionLeave(&cookie); call 0 returned 100% -: 201: 39: 202: return imOut; -: 203: -: 204: mode_mismatch: 1: 205: return (Imaging) ImagingError_ValueError( call 0 returned 100% -: 206: "point operation not supported for this mode" -: 207: ); -: 208:} -: 209: -: 210: -: 211:Imaging function ImagingPointTransform called 4 returned 100% blocks executed 70% 4: 212:ImagingPointTransform(Imaging imIn, double scale, double offset) -: 213:{ -: 214: /* scale/offset transform */ -: 215: -: 216: ImagingSectionCookie cookie; -: 217: Imaging imOut; -: 218: int x, y; -: 219: 5: 220: if (!imIn || (strcmp(imIn->mode, "I") != 0 && branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 75% (fallthrough) branch 3 taken 25% branch 4 taken 25% (fallthrough) branch 5 taken 75% branch 6 taken 100% (fallthrough) branch 7 taken 0% 2: 221: strcmp(imIn->mode, "I;16") != 0 && branch 0 taken 0% (fallthrough) branch 1 taken 100% 1: 222: strcmp(imIn->mode, "F") != 0)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 223: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 224: } -: 225: 4: 226: imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); call 0 returned 100% 4: 227: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 228: return NULL; -: 229: } -: 230: 4: 231: switch (imIn->type) { branch 0 taken 75% branch 1 taken 25% branch 2 taken 0% branch 3 taken 0% -: 232: case IMAGING_TYPE_INT32: 3: 233: ImagingSectionEnter(&cookie); 387: 234: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 384: 235: INT32* in = imIn->image32[y]; 384: 236: INT32* out = imOut->image32[y]; -: 237: /* FIXME: add clipping? */ 49536: 238: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 49152: 239: out[x] = in[x] * scale + offset; -: 240: } -: 241: } 3: 242: ImagingSectionLeave(&cookie); call 0 returned 100% 3: 243: break; -: 244: case IMAGING_TYPE_FLOAT32: 1: 245: ImagingSectionEnter(&cookie); 129: 246: for (y = 0; y < imIn->ysize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 128: 247: FLOAT32* in = (FLOAT32*) imIn->image32[y]; 128: 248: FLOAT32* out = (FLOAT32*) imOut->image32[y]; 16512: 249: for (x = 0; x < imIn->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 250: out[x] = in[x] * scale + offset; -: 251: } -: 252: } 1: 253: ImagingSectionLeave(&cookie); call 0 returned 100% 1: 254: break; -: 255: case IMAGING_TYPE_SPECIAL: #####: 256: if (strcmp(imIn->mode,"I;16") == 0) { branch 0 never executed branch 1 never executed #####: 257: ImagingSectionEnter(&cookie); #####: 258: for (y = 0; y < imIn->ysize; y++) { call 0 never executed branch 1 never executed branch 2 never executed #####: 259: char* in = (char*)imIn->image[y]; #####: 260: char* out = (char*)imOut->image[y]; -: 261: /* FIXME: add clipping? */ #####: 262: for (x = 0; x < imIn->xsize; x++) { branch 0 never executed branch 1 never executed -: 263: UINT16 v; #####: 264: memcpy(&v, in + x * sizeof(v), sizeof(v)); #####: 265: v = v * scale + offset; #####: 266: memcpy(out + x * sizeof(UINT16), &v, sizeof(v)); -: 267: } -: 268: } #####: 269: ImagingSectionLeave(&cookie); call 0 never executed #####: 270: break; -: 271: } -: 272: /* FALL THROUGH */ -: 273: default: #####: 274: ImagingDelete(imOut); call 0 never executed #####: 275: return (Imaging) ImagingError_ValueError("internal error"); call 0 never executed -: 276: } -: 277: -: 278: return imOut; -: 279:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ConvertYCbCr.c.gcov -: 0:Source:src/libImaging/ConvertYCbCr.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ConvertYCbCr.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/ConvertYCbCr.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * code to convert YCbCr data -: 6: * -: 7: * history: -: 8: * 98-07-01 hk Created -: 9: * -: 10: * Copyright (c) Secret Labs AB 1998 -: 11: * -: 12: * See the README file for information on usage and redistribution. -: 13: */ -: 14: -: 15:#include "Imaging.h" -: 16: -: 17:/* JPEG/JFIF YCbCr conversions -: 18: -: 19: Y = R * 0.29900 + G * 0.58700 + B * 0.11400 -: 20: Cb = R * -0.16874 + G * -0.33126 + B * 0.50000 + 128 -: 21: Cr = R * 0.50000 + G * -0.41869 + B * -0.08131 + 128 -: 22: -: 23: R = Y + + (Cr - 128) * 1.40200 -: 24: G = Y + (Cb - 128) * -0.34414 + (Cr - 128) * -0.71414 -: 25: B = Y + (Cb - 128) * 1.77200 -: 26: -: 27:*/ -: 28: -: 29:#define SCALE 6 /* bits */ -: 30: -: 31:static INT16 Y_R[] = { 0, 19, 38, 57, 77, 96, 115, 134, 153, 172, 191, -: 32:210, 230, 249, 268, 287, 306, 325, 344, 364, 383, 402, 421, 440, 459, -: 33:478, 498, 517, 536, 555, 574, 593, 612, 631, 651, 670, 689, 708, 727, -: 34:746, 765, 785, 804, 823, 842, 861, 880, 899, 919, 938, 957, 976, 995, -: 35:1014, 1033, 1052, 1072, 1091, 1110, 1129, 1148, 1167, 1186, 1206, -: 36:1225, 1244, 1263, 1282, 1301, 1320, 1340, 1359, 1378, 1397, 1416, -: 37:1435, 1454, 1473, 1493, 1512, 1531, 1550, 1569, 1588, 1607, 1627, -: 38:1646, 1665, 1684, 1703, 1722, 1741, 1761, 1780, 1799, 1818, 1837, -: 39:1856, 1875, 1894, 1914, 1933, 1952, 1971, 1990, 2009, 2028, 2048, -: 40:2067, 2086, 2105, 2124, 2143, 2162, 2182, 2201, 2220, 2239, 2258, -: 41:2277, 2296, 2315, 2335, 2354, 2373, 2392, 2411, 2430, 2449, 2469, -: 42:2488, 2507, 2526, 2545, 2564, 2583, 2602, 2622, 2641, 2660, 2679, -: 43:2698, 2717, 2736, 2756, 2775, 2794, 2813, 2832, 2851, 2870, 2890, -: 44:2909, 2928, 2947, 2966, 2985, 3004, 3023, 3043, 3062, 3081, 3100, -: 45:3119, 3138, 3157, 3177, 3196, 3215, 3234, 3253, 3272, 3291, 3311, -: 46:3330, 3349, 3368, 3387, 3406, 3425, 3444, 3464, 3483, 3502, 3521, -: 47:3540, 3559, 3578, 3598, 3617, 3636, 3655, 3674, 3693, 3712, 3732, -: 48:3751, 3770, 3789, 3808, 3827, 3846, 3865, 3885, 3904, 3923, 3942, -: 49:3961, 3980, 3999, 4019, 4038, 4057, 4076, 4095, 4114, 4133, 4153, -: 50:4172, 4191, 4210, 4229, 4248, 4267, 4286, 4306, 4325, 4344, 4363, -: 51:4382, 4401, 4420, 4440, 4459, 4478, 4497, 4516, 4535, 4554, 4574, -: 52:4593, 4612, 4631, 4650, 4669, 4688, 4707, 4727, 4746, 4765, 4784, -: 53:4803, 4822, 4841, 4861, 4880 }; -: 54: -: 55:static INT16 Y_G[] = { 0, 38, 75, 113, 150, 188, 225, 263, 301, 338, -: 56:376, 413, 451, 488, 526, 564, 601, 639, 676, 714, 751, 789, 826, 864, -: 57:902, 939, 977, 1014, 1052, 1089, 1127, 1165, 1202, 1240, 1277, 1315, -: 58:1352, 1390, 1428, 1465, 1503, 1540, 1578, 1615, 1653, 1691, 1728, -: 59:1766, 1803, 1841, 1878, 1916, 1954, 1991, 2029, 2066, 2104, 2141, -: 60:2179, 2217, 2254, 2292, 2329, 2367, 2404, 2442, 2479, 2517, 2555, -: 61:2592, 2630, 2667, 2705, 2742, 2780, 2818, 2855, 2893, 2930, 2968, -: 62:3005, 3043, 3081, 3118, 3156, 3193, 3231, 3268, 3306, 3344, 3381, -: 63:3419, 3456, 3494, 3531, 3569, 3607, 3644, 3682, 3719, 3757, 3794, -: 64:3832, 3870, 3907, 3945, 3982, 4020, 4057, 4095, 4132, 4170, 4208, -: 65:4245, 4283, 4320, 4358, 4395, 4433, 4471, 4508, 4546, 4583, 4621, -: 66:4658, 4696, 4734, 4771, 4809, 4846, 4884, 4921, 4959, 4997, 5034, -: 67:5072, 5109, 5147, 5184, 5222, 5260, 5297, 5335, 5372, 5410, 5447, -: 68:5485, 5522, 5560, 5598, 5635, 5673, 5710, 5748, 5785, 5823, 5861, -: 69:5898, 5936, 5973, 6011, 6048, 6086, 6124, 6161, 6199, 6236, 6274, -: 70:6311, 6349, 6387, 6424, 6462, 6499, 6537, 6574, 6612, 6650, 6687, -: 71:6725, 6762, 6800, 6837, 6875, 6913, 6950, 6988, 7025, 7063, 7100, -: 72:7138, 7175, 7213, 7251, 7288, 7326, 7363, 7401, 7438, 7476, 7514, -: 73:7551, 7589, 7626, 7664, 7701, 7739, 7777, 7814, 7852, 7889, 7927, -: 74:7964, 8002, 8040, 8077, 8115, 8152, 8190, 8227, 8265, 8303, 8340, -: 75:8378, 8415, 8453, 8490, 8528, 8566, 8603, 8641, 8678, 8716, 8753, -: 76:8791, 8828, 8866, 8904, 8941, 8979, 9016, 9054, 9091, 9129, 9167, -: 77:9204, 9242, 9279, 9317, 9354, 9392, 9430, 9467, 9505, 9542, 9580 }; -: 78: -: 79:static INT16 Y_B[] = { 0, 7, 15, 22, 29, 36, 44, 51, 58, 66, 73, 80, -: 80:88, 95, 102, 109, 117, 124, 131, 139, 146, 153, 161, 168, 175, 182, -: 81:190, 197, 204, 212, 219, 226, 233, 241, 248, 255, 263, 270, 277, 285, -: 82:292, 299, 306, 314, 321, 328, 336, 343, 350, 358, 365, 372, 379, 387, -: 83:394, 401, 409, 416, 423, 430, 438, 445, 452, 460, 467, 474, 482, 489, -: 84:496, 503, 511, 518, 525, 533, 540, 547, 554, 562, 569, 576, 584, 591, -: 85:598, 606, 613, 620, 627, 635, 642, 649, 657, 664, 671, 679, 686, 693, -: 86:700, 708, 715, 722, 730, 737, 744, 751, 759, 766, 773, 781, 788, 795, -: 87:803, 810, 817, 824, 832, 839, 846, 854, 861, 868, 876, 883, 890, 897, -: 88:905, 912, 919, 927, 934, 941, 948, 956, 963, 970, 978, 985, 992, 1000, -: 89:1007, 1014, 1021, 1029, 1036, 1043, 1051, 1058, 1065, 1073, 1080, -: 90:1087, 1094, 1102, 1109, 1116, 1124, 1131, 1138, 1145, 1153, 1160, -: 91:1167, 1175, 1182, 1189, 1197, 1204, 1211, 1218, 1226, 1233, 1240, -: 92:1248, 1255, 1262, 1270, 1277, 1284, 1291, 1299, 1306, 1313, 1321, -: 93:1328, 1335, 1342, 1350, 1357, 1364, 1372, 1379, 1386, 1394, 1401, -: 94:1408, 1415, 1423, 1430, 1437, 1445, 1452, 1459, 1466, 1474, 1481, -: 95:1488, 1496, 1503, 1510, 1518, 1525, 1532, 1539, 1547, 1554, 1561, -: 96:1569, 1576, 1583, 1591, 1598, 1605, 1612, 1620, 1627, 1634, 1642, -: 97:1649, 1656, 1663, 1671, 1678, 1685, 1693, 1700, 1707, 1715, 1722, -: 98:1729, 1736, 1744, 1751, 1758, 1766, 1773, 1780, 1788, 1795, 1802, -: 99:1809, 1817, 1824, 1831, 1839, 1846, 1853, 1860 }; -: 100: -: 101:static INT16 Cb_R[] = { 0, -10, -21, -31, -42, -53, -64, -75, -85, -: 102:-96, -107, -118, -129, -139, -150, -161, -172, -183, -193, -204, -215, -: 103:-226, -237, -247, -258, -269, -280, -291, -301, -312, -323, -334, -: 104:-345, -355, -366, -377, -388, -399, -409, -420, -431, -442, -453, -: 105:-463, -474, -485, -496, -507, -517, -528, -539, -550, -561, -571, -: 106:-582, -593, -604, -615, -625, -636, -647, -658, -669, -679, -690, -: 107:-701, -712, -723, -733, -744, -755, -766, -777, -787, -798, -809, -: 108:-820, -831, -841, -852, -863, -874, -885, -895, -906, -917, -928, -: 109:-939, -949, -960, -971, -982, -993, -1003, -1014, -1025, -1036, -1047, -: 110:-1057, -1068, -1079, -1090, -1101, -1111, -1122, -1133, -1144, -1155, -: 111:-1165, -1176, -1187, -1198, -1209, -1219, -1230, -1241, -1252, -1263, -: 112:-1273, -1284, -1295, -1306, -1317, -1327, -1338, -1349, -1360, -1371, -: 113:-1381, -1392, -1403, -1414, -1425, -1435, -1446, -1457, -1468, -1479, -: 114:-1489, -1500, -1511, -1522, -1533, -1543, -1554, -1565, -1576, -1587, -: 115:-1597, -1608, -1619, -1630, -1641, -1651, -1662, -1673, -1684, -1694, -: 116:-1705, -1716, -1727, -1738, -1748, -1759, -1770, -1781, -1792, -1802, -: 117:-1813, -1824, -1835, -1846, -1856, -1867, -1878, -1889, -1900, -1910, -: 118:-1921, -1932, -1943, -1954, -1964, -1975, -1986, -1997, -2008, -2018, -: 119:-2029, -2040, -2051, -2062, -2072, -2083, -2094, -2105, -2116, -2126, -: 120:-2137, -2148, -2159, -2170, -2180, -2191, -2202, -2213, -2224, -2234, -: 121:-2245, -2256, -2267, -2278, -2288, -2299, -2310, -2321, -2332, -2342, -: 122:-2353, -2364, -2375, -2386, -2396, -2407, -2418, -2429, -2440, -2450, -: 123:-2461, -2472, -2483, -2494, -2504, -2515, -2526, -2537, -2548, -2558, -: 124:-2569, -2580, -2591, -2602, -2612, -2623, -2634, -2645, -2656, -2666, -: 125:-2677, -2688, -2699, -2710, -2720, -2731, -2742, -2753 }; -: 126: -: 127:static INT16 Cb_G[] = { 0, -20, -41, -63, -84, -105, -126, -147, -169, -: 128:-190, -211, -232, -253, -275, -296, -317, -338, -359, -381, -402, -: 129:-423, -444, -465, -487, -508, -529, -550, -571, -593, -614, -635, -: 130:-656, -677, -699, -720, -741, -762, -783, -805, -826, -847, -868, -: 131:-889, -911, -932, -953, -974, -995, -1017, -1038, -1059, -1080, -1101, -: 132:-1123, -1144, -1165, -1186, -1207, -1229, -1250, -1271, -1292, -1313, -: 133:-1335, -1356, -1377, -1398, -1419, -1441, -1462, -1483, -1504, -1525, -: 134:-1547, -1568, -1589, -1610, -1631, -1653, -1674, -1695, -1716, -1737, -: 135:-1759, -1780, -1801, -1822, -1843, -1865, -1886, -1907, -1928, -1949, -: 136:-1971, -1992, -2013, -2034, -2055, -2077, -2098, -2119, -2140, -2161, -: 137:-2183, -2204, -2225, -2246, -2267, -2289, -2310, -2331, -2352, -2373, -: 138:-2395, -2416, -2437, -2458, -2479, -2501, -2522, -2543, -2564, -2585, -: 139:-2607, -2628, -2649, -2670, -2691, -2713, -2734, -2755, -2776, -2797, -: 140:-2819, -2840, -2861, -2882, -2903, -2925, -2946, -2967, -2988, -3009, -: 141:-3031, -3052, -3073, -3094, -3115, -3137, -3158, -3179, -3200, -3221, -: 142:-3243, -3264, -3285, -3306, -3328, -3349, -3370, -3391, -3412, -3434, -: 143:-3455, -3476, -3497, -3518, -3540, -3561, -3582, -3603, -3624, -3646, -: 144:-3667, -3688, -3709, -3730, -3752, -3773, -3794, -3815, -3836, -3858, -: 145:-3879, -3900, -3921, -3942, -3964, -3985, -4006, -4027, -4048, -4070, -: 146:-4091, -4112, -4133, -4154, -4176, -4197, -4218, -4239, -4260, -4282, -: 147:-4303, -4324, -4345, -4366, -4388, -4409, -4430, -4451, -4472, -4494, -: 148:-4515, -4536, -4557, -4578, -4600, -4621, -4642, -4663, -4684, -4706, -: 149:-4727, -4748, -4769, -4790, -4812, -4833, -4854, -4875, -4896, -4918, -: 150:-4939, -4960, -4981, -5002, -5024, -5045, -5066, -5087, -5108, -5130, -: 151:-5151, -5172, -5193, -5214, -5236, -5257, -5278, -5299, -5320, -5342, -: 152:-5363, -5384, -5405 }; -: 153: -: 154:static INT16 Cb_B[] = { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, -: 155:320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, -: 156:768, 800, 832, 864, 896, 928, 960, 992, 1024, 1056, 1088, 1120, 1152, -: 157:1184, 1216, 1248, 1280, 1312, 1344, 1376, 1408, 1440, 1472, 1504, -: 158:1536, 1568, 1600, 1632, 1664, 1696, 1728, 1760, 1792, 1824, 1856, -: 159:1888, 1920, 1952, 1984, 2016, 2048, 2080, 2112, 2144, 2176, 2208, -: 160:2240, 2272, 2304, 2336, 2368, 2400, 2432, 2464, 2496, 2528, 2560, -: 161:2592, 2624, 2656, 2688, 2720, 2752, 2784, 2816, 2848, 2880, 2912, -: 162:2944, 2976, 3008, 3040, 3072, 3104, 3136, 3168, 3200, 3232, 3264, -: 163:3296, 3328, 3360, 3392, 3424, 3456, 3488, 3520, 3552, 3584, 3616, -: 164:3648, 3680, 3712, 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968, -: 165:4000, 4032, 4064, 4096, 4128, 4160, 4192, 4224, 4256, 4288, 4320, -: 166:4352, 4384, 4416, 4448, 4480, 4512, 4544, 4576, 4608, 4640, 4672, -: 167:4704, 4736, 4768, 4800, 4832, 4864, 4896, 4928, 4960, 4992, 5024, -: 168:5056, 5088, 5120, 5152, 5184, 5216, 5248, 5280, 5312, 5344, 5376, -: 169:5408, 5440, 5472, 5504, 5536, 5568, 5600, 5632, 5664, 5696, 5728, -: 170:5760, 5792, 5824, 5856, 5888, 5920, 5952, 5984, 6016, 6048, 6080, -: 171:6112, 6144, 6176, 6208, 6240, 6272, 6304, 6336, 6368, 6400, 6432, -: 172:6464, 6496, 6528, 6560, 6592, 6624, 6656, 6688, 6720, 6752, 6784, -: 173:6816, 6848, 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104, 7136, -: 174:7168, 7200, 7232, 7264, 7296, 7328, 7360, 7392, 7424, 7456, 7488, -: 175:7520, 7552, 7584, 7616, 7648, 7680, 7712, 7744, 7776, 7808, 7840, -: 176:7872, 7904, 7936, 7968, 8000, 8032, 8064, 8096, 8128, 8160 }; -: 177: -: 178:#define Cr_R Cb_B -: 179: -: 180:static INT16 Cr_G[] = { 0, -26, -53, -79, -106, -133, -160, -187, -: 181:-213, -240, -267, -294, -321, -347, -374, -401, -428, -455, -481, -: 182:-508, -535, -562, -589, -615, -642, -669, -696, -722, -749, -776, -: 183:-803, -830, -856, -883, -910, -937, -964, -990, -1017, -1044, -1071, -: 184:-1098, -1124, -1151, -1178, -1205, -1232, -1258, -1285, -1312, -1339, -: 185:-1366, -1392, -1419, -1446, -1473, -1500, -1526, -1553, -1580, -1607, -: 186:-1634, -1660, -1687, -1714, -1741, -1768, -1794, -1821, -1848, -1875, -: 187:-1902, -1928, -1955, -1982, -2009, -2036, -2062, -2089, -2116, -2143, -: 188:-2169, -2196, -2223, -2250, -2277, -2303, -2330, -2357, -2384, -2411, -: 189:-2437, -2464, -2491, -2518, -2545, -2571, -2598, -2625, -2652, -2679, -: 190:-2705, -2732, -2759, -2786, -2813, -2839, -2866, -2893, -2920, -2947, -: 191:-2973, -3000, -3027, -3054, -3081, -3107, -3134, -3161, -3188, -3215, -: 192:-3241, -3268, -3295, -3322, -3349, -3375, -3402, -3429, -3456, -3483, -: 193:-3509, -3536, -3563, -3590, -3616, -3643, -3670, -3697, -3724, -3750, -: 194:-3777, -3804, -3831, -3858, -3884, -3911, -3938, -3965, -3992, -4018, -: 195:-4045, -4072, -4099, -4126, -4152, -4179, -4206, -4233, -4260, -4286, -: 196:-4313, -4340, -4367, -4394, -4420, -4447, -4474, -4501, -4528, -4554, -: 197:-4581, -4608, -4635, -4662, -4688, -4715, -4742, -4769, -4796, -4822, -: 198:-4849, -4876, -4903, -4929, -4956, -4983, -5010, -5037, -5063, -5090, -: 199:-5117, -5144, -5171, -5197, -5224, -5251, -5278, -5305, -5331, -5358, -: 200:-5385, -5412, -5439, -5465, -5492, -5519, -5546, -5573, -5599, -5626, -: 201:-5653, -5680, -5707, -5733, -5760, -5787, -5814, -5841, -5867, -5894, -: 202:-5921, -5948, -5975, -6001, -6028, -6055, -6082, -6109, -6135, -6162, -: 203:-6189, -6216, -6243, -6269, -6296, -6323, -6350, -6376, -6403, -6430, -: 204:-6457, -6484, -6510, -6537, -6564, -6591, -6618, -6644, -6671, -6698, -: 205:-6725, -6752, -6778, -6805, -6832 }; -: 206: -: 207:static INT16 Cr_B[] = { 0, -4, -9, -15, -20, -25, -30, -35, -41, -46, -: 208:-51, -56, -61, -67, -72, -77, -82, -87, -93, -98, -103, -108, -113, -: 209:-119, -124, -129, -134, -140, -145, -150, -155, -160, -166, -171, -: 210:-176, -181, -186, -192, -197, -202, -207, -212, -218, -223, -228, -: 211:-233, -238, -244, -249, -254, -259, -264, -270, -275, -280, -285, -: 212:-290, -296, -301, -306, -311, -316, -322, -327, -332, -337, -342, -: 213:-348, -353, -358, -363, -368, -374, -379, -384, -389, -394, -400, -: 214:-405, -410, -415, -421, -426, -431, -436, -441, -447, -452, -457, -: 215:-462, -467, -473, -478, -483, -488, -493, -499, -504, -509, -514, -: 216:-519, -525, -530, -535, -540, -545, -551, -556, -561, -566, -571, -: 217:-577, -582, -587, -592, -597, -603, -608, -613, -618, -623, -629, -: 218:-634, -639, -644, -649, -655, -660, -665, -670, -675, -681, -686, -: 219:-691, -696, -702, -707, -712, -717, -722, -728, -733, -738, -743, -: 220:-748, -754, -759, -764, -769, -774, -780, -785, -790, -795, -800, -: 221:-806, -811, -816, -821, -826, -832, -837, -842, -847, -852, -858, -: 222:-863, -868, -873, -878, -884, -889, -894, -899, -904, -910, -915, -: 223:-920, -925, -930, -936, -941, -946, -951, -957, -962, -967, -972, -: 224:-977, -983, -988, -993, -998, -1003, -1009, -1014, -1019, -1024, -: 225:-1029, -1035, -1040, -1045, -1050, -1055, -1061, -1066, -1071, -1076, -: 226:-1081, -1087, -1092, -1097, -1102, -1107, -1113, -1118, -1123, -1128, -: 227:-1133, -1139, -1144, -1149, -1154, -1159, -1165, -1170, -1175, -1180, -: 228:-1185, -1191, -1196, -1201, -1206, -1211, -1217, -1222, -1227, -1232, -: 229:-1238, -1243, -1248, -1253, -1258, -1264, -1269, -1274, -1279, -1284, -: 230:-1290, -1295, -1300, -1305, -1310, -1316, -1321, -1326 }; -: 231: -: 232:static INT16 R_Cr[] = { -11484, -11394, -11305, -11215, -11125, -: 233:-11036, -10946, -10856, -10766, -10677, -10587, -10497, -10407, -: 234:-10318, -10228, -10138, -10049, -9959, -9869, -9779, -9690, -9600, -: 235:-9510, -9420, -9331, -9241, -9151, -9062, -8972, -8882, -8792, -8703, -: 236:-8613, -8523, -8433, -8344, -8254, -8164, -8075, -7985, -7895, -7805, -: 237:-7716, -7626, -7536, -7446, -7357, -7267, -7177, -7088, -6998, -6908, -: 238:-6818, -6729, -6639, -6549, -6459, -6370, -6280, -6190, -6101, -6011, -: 239:-5921, -5831, -5742, -5652, -5562, -5472, -5383, -5293, -5203, -5113, -: 240:-5024, -4934, -4844, -4755, -4665, -4575, -4485, -4396, -4306, -4216, -: 241:-4126, -4037, -3947, -3857, -3768, -3678, -3588, -3498, -3409, -3319, -: 242:-3229, -3139, -3050, -2960, -2870, -2781, -2691, -2601, -2511, -2422, -: 243:-2332, -2242, -2152, -2063, -1973, -1883, -1794, -1704, -1614, -1524, -: 244:-1435, -1345, -1255, -1165, -1076, -986, -896, -807, -717, -627, -537, -: 245:-448, -358, -268, -178, -89, 0, 90, 179, 269, 359, 449, 538, 628, 718, -: 246:808, 897, 987, 1077, 1166, 1256, 1346, 1436, 1525, 1615, 1705, 1795, -: 247:1884, 1974, 2064, 2153, 2243, 2333, 2423, 2512, 2602, 2692, 2782, -: 248:2871, 2961, 3051, 3140, 3230, 3320, 3410, 3499, 3589, 3679, 3769, -: 249:3858, 3948, 4038, 4127, 4217, 4307, 4397, 4486, 4576, 4666, 4756, -: 250:4845, 4935, 5025, 5114, 5204, 5294, 5384, 5473, 5563, 5653, 5743, -: 251:5832, 5922, 6012, 6102, 6191, 6281, 6371, 6460, 6550, 6640, 6730, -: 252:6819, 6909, 6999, 7089, 7178, 7268, 7358, 7447, 7537, 7627, 7717, -: 253:7806, 7896, 7986, 8076, 8165, 8255, 8345, 8434, 8524, 8614, 8704, -: 254:8793, 8883, 8973, 9063, 9152, 9242, 9332, 9421, 9511, 9601, 9691, -: 255:9780, 9870, 9960, 10050, 10139, 10229, 10319, 10408, 10498, 10588, -: 256:10678, 10767, 10857, 10947, 11037, 11126, 11216, 11306, 11395 }; -: 257: -: 258:static INT16 G_Cb[] = { 2819, 2797, 2775, 2753, 2731, 2709, 2687, -: 259:2665, 2643, 2621, 2599, 2577, 2555, 2533, 2511, 2489, 2467, 2445, -: 260:2423, 2401, 2379, 2357, 2335, 2313, 2291, 2269, 2247, 2225, 2202, -: 261:2180, 2158, 2136, 2114, 2092, 2070, 2048, 2026, 2004, 1982, 1960, -: 262:1938, 1916, 1894, 1872, 1850, 1828, 1806, 1784, 1762, 1740, 1718, -: 263:1696, 1674, 1652, 1630, 1608, 1586, 1564, 1542, 1520, 1498, 1476, -: 264:1454, 1432, 1410, 1388, 1366, 1344, 1321, 1299, 1277, 1255, 1233, -: 265:1211, 1189, 1167, 1145, 1123, 1101, 1079, 1057, 1035, 1013, 991, 969, -: 266:947, 925, 903, 881, 859, 837, 815, 793, 771, 749, 727, 705, 683, 661, -: 267:639, 617, 595, 573, 551, 529, 507, 485, 463, 440, 418, 396, 374, 352, -: 268:330, 308, 286, 264, 242, 220, 198, 176, 154, 132, 110, 88, 66, 44, 22, -: 269:0, -21, -43, -65, -87, -109, -131, -153, -175, -197, -219, -241, -263, -: 270:-285, -307, -329, -351, -373, -395, -417, -439, -462, -484, -506, -: 271:-528, -550, -572, -594, -616, -638, -660, -682, -704, -726, -748, -: 272:-770, -792, -814, -836, -858, -880, -902, -924, -946, -968, -990, -: 273:-1012, -1034, -1056, -1078, -1100, -1122, -1144, -1166, -1188, -1210, -: 274:-1232, -1254, -1276, -1298, -1320, -1343, -1365, -1387, -1409, -1431, -: 275:-1453, -1475, -1497, -1519, -1541, -1563, -1585, -1607, -1629, -1651, -: 276:-1673, -1695, -1717, -1739, -1761, -1783, -1805, -1827, -1849, -1871, -: 277:-1893, -1915, -1937, -1959, -1981, -2003, -2025, -2047, -2069, -2091, -: 278:-2113, -2135, -2157, -2179, -2201, -2224, -2246, -2268, -2290, -2312, -: 279:-2334, -2356, -2378, -2400, -2422, -2444, -2466, -2488, -2510, -2532, -: 280:-2554, -2576, -2598, -2620, -2642, -2664, -2686, -2708, -2730, -2752, -: 281:-2774, -2796 }; -: 282: -: 283:static INT16 G_Cr[] = { 5850, 5805, 5759, 5713, 5667, 5622, 5576, -: 284:5530, 5485, 5439, 5393, 5347, 5302, 5256, 5210, 5165, 5119, 5073, -: 285:5028, 4982, 4936, 4890, 4845, 4799, 4753, 4708, 4662, 4616, 4570, -: 286:4525, 4479, 4433, 4388, 4342, 4296, 4251, 4205, 4159, 4113, 4068, -: 287:4022, 3976, 3931, 3885, 3839, 3794, 3748, 3702, 3656, 3611, 3565, -: 288:3519, 3474, 3428, 3382, 3336, 3291, 3245, 3199, 3154, 3108, 3062, -: 289:3017, 2971, 2925, 2879, 2834, 2788, 2742, 2697, 2651, 2605, 2559, -: 290:2514, 2468, 2422, 2377, 2331, 2285, 2240, 2194, 2148, 2102, 2057, -: 291:2011, 1965, 1920, 1874, 1828, 1782, 1737, 1691, 1645, 1600, 1554, -: 292:1508, 1463, 1417, 1371, 1325, 1280, 1234, 1188, 1143, 1097, 1051, -: 293:1006, 960, 914, 868, 823, 777, 731, 686, 640, 594, 548, 503, 457, 411, -: 294:366, 320, 274, 229, 183, 137, 91, 46, 0, -45, -90, -136, -182, -228, -: 295:-273, -319, -365, -410, -456, -502, -547, -593, -639, -685, -730, -: 296:-776, -822, -867, -913, -959, -1005, -1050, -1096, -1142, -1187, -: 297:-1233, -1279, -1324, -1370, -1416, -1462, -1507, -1553, -1599, -1644, -: 298:-1690, -1736, -1781, -1827, -1873, -1919, -1964, -2010, -2056, -2101, -: 299:-2147, -2193, -2239, -2284, -2330, -2376, -2421, -2467, -2513, -2558, -: 300:-2604, -2650, -2696, -2741, -2787, -2833, -2878, -2924, -2970, -3016, -: 301:-3061, -3107, -3153, -3198, -3244, -3290, -3335, -3381, -3427, -3473, -: 302:-3518, -3564, -3610, -3655, -3701, -3747, -3793, -3838, -3884, -3930, -: 303:-3975, -4021, -4067, -4112, -4158, -4204, -4250, -4295, -4341, -4387, -: 304:-4432, -4478, -4524, -4569, -4615, -4661, -4707, -4752, -4798, -4844, -: 305:-4889, -4935, -4981, -5027, -5072, -5118, -5164, -5209, -5255, -5301, -: 306:-5346, -5392, -5438, -5484, -5529, -5575, -5621, -5666, -5712, -5758, -: 307:-5804 }; -: 308: -: 309:static INT16 B_Cb[] = { -14515, -14402, -14288, -14175, -14062, -: 310:-13948, -13835, -13721, -13608, -13495, -13381, -13268, -13154, -: 311:-13041, -12928, -12814, -12701, -12587, -12474, -12360, -12247, -: 312:-12134, -12020, -11907, -11793, -11680, -11567, -11453, -11340, -: 313:-11226, -11113, -11000, -10886, -10773, -10659, -10546, -10433, -: 314:-10319, -10206, -10092, -9979, -9865, -9752, -9639, -9525, -9412, -: 315:-9298, -9185, -9072, -8958, -8845, -8731, -8618, -8505, -8391, -8278, -: 316:-8164, -8051, -7938, -7824, -7711, -7597, -7484, -7371, -7257, -7144, -: 317:-7030, -6917, -6803, -6690, -6577, -6463, -6350, -6236, -6123, -6010, -: 318:-5896, -5783, -5669, -5556, -5443, -5329, -5216, -5102, -4989, -4876, -: 319:-4762, -4649, -4535, -4422, -4309, -4195, -4082, -3968, -3855, -3741, -: 320:-3628, -3515, -3401, -3288, -3174, -3061, -2948, -2834, -2721, -2607, -: 321:-2494, -2381, -2267, -2154, -2040, -1927, -1814, -1700, -1587, -1473, -: 322:-1360, -1246, -1133, -1020, -906, -793, -679, -566, -453, -339, -226, -: 323:-112, 0, 113, 227, 340, 454, 567, 680, 794, 907, 1021, 1134, 1247, -: 324:1361, 1474, 1588, 1701, 1815, 1928, 2041, 2155, 2268, 2382, 2495, -: 325:2608, 2722, 2835, 2949, 3062, 3175, 3289, 3402, 3516, 3629, 3742, -: 326:3856, 3969, 4083, 4196, 4310, 4423, 4536, 4650, 4763, 4877, 4990, -: 327:5103, 5217, 5330, 5444, 5557, 5670, 5784, 5897, 6011, 6124, 6237, -: 328:6351, 6464, 6578, 6691, 6804, 6918, 7031, 7145, 7258, 7372, 7485, -: 329:7598, 7712, 7825, 7939, 8052, 8165, 8279, 8392, 8506, 8619, 8732, -: 330:8846, 8959, 9073, 9186, 9299, 9413, 9526, 9640, 9753, 9866, 9980, -: 331:10093, 10207, 10320, 10434, 10547, 10660, 10774, 10887, 11001, 11114, -: 332:11227, 11341, 11454, 11568, 11681, 11794, 11908, 12021, 12135, 12248, -: 333:12361, 12475, 12588, 12702, 12815, 12929, 13042, 13155, 13269, 13382, -: 334:13496, 13609, 13722, 13836, 13949, 14063, 14176, 14289, 14403 }; -: 335: -: 336: -: 337:void function ImagingConvertRGB2YCbCr called 1280 returned 100% blocks executed 100% 1280: 338:ImagingConvertRGB2YCbCr(UINT8* out, const UINT8* in, int pixels) -: 339:{ -: 340: int x; -: 341: UINT8 a; -: 342: int r, g, b; -: 343: int y, cr, cb; -: 344: 165120: 345: for (x = 0; x < pixels; x++, in +=4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 346: 163840: 347: r = in[0]; 163840: 348: g = in[1]; 163840: 349: b = in[2]; 163840: 350: a = in[3]; -: 351: 163840: 352: y = (Y_R[r] + Y_G[g] + Y_B[b]) >> SCALE; 163840: 353: cb = ((Cb_R[r] + Cb_G[g] + Cb_B[b]) >> SCALE) + 128; 163840: 354: cr = ((Cr_R[r] + Cr_G[g] + Cr_B[b]) >> SCALE) + 128; -: 355: 163840: 356: out[0] = (UINT8) y; 163840: 357: out[1] = (UINT8) cb; 163840: 358: out[2] = (UINT8) cr; 163840: 359: out[3] = a; -: 360: } 1280: 361:} -: 362: -: 363:void function ImagingConvertYCbCr2RGB called 1280 returned 100% blocks executed 100% 1280: 364:ImagingConvertYCbCr2RGB(UINT8* out, const UINT8* in, int pixels) -: 365:{ -: 366: int x; -: 367: UINT8 a; -: 368: int r, g, b; -: 369: int y, cr, cb; -: 370: 165120: 371: for (x = 0; x < pixels; x++, in += 4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 372: 163840: 373: y = in[0]; 163840: 374: cb = in[1]; 163840: 375: cr = in[2]; 163840: 376: a = in[3]; -: 377: 163840: 378: r = y + (( R_Cr[cr]) >> SCALE); 163840: 379: g = y + ((G_Cb[cb] + G_Cr[cr]) >> SCALE); 163840: 380: b = y + ((B_Cb[cb] ) >> SCALE); -: 381: 163840: 382: out[0] = (r <= 0) ? 0 : (r >= 255) ? 255 : r; branch 0 taken 99% (fallthrough) branch 1 taken 1% 163840: 383: out[1] = (g <= 0) ? 0 : (g >= 255) ? 255 : g; branch 0 taken 99% (fallthrough) branch 1 taken 1% 163840: 384: out[2] = (b <= 0) ? 0 : (b >= 255) ? 255 : b; branch 0 taken 99% (fallthrough) branch 1 taken 1% 163840: 385: out[3] = a; -: 386: } 1280: 387:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#BoxBlur.c.gcov -: 0:Source:src/libImaging/BoxBlur.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/BoxBlur.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/BoxBlur.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:#include "Imaging.h" -: 2: -: 3: -: 4:#define MAX(x, y) (((x) > (y)) ? (x) : (y)) -: 5:#define MIN(x, y) (((x) < (y)) ? (x) : (y)) -: 6: -: 7: -: 8:typedef UINT8 pixel[4]; -: 9: -: 10:void static inline function ImagingLineBoxBlur32 called 13172 returned 100% blocks executed 100% 13172: 11:ImagingLineBoxBlur32(pixel *lineOut, pixel *lineIn, int lastx, int radius, int edgeA, -: 12: int edgeB, UINT32 ww, UINT32 fw) -: 13:{ -: 14: int x; -: 15: UINT32 acc[4]; -: 16: UINT32 bulk[4]; -: 17: -: 18: #define MOVE_ACC(acc, subtract, add) \ -: 19: acc[0] += lineIn[add][0] - lineIn[subtract][0]; \ -: 20: acc[1] += lineIn[add][1] - lineIn[subtract][1]; \ -: 21: acc[2] += lineIn[add][2] - lineIn[subtract][2]; \ -: 22: acc[3] += lineIn[add][3] - lineIn[subtract][3]; -: 23: -: 24: #define ADD_FAR(bulk, acc, left, right) \ -: 25: bulk[0] = (acc[0] * ww) + (lineIn[left][0] + lineIn[right][0]) * fw; \ -: 26: bulk[1] = (acc[1] * ww) + (lineIn[left][1] + lineIn[right][1]) * fw; \ -: 27: bulk[2] = (acc[2] * ww) + (lineIn[left][2] + lineIn[right][2]) * fw; \ -: 28: bulk[3] = (acc[3] * ww) + (lineIn[left][3] + lineIn[right][3]) * fw; -: 29: -: 30: #define SAVE(x, bulk) \ -: 31: lineOut[x][0] = (UINT8)((bulk[0] + (1 << 23)) >> 24); \ -: 32: lineOut[x][1] = (UINT8)((bulk[1] + (1 << 23)) >> 24); \ -: 33: lineOut[x][2] = (UINT8)((bulk[2] + (1 << 23)) >> 24); \ -: 34: lineOut[x][3] = (UINT8)((bulk[3] + (1 << 23)) >> 24); -: 35: -: 36: /* Compute acc for -1 pixel (outside of image): -: 37: From "-radius-1" to "-1" get first pixel, -: 38: then from "0" to "radius-1". */ 13172: 39: acc[0] = lineIn[0][0] * (radius + 1); 13172: 40: acc[1] = lineIn[0][1] * (radius + 1); 13172: 41: acc[2] = lineIn[0][2] * (radius + 1); 13172: 42: acc[3] = lineIn[0][3] * (radius + 1); -: 43: /* As radius can be bigger than xsize, iterate to edgeA -1. */ 45464: 44: for (x = 0; x < edgeA - 1; x++) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 32292: 45: acc[0] += lineIn[x][0]; 32292: 46: acc[1] += lineIn[x][1]; 32292: 47: acc[2] += lineIn[x][2]; 32292: 48: acc[3] += lineIn[x][3]; -: 49: } -: 50: /* Then multiply remainder to last x. */ 13172: 51: acc[0] += lineIn[lastx][0] * (radius - edgeA + 1); 13172: 52: acc[1] += lineIn[lastx][1] * (radius - edgeA + 1); 13172: 53: acc[2] += lineIn[lastx][2] * (radius - edgeA + 1); 13172: 54: acc[3] += lineIn[lastx][3] * (radius - edgeA + 1); -: 55: 13172: 56: if (edgeA <= edgeB) branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 57: { -: 58: /* Subtract pixel from left ("0"). -: 59: Add pixels from radius. */ 45276: 60: for (x = 0; x < edgeA; x++) { branch 0 taken 78% branch 1 taken 22% (fallthrough) 45276: 61: MOVE_ACC(acc, 0, x + radius); 45276: 62: ADD_FAR(bulk, acc, 0, x + radius + 1); 45276: 63: SAVE(x, bulk); -: 64: } -: 65: /* Subtract previous pixel from "-radius". -: 66: Add pixels from radius. */ 1550308: 67: for (x = edgeA; x < edgeB; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1550308: 68: MOVE_ACC(acc, x - radius - 1, x + radius); 1550308: 69: ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); 1550308: 70: SAVE(x, bulk); -: 71: } -: 72: /* Subtract previous pixel from "-radius". -: 73: Add last pixel. */ 45276: 74: for (x = edgeB; x <= lastx; x++) { branch 0 taken 78% branch 1 taken 22% 45276: 75: MOVE_ACC(acc, x - radius - 1, lastx); 45276: 76: ADD_FAR(bulk, acc, x - radius - 1, lastx); 45276: 77: SAVE(x, bulk); -: 78: } -: 79: } -: 80: else -: 81: { 22: 82: for (x = 0; x < edgeB; x++) { branch 0 taken 38% branch 1 taken 62% (fallthrough) 22: 83: MOVE_ACC(acc, 0, x + radius); 22: 84: ADD_FAR(bulk, acc, 0, x + radius + 1); 22: 85: SAVE(x, bulk); -: 86: } 166: 87: for (x = edgeB; x < edgeA; x++) { branch 0 taken 82% branch 1 taken 18% (fallthrough) 166: 88: MOVE_ACC(acc, 0, lastx); 166: 89: ADD_FAR(bulk, acc, 0, lastx); 166: 90: SAVE(x, bulk); -: 91: } 22: 92: for (x = edgeA; x <= lastx; x++) { branch 0 taken 38% branch 1 taken 62% (fallthrough) 22: 93: MOVE_ACC(acc, x - radius - 1, lastx); 22: 94: ADD_FAR(bulk, acc, x - radius - 1, lastx); 22: 95: SAVE(x, bulk); -: 96: } -: 97: } -: 98: -: 99: #undef MOVE_ACC -: 100: #undef ADD_FAR -: 101: #undef SAVE 13172: 102:} -: 103: -: 104: -: 105:void static inline function ImagingLineBoxBlur8 called 4300 returned 100% blocks executed 100% 4300: 106:ImagingLineBoxBlur8(UINT8 *lineOut, UINT8 *lineIn, int lastx, int radius, int edgeA, -: 107: int edgeB, UINT32 ww, UINT32 fw) -: 108:{ -: 109: int x; -: 110: UINT32 acc; -: 111: UINT32 bulk; -: 112: -: 113: #define MOVE_ACC(acc, subtract, add) \ -: 114: acc += lineIn[add] - lineIn[subtract]; -: 115: -: 116: #define ADD_FAR(bulk, acc, left, right) \ -: 117: bulk = (acc * ww) + (lineIn[left] + lineIn[right]) * fw; -: 118: -: 119: #define SAVE(x, bulk) \ -: 120: lineOut[x] = (UINT8)((bulk + (1 << 23)) >> 24) -: 121: 4300: 122: acc = lineIn[0] * (radius + 1); 18128: 123: for (x = 0; x < edgeA - 1; x++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 13828: 124: acc += lineIn[x]; -: 125: } 4300: 126: acc += lineIn[lastx] * (radius - edgeA + 1); -: 127: 4300: 128: if (edgeA <= edgeB) branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 129: { 17940: 130: for (x = 0; x < edgeA; x++) { branch 0 taken 81% branch 1 taken 19% (fallthrough) 17940: 131: MOVE_ACC(acc, 0, x + radius); 17940: 132: ADD_FAR(bulk, acc, 0, x + radius + 1); 17940: 133: SAVE(x, bulk); -: 134: } 489388: 135: for (x = edgeA; x < edgeB; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 489388: 136: MOVE_ACC(acc, x - radius - 1, x + radius); 489388: 137: ADD_FAR(bulk, acc, x - radius - 1, x + radius + 1); 489388: 138: SAVE(x, bulk); -: 139: } 17940: 140: for (x = edgeB; x <= lastx; x++) { branch 0 taken 81% branch 1 taken 19% 17940: 141: MOVE_ACC(acc, x - radius - 1, lastx); 17940: 142: ADD_FAR(bulk, acc, x - radius - 1, lastx); 17940: 143: SAVE(x, bulk); -: 144: } -: 145: } -: 146: else -: 147: { 22: 148: for (x = 0; x < edgeB; x++) { branch 0 taken 38% branch 1 taken 62% (fallthrough) 22: 149: MOVE_ACC(acc, 0, x + radius); 22: 150: ADD_FAR(bulk, acc, 0, x + radius + 1); 22: 151: SAVE(x, bulk); -: 152: } 166: 153: for (x = edgeB; x < edgeA; x++) { branch 0 taken 82% branch 1 taken 18% (fallthrough) 166: 154: MOVE_ACC(acc, 0, lastx); 166: 155: ADD_FAR(bulk, acc, 0, lastx); 166: 156: SAVE(x, bulk); -: 157: } 22: 158: for (x = edgeA; x <= lastx; x++) { branch 0 taken 38% branch 1 taken 62% (fallthrough) 22: 159: MOVE_ACC(acc, x - radius - 1, lastx); 22: 160: ADD_FAR(bulk, acc, x - radius - 1, lastx); 22: 161: SAVE(x, bulk); -: 162: } -: 163: } -: 164: -: 165: #undef MOVE_ACC -: 166: #undef ADD_FAR -: 167: #undef SAVE 4300: 168:} -: 169: -: 170: -: 171: -: 172:Imaging function ImagingHorizontalBoxBlur called 220 returned 100% blocks executed 96% 220: 173:ImagingHorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) -: 174:{ -: 175: ImagingSectionCookie cookie; -: 176: -: 177: int y; -: 178: 220: 179: int radius = (int) floatRadius; 220: 180: UINT32 ww = (UINT32) (1 << 24) / (floatRadius * 2 + 1); 220: 181: UINT32 fw = ((1 << 24) - (radius * 2 + 1) * ww) / 2; -: 182: 220: 183: int edgeA = MIN(radius + 1, imIn->xsize); 220: 184: int edgeB = MAX(imIn->xsize - radius - 1, 0); -: 185: 220: 186: UINT32 *lineOut = calloc(imIn->xsize, sizeof(UINT32)); 220: 187: if (lineOut == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 188: return ImagingError_MemoryError(); call 0 never executed -: 189: } -: 190: -: 191: // printf(">>> %d %d %d\n", radius, ww, fw); -: 192: 220: 193: ImagingSectionEnter(&cookie); call 0 returned 100% -: 194: 220: 195: if (imIn->image8) branch 0 taken 70% (fallthrough) branch 1 taken 30% -: 196: { 4300: 197: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 98% branch 1 taken 2% 13738: 198: ImagingLineBoxBlur8( branch 0 taken 19% (fallthrough) branch 1 taken 81% call 2 returned 100% 838: 199: (imIn == imOut ? (UINT8 *) lineOut : imOut->image8[y]), 4300: 200: imIn->image8[y], 4300: 201: imIn->xsize - 1, -: 202: radius, edgeA, edgeB, -: 203: ww, fw -: 204: ); 4300: 205: if (imIn == imOut) { branch 0 taken 81% (fallthrough) branch 1 taken 19% -: 206: // Commit. 3462: 207: memcpy(imOut->image8[y], lineOut, imIn->xsize); -: 208: } -: 209: } -: 210: } -: 211: else -: 212: { 13172: 213: for (y = 0; y < imIn->ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 41930: 214: ImagingLineBoxBlur32( branch 0 taken 18% (fallthrough) branch 1 taken 82% call 2 returned 100% 2414: 215: imIn == imOut ? (pixel *) lineOut : (pixel *) imOut->image32[y], 13172: 216: (pixel *) imIn->image32[y], 13172: 217: imIn->xsize - 1, -: 218: radius, edgeA, edgeB, -: 219: ww, fw -: 220: ); 13172: 221: if (imIn == imOut) { branch 0 taken 82% (fallthrough) branch 1 taken 18% -: 222: // Commit. 10758: 223: memcpy(imOut->image32[y], lineOut, imIn->xsize * 4); -: 224: } -: 225: } -: 226: } -: 227: 220: 228: ImagingSectionLeave(&cookie); call 0 returned 100% -: 229: 220: 230: free(lineOut); -: 231: 220: 232: return imOut; -: 233:} -: 234: -: 235: -: 236:Imaging function ImagingBoxBlur called 71 returned 100% blocks executed 96% 71: 237:ImagingBoxBlur(Imaging imOut, Imaging imIn, float radius, int n) -: 238:{ -: 239: int i; -: 240: Imaging imTransposed; -: 241: 71: 242: if (n < 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 243: return ImagingError_ValueError( call 0 never executed -: 244: "number of passes must be greater than zero" -: 245: ); -: 246: } -: 247: 142: 248: if (strcmp(imIn->mode, imOut->mode) || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 71: 249: imIn->type != imOut->type || 71: 250: imIn->bands != imOut->bands || branch 0 taken 100% (fallthrough) branch 1 taken 0% 71: 251: imIn->xsize != imOut->xsize || branch 0 taken 0% (fallthrough) branch 1 taken 100% 71: 252: imIn->ysize != imOut->ysize) { #####: 253: return ImagingError_Mismatch(); call 0 never executed -: 254: } -: 255: 71: 256: if (imIn->type != IMAGING_TYPE_UINT8) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 6: 257: return ImagingError_ModeError(); call 0 returned 100% -: 258: } -: 259: 127: 260: if (!(strcmp(imIn->mode, "RGB") == 0 || branch 0 taken 43% (fallthrough) branch 1 taken 57% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 83% (fallthrough) branch 7 taken 17% branch 8 taken 70% (fallthrough) branch 9 taken 30% branch 10 taken 88% (fallthrough) branch 11 taken 13% 92: 261: strcmp(imIn->mode, "RGBA") == 0 || branch 0 taken 97% (fallthrough) branch 1 taken 3% 75: 262: strcmp(imIn->mode, "RGBa") == 0 || branch 0 taken 100% (fallthrough) branch 1 taken 0% 74: 263: strcmp(imIn->mode, "RGBX") == 0 || branch 0 taken 78% (fallthrough) branch 1 taken 22% 66: 264: strcmp(imIn->mode, "CMYK") == 0 || branch 0 taken 31% (fallthrough) branch 1 taken 69% 38: 265: strcmp(imIn->mode, "L") == 0 || branch 0 taken 76% (fallthrough) branch 1 taken 24% branch 2 taken 89% (fallthrough) branch 3 taken 11% 9: 266: strcmp(imIn->mode, "LA") == 0 || branch 0 taken 22% (fallthrough) branch 1 taken 78% branch 2 taken 50% (fallthrough) branch 3 taken 50% 8: 267: strcmp(imIn->mode, "La") == 0)) { branch 0 taken 13% (fallthrough) branch 1 taken 88% branch 2 taken 100% (fallthrough) branch 3 taken 0% 7: 268: return ImagingError_ModeError(); call 0 returned 100% -: 269: } -: 270: 58: 271: imTransposed = ImagingNewDirty(imIn->mode, imIn->ysize, imIn->xsize); call 0 returned 100% 58: 272: if (!imTransposed) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 273: return NULL; -: 274: } -: 275: -: 276: /* Apply blur in one dimension. -: 277: Use imOut as a destination at first pass, -: 278: then use imOut as a source too. */ 58: 279: ImagingHorizontalBoxBlur(imOut, imIn, radius); 110: 280: for (i = 1; i < n; i ++) { call 0 returned 100% branch 1 taken 47% branch 2 taken 53% (fallthrough) 52: 281: ImagingHorizontalBoxBlur(imOut, imOut, radius); call 0 returned 100% -: 282: } -: 283: /* Transpose result for blur in another direction. */ 58: 284: ImagingTranspose(imTransposed, imOut); -: 285: -: 286: /* Reuse imTransposed as a source and destination there. */ 168: 287: for (i = 0; i < n; i ++) { call 0 returned 100% branch 1 taken 65% branch 2 taken 35% (fallthrough) 110: 288: ImagingHorizontalBoxBlur(imTransposed, imTransposed, radius); call 0 returned 100% -: 289: } -: 290: /* Restore original orientation. */ 58: 291: ImagingTranspose(imOut, imTransposed); call 0 returned 100% -: 292: 58: 293: ImagingDelete(imTransposed); call 0 returned 100% -: 294: 58: 295: return imOut; -: 296:} -: 297: -: 298: function ImagingGaussianBlur called 31 returned 100% blocks executed 100% 31: 299:Imaging ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius, -: 300: int passes) -: 301:{ -: 302: float sigma2, L, l, a; -: 303: 31: 304: sigma2 = radius * radius / passes; -: 305: // from http://www.mia.uni-saarland.de/Publications/gwosdek-ssvm11.pdf -: 306: // [7] Box length. 31: 307: L = sqrt(12.0 * sigma2 + 1.0); -: 308: // [11] Integer part of box radius. 31: 309: l = floor((L - 1.0) / 2.0); -: 310: // [14], [Fig. 2] Fractional part of box radius. 31: 311: a = (2 * l + 1) * (l * (l + 1) - 3 * sigma2); 31: 312: a /= 6 * (sigma2 - (l + 1) * (l + 1)); -: 313: 31: 314: return ImagingBoxBlur(imOut, imIn, l + a, passes); call 0 returned 100% -: 315:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Paste.c.gcov -: 0:Source:src/libImaging/Paste.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Paste.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Paste.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * paste image on another image -: 6: * -: 7: * history: -: 8: * 96-03-27 fl Created -: 9: * 96-07-16 fl Support "1", "L" and "RGBA" masks -: 10: * 96-08-16 fl Merged with opaque paste -: 11: * 97-01-17 fl Faster blending, added support for RGBa images -: 12: * 97-08-27 fl Faster masking for 32-bit images -: 13: * 98-02-02 fl Fixed MULDIV255 macro for gcc -: 14: * 99-02-02 fl Added "RGBa" mask support -: 15: * 99-02-06 fl Rewritten. Added support for masked fill operations. -: 16: * 99-12-08 fl Fixed matte fill. -: 17: * -: 18: * Copyright (c) Fredrik Lundh 1996-97. -: 19: * Copyright (c) Secret Labs AB 1997-99. -: 20: * -: 21: * See the README file for information on usage and redistribution. -: 22: */ -: 23: -: 24:#include "Imaging.h" -: 25: -: 26: -: 27:static inline void function paste.isra.0 called 2066665 returned 100% blocks executed 100% 2066665: 28:paste(Imaging imOut, Imaging imIn, int dx, int dy, int sx, int sy, -: 29: int xsize, int ysize, int pixelsize) -: 30:{ -: 31: /* paste opaque region */ -: 32: -: 33: int y; -: 34: 2066665: 35: dx *= pixelsize; 2066665: 36: sx *= pixelsize; -: 37: 2066665: 38: xsize *= pixelsize; -: 39: 11845416: 40: for (y = 0; y < ysize; y++) { branch 0 taken 83% branch 1 taken 17% (fallthrough) 19557502: 41: memcpy(imOut->image[y+dy]+dx, imIn->image[y+sy]+sx, xsize); -: 42: } 2066665: 43:} -: 44: -: 45:static inline void function paste_mask_1.isra.1 called 6 returned 100% blocks executed 100% 6: 46:paste_mask_1(Imaging imOut, Imaging imIn, Imaging imMask, -: 47: int dx, int dy, int sx, int sy, -: 48: int xsize, int ysize, int pixelsize) -: 49:{ -: 50: /* paste with mode "1" mask */ -: 51: -: 52: int x, y; -: 53: 6: 54: if (imOut->image8) { branch 0 taken 67% (fallthrough) branch 1 taken 33% -: 55: 256: 56: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% 256: 57: UINT8* out = imOut->image8[y+dy]+dx; 256: 58: UINT8* in = imIn->image8[y+sy]+sx; 256: 59: UINT8* mask = imMask->image8[y+sy]+sx; 33024: 60: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 61: if (*mask++) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 16384: 62: *out = *in; -: 63: } 32768: 64: out++, in++; -: 65: } -: 66: } -: 67: -: 68: } else { -: 69: 512: 70: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 512: 71: INT32* out = imOut->image32[y+dy]+dx; 512: 72: INT32* in = imIn->image32[y+sy]+sx; 512: 73: UINT8* mask = imMask->image8[y+sy]+sx; 66048: 74: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 65536: 75: if (*mask++) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 32768: 76: *out = *in; -: 77: } 65536: 78: out++, in++; -: 79: } -: 80: } -: 81: } 6: 82:} -: 83: -: 84:static inline void function paste_mask_L.isra.2 called 11 returned 100% blocks executed 100% 11: 85:paste_mask_L(Imaging imOut, Imaging imIn, Imaging imMask, -: 86: int dx, int dy, int sx, int sy, -: 87: int xsize, int ysize, int pixelsize) -: 88:{ -: 89: /* paste with mode "L" matte */ -: 90: -: 91: int x, y; -: 92: unsigned int tmp1; -: 93: 11: 94: if (imOut->image8) { branch 0 taken 73% (fallthrough) branch 1 taken 27% -: 95: 384: 96: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% 384: 97: UINT8* out = imOut->image8[y+dy]+dx; 384: 98: UINT8* in = imIn->image8[y+sy]+sx; 384: 99: UINT8* mask = imMask->image8[y+sy]+sx; 49536: 100: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 49152: 101: *out = BLEND(*mask, *out, *in, tmp1); 49152: 102: out++, in++, mask++; -: 103: } -: 104: } -: 105: -: 106: } else { -: 107: 818: 108: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 818: 109: UINT8* out = (UINT8*) (imOut->image32[y + dy] + dx); 818: 110: UINT8* in = (UINT8*) (imIn->image32[y + sy] + sx); 818: 111: UINT8* mask = (UINT8*) (imMask->image8[y+sy] + sx); 115570: 112: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 114752: 113: UINT8 a = mask[0]; 114752: 114: out[0] = BLEND(a, out[0], in[0], tmp1); 114752: 115: out[1] = BLEND(a, out[1], in[1], tmp1); 114752: 116: out[2] = BLEND(a, out[2], in[2], tmp1); 114752: 117: out[3] = BLEND(a, out[3], in[3], tmp1); 114752: 118: out += 4; in += 4; mask ++; -: 119: } -: 120: } -: 121: } 11: 122:} -: 123: -: 124:static inline void function paste_mask_RGBA.isra.3 called 506 returned 100% blocks executed 100% 506: 125:paste_mask_RGBA(Imaging imOut, Imaging imIn, Imaging imMask, -: 126: int dx, int dy, int sx, int sy, -: 127: int xsize, int ysize, int pixelsize) -: 128:{ -: 129: /* paste with mode "RGBA" matte */ -: 130: -: 131: int x, y; -: 132: unsigned int tmp1; -: 133: 506: 134: if (imOut->image8) { branch 0 taken 40% (fallthrough) branch 1 taken 60% -: 135: 62430: 136: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% 62430: 137: UINT8* out = imOut->image8[y+dy]+dx; 62430: 138: UINT8* in = imIn->image8[y+sy]+sx; 62430: 139: UINT8* mask = (UINT8*) imMask->image[y+sy]+sx*4+3; 15242356: 140: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 15179926: 141: *out = BLEND(*mask, *out, *in, tmp1); 15179926: 142: out++, in++, mask += 4; -: 143: } -: 144: } -: 145: -: 146: } else { -: 147: 12664: 148: for (y = 0; y < ysize; y++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 12664: 149: UINT8* out = (UINT8*) (imOut->image32[y + dy] + dx); 12664: 150: UINT8* in = (UINT8*) (imIn->image32[y + sy] + sx); 12664: 151: UINT8* mask = (UINT8*) (imMask->image32[y+sy] + sx); 1100956: 152: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1088292: 153: UINT8 a = mask[3]; 1088292: 154: out[0] = BLEND(a, out[0], in[0], tmp1); 1088292: 155: out[1] = BLEND(a, out[1], in[1], tmp1); 1088292: 156: out[2] = BLEND(a, out[2], in[2], tmp1); 1088292: 157: out[3] = BLEND(a, out[3], in[3], tmp1); 1088292: 158: out += 4; in += 4; mask += 4; -: 159: } -: 160: } -: 161: } 506: 162:} -: 163: -: 164: -: 165:static inline void function paste_mask_RGBa.isra.4 called 6 returned 100% blocks executed 100% 6: 166:paste_mask_RGBa(Imaging imOut, Imaging imIn, Imaging imMask, -: 167: int dx, int dy, int sx, int sy, -: 168: int xsize, int ysize, int pixelsize) -: 169:{ -: 170: /* paste with mode "RGBa" matte */ -: 171: -: 172: int x, y; -: 173: unsigned int tmp1; -: 174: 6: 175: if (imOut->image8) { branch 0 taken 67% (fallthrough) branch 1 taken 33% -: 176: 256: 177: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% 256: 178: UINT8* out = imOut->image8[y+dy]+dx; 256: 179: UINT8* in = imIn->image8[y+sy]+sx; 256: 180: UINT8* mask = (UINT8*) imMask->image[y+sy]+sx*4+3; 33024: 181: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 182: *out = PREBLEND(*mask, *out, *in, tmp1); 32768: 183: out++, in++, mask += 4; -: 184: } -: 185: } -: 186: -: 187: } else { -: 188: 512: 189: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 512: 190: UINT8* out = (UINT8*) (imOut->image32[y + dy] + dx); 512: 191: UINT8* in = (UINT8*) (imIn->image32[y + sy] + sx); 512: 192: UINT8* mask = (UINT8*) (imMask->image32[y+sy] + sx); 66048: 193: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 65536: 194: UINT8 a = mask[3]; 65536: 195: out[0] = PREBLEND(a, out[0], in[0], tmp1); 65536: 196: out[1] = PREBLEND(a, out[1], in[1], tmp1); 65536: 197: out[2] = PREBLEND(a, out[2], in[2], tmp1); 65536: 198: out[3] = PREBLEND(a, out[3], in[3], tmp1); 65536: 199: out += 4; in += 4; mask += 4; -: 200: } -: 201: } -: 202: } 6: 203:} -: 204: -: 205:int function ImagingPaste called 2067369 returned 100% blocks executed 84% 2067369: 206:ImagingPaste(Imaging imOut, Imaging imIn, Imaging imMask, -: 207: int dx0, int dy0, int dx1, int dy1) -: 208:{ -: 209: int xsize, ysize; -: 210: int pixelsize; -: 211: int sx0, sy0; -: 212: ImagingSectionCookie cookie; -: 213: 2067369: 214: if (!imOut || !imIn) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 215: (void) ImagingError_ModeError(); call 0 never executed #####: 216: return -1; -: 217: } -: 218: 2067369: 219: pixelsize = imOut->pixelsize; -: 220: 2067369: 221: xsize = dx1 - dx0; 2067369: 222: ysize = dy1 - dy0; -: 223: 4134738: 224: if (xsize != imIn->xsize || ysize != imIn->ysize || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% 2067369: 225: pixelsize != imIn->pixelsize) { #####: 226: (void) ImagingError_Mismatch(); call 0 never executed #####: 227: return -1; -: 228: } -: 229: 2067369: 230: if (imMask && (xsize != imMask->xsize || ysize != imMask->ysize)) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 231: (void) ImagingError_Mismatch(); call 0 never executed #####: 232: return -1; -: 233: } -: 234: -: 235: /* Determine which region to copy */ 2067369: 236: sx0 = sy0 = 0; 2067369: 237: if (dx0 < 0) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 819888: 238: xsize += dx0, sx0 = -dx0, dx0 = 0; -: 239: } 2067369: 240: if (dx0 + xsize > imOut->xsize) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 1024924: 241: xsize = imOut->xsize - dx0; -: 242: } 2067369: 243: if (dy0 < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 591: 244: ysize += dy0, sy0 = -dy0, dy0 = 0; -: 245: } 2067369: 246: if (dy0 + ysize > imOut->ysize) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 1025015: 247: ysize = imOut->ysize - dy0; -: 248: } -: 249: 2067369: 250: if (xsize <= 0 || ysize <= 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% -: 251: return 0; -: 252: } -: 253: 2067194: 254: if (!imMask) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 2066665: 255: ImagingSectionEnter(&cookie); call 0 returned 100% 2066665: 256: paste(imOut, imIn, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize); call 0 returned 100% 2066665: 257: ImagingSectionLeave(&cookie); call 0 returned 100% -: 258: 529: 259: } else if (strcmp(imMask->mode, "1") == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 1% (fallthrough) branch 3 taken 99% 6: 260: ImagingSectionEnter(&cookie); call 0 returned 100% 6: 261: paste_mask_1(imOut, imIn, imMask, dx0, dy0, sx0, sy0, call 0 returned 100% -: 262: xsize, ysize, pixelsize); 6: 263: ImagingSectionLeave(&cookie); call 0 returned 100% -: 264: 523: 265: } else if (strcmp(imMask->mode, "L") == 0) { branch 0 taken 2% (fallthrough) branch 1 taken 98% branch 2 taken 2% (fallthrough) branch 3 taken 98% 11: 266: ImagingSectionEnter(&cookie); call 0 returned 100% 11: 267: paste_mask_L(imOut, imIn, imMask, dx0, dy0, sx0, sy0, call 0 returned 100% -: 268: xsize, ysize, pixelsize); 11: 269: ImagingSectionLeave(&cookie); call 0 returned 100% -: 270: 512: 271: } else if (strcmp(imMask->mode, "RGBA") == 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 506: 272: ImagingSectionEnter(&cookie); call 0 returned 100% 506: 273: paste_mask_RGBA(imOut, imIn, imMask, dx0, dy0, sx0, sy0, call 0 returned 100% -: 274: xsize, ysize, pixelsize); 506: 275: ImagingSectionLeave(&cookie); call 0 returned 100% -: 276: 6: 277: } else if (strcmp(imMask->mode, "RGBa") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 278: ImagingSectionEnter(&cookie); call 0 returned 100% 6: 279: paste_mask_RGBa(imOut, imIn, imMask, dx0, dy0, sx0, sy0, call 0 returned 100% -: 280: xsize, ysize, pixelsize); 6: 281: ImagingSectionLeave(&cookie); call 0 returned 100% -: 282: -: 283: } else { #####: 284: (void) ImagingError_ValueError("bad transparency mask"); call 0 never executed #####: 285: return -1; -: 286: } -: 287: -: 288: return 0; -: 289:} -: 290: -: 291:static inline void function fill called 58 returned 100% blocks executed 100% 58: 292:fill(Imaging imOut, const void* ink_, int dx, int dy, -: 293: int xsize, int ysize, int pixelsize) -: 294:{ -: 295: /* fill opaque region */ -: 296: -: 297: int x, y; 58: 298: UINT8 ink8 = 0; 58: 299: INT32 ink32 = 0L; -: 300: 116: 301: memcpy(&ink32, ink_, pixelsize); 58: 302: memcpy(&ink8, ink_, sizeof(ink8)); -: 303: 58: 304: if (imOut->image8 || ink32 == 0L) { branch 0 taken 90% (fallthrough) branch 1 taken 10% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 305: 6: 306: dx *= pixelsize; 6: 307: xsize *= pixelsize; 466: 308: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% 920: 309: memset(imOut->image[y+dy]+dx, ink8, xsize); -: 310: } -: 311: -: 312: } else { -: 313: 4002: 314: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 4002: 315: INT32* out = imOut->image32[y+dy]+dx; 328878: 316: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 324876: 317: out[x] = ink32; -: 318: } -: 319: } -: 320: -: 321: } 58: 322:} -: 323: -: 324:static inline void function fill_mask_1.isra.5 called 114 returned 100% blocks executed 100% 114: 325:fill_mask_1(Imaging imOut, const void* ink_, Imaging imMask, -: 326: int dx, int dy, int sx, int sy, -: 327: int xsize, int ysize, int pixelsize) -: 328:{ -: 329: /* fill with mode "1" mask */ -: 330: -: 331: int x, y; 114: 332: UINT8 ink8 = 0; 114: 333: INT32 ink32 = 0L; -: 334: 228: 335: memcpy(&ink32, ink_, pixelsize); 114: 336: memcpy(&ink8, ink_, sizeof(ink8)); -: 337: 114: 338: if (imOut->image8) { branch 0 taken 93% (fallthrough) branch 1 taken 7% -: 339: 376: 340: for (y = 0; y < ysize; y++) { branch 0 taken 98% branch 1 taken 2% 376: 341: UINT8* out = imOut->image8[y+dy]+dx; 376: 342: UINT8* mask = imMask->image8[y+sy]+sx; 72344: 343: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 71968: 344: if (*mask++) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 23781: 345: *out = ink8; -: 346: } 71968: 347: out++; -: 348: } -: 349: } -: 350: -: 351: } else { -: 352: 1634: 353: for (y = 0; y < ysize; y++) { branch 0 taken 94% branch 1 taken 6% (fallthrough) 1634: 354: INT32* out = imOut->image32[y+dy]+dx; 1634: 355: UINT8* mask = imMask->image8[y+sy]+sx; 353610: 356: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 351976: 357: if (*mask++) { branch 0 taken 28% (fallthrough) branch 1 taken 72% 100020: 358: *out = ink32; -: 359: } 351976: 360: out++; -: 361: } -: 362: } -: 363: } 114: 364:} -: 365: -: 366:static inline void function fill_mask_L.isra.8 called 245 returned 100% blocks executed 82% 245: 367:fill_mask_L(Imaging imOut, const UINT8* ink, Imaging imMask, -: 368: int dx, int dy, int sx, int sy, -: 369: int xsize, int ysize, int pixelsize) -: 370:{ -: 371: /* fill with mode "L" matte */ -: 372: -: 373: int x, y, i; -: 374: unsigned int tmp1; -: 375: 245: 376: if (imOut->image8) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 377: 266: 378: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% 266: 379: UINT8* out = imOut->image8[y+dy]+dx; 266: 380: UINT8* mask = imMask->image8[y+sy]+sx; 33834: 381: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 33568: 382: *out = BLEND(*mask, *out, ink[0], tmp1); 33568: 383: out++, mask++; -: 384: } -: 385: } -: 386: -: 387: } else { -: 388: 10676: 389: for (y = 0; y < ysize; y++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 10676: 390: UINT8* out = (UINT8*) imOut->image[y+dy]+dx*pixelsize; 10676: 391: UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; 1025780: 392: for (x = 0; x < xsize; x++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 4060416: 393: for (i = 0; i < pixelsize; i++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 4060416: 394: UINT8 channel_mask = *mask; 4060416: 395: if (( branch 0 taken 100% (fallthrough) branch 1 taken 0% 8120832: 396: strcmp(imOut->mode, "RGBa") == 0 || branch 0 taken 96% (fallthrough) branch 1 taken 4% 7974784: 397: strcmp(imOut->mode, "RGBA") == 0 || branch 0 taken 100% (fallthrough) branch 1 taken 0% 7828736: 398: strcmp(imOut->mode, "La") == 0 || branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed branch 4 taken 100% (fallthrough) branch 5 taken 0% 7828736: 399: strcmp(imOut->mode, "LA") == 0 || branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed branch 4 taken 0% (fallthrough) branch 5 taken 100% 3914368: 400: strcmp(imOut->mode, "PA") == 0 branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed 146048: 401: ) && i != 3) { branch 0 taken 75% (fallthrough) branch 1 taken 25% 109536: 402: channel_mask = 255 - (255 - channel_mask) * (1 - (255 - out[3]) / 255); -: 403: } 4060416: 404: out[i] = BLEND(channel_mask, out[i], ink[i], tmp1); -: 405: } 1015104: 406: out += pixelsize; 1015104: 407: mask++; -: 408: } -: 409: } -: 410: } 245: 411:} -: 412: -: 413:static inline void function fill_mask_RGBA.isra.6 called 7 returned 100% blocks executed 100% 7: 414:fill_mask_RGBA(Imaging imOut, const UINT8* ink, Imaging imMask, -: 415: int dx, int dy, int sx, int sy, -: 416: int xsize, int ysize, int pixelsize) -: 417:{ -: 418: /* fill with mode "RGBA" matte */ -: 419: -: 420: int x, y, i; -: 421: unsigned int tmp1; -: 422: 7: 423: if (imOut->image8) { branch 0 taken 29% (fallthrough) branch 1 taken 71% -: 424: 2: 425: sx = sx*4+3; 258: 426: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% 256: 427: UINT8* out = imOut->image8[y+dy]+dx; 256: 428: UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; 33024: 429: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 430: *out = BLEND(*mask, *out, ink[0], tmp1); 32768: 431: out++, mask += 4; -: 432: } -: 433: } -: 434: -: 435: } else { -: 436: 5: 437: dx *= pixelsize; 5: 438: sx = sx*4 + 3; 567: 439: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 562: 440: UINT8* out = (UINT8*) imOut->image[y+dy]+dx; 562: 441: UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; 68598: 442: for (x = 0; x < xsize; x++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 272144: 443: for (i = 0; i < pixelsize; i++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 272144: 444: *out = BLEND(*mask, *out, ink[i], tmp1); 272144: 445: out++; -: 446: } 68036: 447: mask += 4; -: 448: } -: 449: } -: 450: } 7: 451:} -: 452: -: 453:static inline void function fill_mask_RGBa.isra.7 called 6 returned 100% blocks executed 100% 6: 454:fill_mask_RGBa(Imaging imOut, const UINT8* ink, Imaging imMask, -: 455: int dx, int dy, int sx, int sy, -: 456: int xsize, int ysize, int pixelsize) -: 457:{ -: 458: /* fill with mode "RGBa" matte */ -: 459: -: 460: int x, y, i; -: 461: unsigned int tmp1; -: 462: 6: 463: if (imOut->image8) { branch 0 taken 33% (fallthrough) branch 1 taken 67% -: 464: 2: 465: sx = sx*4 + 3; 258: 466: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% 256: 467: UINT8* out = imOut->image8[y+dy]+dx; 256: 468: UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; 33024: 469: for (x = 0; x < xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 470: *out = PREBLEND(*mask, *out, ink[0], tmp1); 32768: 471: out++, mask += 4; -: 472: } -: 473: } -: 474: -: 475: } else { -: 476: 4: 477: dx *= pixelsize; 4: 478: sx = sx*4 + 3; 516: 479: for (y = 0; y < ysize; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 512: 480: UINT8* out = (UINT8*) imOut->image[y+dy]+dx; 512: 481: UINT8* mask = (UINT8*) imMask->image[y+sy]+sx; 66048: 482: for (x = 0; x < xsize; x++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 262144: 483: for (i = 0; i < pixelsize; i++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 262144: 484: *out = PREBLEND(*mask, *out, ink[i], tmp1); 262144: 485: out++; -: 486: } 65536: 487: mask += 4; -: 488: } -: 489: } -: 490: } 6: 491:} -: 492: -: 493:int function ImagingFill2 called 432 returned 100% blocks executed 87% 432: 494:ImagingFill2(Imaging imOut, const void* ink, Imaging imMask, -: 495: int dx0, int dy0, int dx1, int dy1) -: 496:{ -: 497: ImagingSectionCookie cookie; -: 498: int xsize, ysize; -: 499: int pixelsize; -: 500: int sx0, sy0; -: 501: 432: 502: if (!imOut || !ink) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 503: (void) ImagingError_ModeError(); call 0 never executed #####: 504: return -1; -: 505: } -: 506: 432: 507: pixelsize = imOut->pixelsize; -: 508: 432: 509: xsize = dx1 - dx0; 432: 510: ysize = dy1 - dy0; -: 511: 432: 512: if (imMask && (xsize != imMask->xsize || ysize != imMask->ysize)) { branch 0 taken 87% (fallthrough) branch 1 taken 13% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 513: (void) ImagingError_Mismatch(); call 0 never executed #####: 514: return -1; -: 515: } -: 516: -: 517: /* Determine which region to fill */ 432: 518: sx0 = sy0 = 0; 432: 519: if (dx0 < 0) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 20: 520: xsize += dx0, sx0 = -dx0, dx0 = 0; -: 521: } 432: 522: if (dx0 + xsize > imOut->xsize) { branch 0 taken 30% (fallthrough) branch 1 taken 70% 129: 523: xsize = imOut->xsize - dx0; -: 524: } 432: 525: if (dy0 < 0) { branch 0 taken 4% (fallthrough) branch 1 taken 96% 17: 526: ysize += dy0, sy0 = -dy0, dy0 = 0; -: 527: } 432: 528: if (dy0 + ysize > imOut->ysize) { branch 0 taken 4% (fallthrough) branch 1 taken 96% 17: 529: ysize = imOut->ysize - dy0; -: 530: } -: 531: 432: 532: if (xsize <= 0 || ysize <= 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 533: return 0; -: 534: } -: 535: 430: 536: if (!imMask) { branch 0 taken 13% (fallthrough) branch 1 taken 87% 58: 537: ImagingSectionEnter(&cookie); call 0 returned 100% 58: 538: fill(imOut, ink, dx0, dy0, xsize, ysize, pixelsize); call 0 returned 100% 58: 539: ImagingSectionLeave(&cookie); call 0 returned 100% -: 540: 372: 541: } else if (strcmp(imMask->mode, "1") == 0) { branch 0 taken 31% (fallthrough) branch 1 taken 69% branch 2 taken 31% (fallthrough) branch 3 taken 69% 114: 542: ImagingSectionEnter(&cookie); call 0 returned 100% 114: 543: fill_mask_1(imOut, ink, imMask, dx0, dy0, sx0, sy0, call 0 returned 100% -: 544: xsize, ysize, pixelsize); 114: 545: ImagingSectionLeave(&cookie); call 0 returned 100% -: 546: 258: 547: } else if (strcmp(imMask->mode, "L") == 0) { branch 0 taken 95% (fallthrough) branch 1 taken 5% branch 2 taken 95% (fallthrough) branch 3 taken 5% 245: 548: ImagingSectionEnter(&cookie); call 0 returned 100% 245: 549: fill_mask_L(imOut, ink, imMask, dx0, dy0, sx0, sy0, call 0 returned 100% -: 550: xsize, ysize, pixelsize); 245: 551: ImagingSectionLeave(&cookie); call 0 returned 100% -: 552: 13: 553: } else if (strcmp(imMask->mode, "RGBA") == 0) { branch 0 taken 54% (fallthrough) branch 1 taken 46% 7: 554: ImagingSectionEnter(&cookie); call 0 returned 100% 7: 555: fill_mask_RGBA(imOut, ink, imMask, dx0, dy0, sx0, sy0, call 0 returned 100% -: 556: xsize, ysize, pixelsize); 7: 557: ImagingSectionLeave(&cookie); call 0 returned 100% -: 558: 6: 559: } else if (strcmp(imMask->mode, "RGBa") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 6: 560: ImagingSectionEnter(&cookie); call 0 returned 100% 6: 561: fill_mask_RGBa(imOut, ink, imMask, dx0, dy0, sx0, sy0, call 0 returned 100% -: 562: xsize, ysize, pixelsize); 6: 563: ImagingSectionLeave(&cookie); call 0 returned 100% -: 564: -: 565: } else { #####: 566: (void) ImagingError_ValueError("bad transparency mask"); call 0 never executed #####: 567: return -1; -: 568: } -: 569: -: 570: return 0; -: 571:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Geometry.c.gcov -: 0:Source:src/libImaging/Geometry.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Geometry.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Geometry.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:#include "Imaging.h" -: 2: -: 3:/* For large images rotation is an inefficient operation in terms of CPU cache. -: 4: One row in the source image affects each column in destination. -: 5: Rotating in chunks that fit in the cache can speed up rotation -: 6: 8x on a modern CPU. A chunk size of 128 requires only 65k and is large enough -: 7: that the overhead from the extra loops are not apparent. */ -: 8:#define ROTATE_CHUNK 512 -: 9:#define ROTATE_SMALL_CHUNK 8 -: 10: -: 11:#define COORD(v) ((v) < 0.0 ? -1 : ((int)(v))) -: 12:#define FLOOR(v) ((v) < 0.0 ? ((int)floor(v)) : ((int)(v))) -: 13: -: 14:/* -------------------------------------------------------------------- */ -: 15:/* Transpose operations */ -: 16: -: 17:Imaging function ImagingFlipLeftRight called 33 returned 100% blocks executed 94% 33: 18:ImagingFlipLeftRight(Imaging imOut, Imaging imIn) -: 19:{ -: 20: ImagingSectionCookie cookie; -: 21: int x, y, xr; -: 22: 33: 23: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 24: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 25: } 33: 26: if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 27: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 28: } -: 29: 33: 30: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 31: -: 32:#define FLIP_LEFT_RIGHT(INT, image) \ -: 33: for (y = 0; y < imIn->ysize; y++) { \ -: 34: INT* in = (INT *)imIn->image[y]; \ -: 35: INT* out = (INT *)imOut->image[y]; \ -: 36: xr = imIn->xsize-1; \ -: 37: for (x = 0; x < imIn->xsize; x++, xr--) { \ -: 38: out[xr] = in[x]; \ -: 39: } \ -: 40: } -: 41: 33: 42: ImagingSectionEnter(&cookie); call 0 returned 100% -: 43: 33: 44: if (imIn->image8) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 21: 45: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 29% (fallthrough) branch 1 taken 71% 1869: 46: FLIP_LEFT_RIGHT(UINT16, image8) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% -: 47: } else { 751: 48: FLIP_LEFT_RIGHT(UINT8, image8) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% -: 49: } -: 50: } else { 1463: 51: FLIP_LEFT_RIGHT(INT32, image32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) -: 52: } -: 53: 33: 54: ImagingSectionLeave(&cookie); call 0 returned 100% -: 55: -: 56:#undef FLIP_LEFT_RIGHT -: 57: 33: 58: return imOut; -: 59:} -: 60: -: 61: -: 62:Imaging function ImagingFlipTopBottom called 31 returned 100% blocks executed 87% 31: 63:ImagingFlipTopBottom(Imaging imOut, Imaging imIn) -: 64:{ -: 65: ImagingSectionCookie cookie; -: 66: int y, yr; -: 67: 31: 68: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 69: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 70: } 31: 71: if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 72: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 73: } -: 74: 31: 75: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 76: 31: 77: ImagingSectionEnter(&cookie); call 0 returned 100% -: 78: 31: 79: yr = imIn->ysize - 1; 3914: 80: for (y = 0; y < imIn->ysize; y++, yr--) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 7766: 81: memcpy(imOut->image[yr], imIn->image[y], imIn->linesize); -: 82: } -: 83: 31: 84: ImagingSectionLeave(&cookie); call 0 returned 100% -: 85: 31: 86: return imOut; -: 87:} -: 88: -: 89: -: 90:Imaging function ImagingRotate90 called 68 returned 100% blocks executed 97% 68: 91:ImagingRotate90(Imaging imOut, Imaging imIn) -: 92:{ -: 93: ImagingSectionCookie cookie; -: 94: int x, y, xx, yy, xr, xxsize, yysize; -: 95: int xxx, yyy, xxxsize, yyysize; -: 96: 68: 97: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 98: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 99: } 68: 100: if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 101: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 102: } -: 103: 68: 104: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 105: -: 106:#define ROTATE_90(INT, image) \ -: 107: for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ -: 108: for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ -: 109: yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ -: 110: xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ -: 111: for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ -: 112: for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ -: 113: yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ -: 114: xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ -: 115: for (yyy = yy; yyy < yyysize; yyy++) { \ -: 116: INT* in = (INT *)imIn->image[yyy]; \ -: 117: xr = imIn->xsize - 1 - xx; \ -: 118: for (xxx = xx; xxx < xxxsize; xxx++, xr--) { \ -: 119: INT* out = (INT *)imOut->image[xr]; \ -: 120: out[yyy] = in[xxx]; \ -: 121: } \ -: 122: } \ -: 123: } \ -: 124: } \ -: 125: } \ -: 126: } -: 127: 68: 128: ImagingSectionEnter(&cookie); call 0 returned 100% -: 129: 68: 130: if (imIn->image8) { branch 0 taken 18% (fallthrough) branch 1 taken 82% 56: 131: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 79% (fallthrough) branch 1 taken 21% 12: 132: ROTATE_90(UINT16, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 133: } else { 44: 134: ROTATE_90(UINT8, image8); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 98% branch 5 taken 2% (fallthrough) branch 6 taken 97% branch 7 taken 3% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 135: } -: 136: } else { 12: 137: ROTATE_90(INT32, image32); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 96% branch 5 taken 4% (fallthrough) branch 6 taken 96% branch 7 taken 4% branch 8 taken 52% branch 9 taken 48% (fallthrough) branch 10 taken 48% branch 11 taken 52% (fallthrough) -: 138: } -: 139: 68: 140: ImagingSectionLeave(&cookie); call 0 returned 100% -: 141: -: 142:#undef ROTATE_90 -: 143: 68: 144: return imOut; -: 145:} -: 146: -: 147: -: 148:Imaging function ImagingTranspose called 140 returned 100% blocks executed 97% 140: 149:ImagingTranspose(Imaging imOut, Imaging imIn) -: 150:{ -: 151: ImagingSectionCookie cookie; -: 152: int x, y, xx, yy, xxsize, yysize; -: 153: int xxx, yyy, xxxsize, yyysize; -: 154: 140: 155: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 156: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 157: } 140: 158: if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 159: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 160: } -: 161: 140: 162: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 163: -: 164:#define TRANSPOSE(INT, image) \ -: 165: for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ -: 166: for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ -: 167: yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ -: 168: xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ -: 169: for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ -: 170: for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ -: 171: yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ -: 172: xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ -: 173: for (yyy = yy; yyy < yyysize; yyy++) { \ -: 174: INT* in = (INT *)imIn->image[yyy]; \ -: 175: for (xxx = xx; xxx < xxxsize; xxx++) { \ -: 176: INT* out = (INT *)imOut->image[xxx]; \ -: 177: out[yyy] = in[xxx]; \ -: 178: } \ -: 179: } \ -: 180: } \ -: 181: } \ -: 182: } \ -: 183: } -: 184: 140: 185: ImagingSectionEnter(&cookie); call 0 returned 100% -: 186: 140: 187: if (imIn->image8) { branch 0 taken 60% (fallthrough) branch 1 taken 40% 56: 188: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 79% (fallthrough) branch 1 taken 21% 12: 189: TRANSPOSE(UINT16, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 190: } else { 44: 191: TRANSPOSE(UINT8, image8); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 87% branch 7 taken 13% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 192: } -: 193: } else { 84: 194: TRANSPOSE(INT32, image32); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 90% branch 7 taken 10% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% (fallthrough) -: 195: } -: 196: 140: 197: ImagingSectionLeave(&cookie); call 0 returned 100% -: 198: -: 199:#undef TRANSPOSE -: 200: 140: 201: return imOut; -: 202:} -: 203: -: 204: -: 205:Imaging function ImagingTransverse called 24 returned 100% blocks executed 97% 24: 206:ImagingTransverse(Imaging imOut, Imaging imIn) -: 207:{ -: 208: ImagingSectionCookie cookie; -: 209: int x, y, xr, yr, xx, yy, xxsize, yysize; -: 210: int xxx, yyy, xxxsize, yyysize; -: 211: 24: 212: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 213: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 214: } 24: 215: if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 216: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 217: } -: 218: 24: 219: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 220: -: 221:#define TRANSVERSE(INT, image) \ -: 222: for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ -: 223: for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ -: 224: yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ -: 225: xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ -: 226: for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ -: 227: for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ -: 228: yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ -: 229: xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ -: 230: yr = imIn->ysize - 1 - yy; \ -: 231: for (yyy = yy; yyy < yyysize; yyy++, yr--) { \ -: 232: INT* in = (INT *)imIn->image[yyy]; \ -: 233: xr = imIn->xsize - 1 - xx; \ -: 234: for (xxx = xx; xxx < xxxsize; xxx++, xr--) { \ -: 235: INT* out = (INT *)imOut->image[xr]; \ -: 236: out[yr] = in[xxx]; \ -: 237: } \ -: 238: } \ -: 239: } \ -: 240: } \ -: 241: } \ -: 242: } -: 243: 24: 244: ImagingSectionEnter(&cookie); call 0 returned 100% -: 245: 24: 246: if (imIn->image8) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 16: 247: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 12: 248: TRANSVERSE(UINT16, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 249: } else { 4: 250: TRANSVERSE(UINT8, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 251: } -: 252: } else { 8: 253: TRANSVERSE(INT32, image32); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% (fallthrough) -: 254: } -: 255: 24: 256: ImagingSectionLeave(&cookie); call 0 returned 100% -: 257: -: 258:#undef TRANSVERSE -: 259: 24: 260: return imOut; -: 261:} -: 262: -: 263: -: 264:Imaging function ImagingRotate180 called 58 returned 100% blocks executed 94% 58: 265:ImagingRotate180(Imaging imOut, Imaging imIn) -: 266:{ -: 267: ImagingSectionCookie cookie; -: 268: int x, y, xr, yr; -: 269: 58: 270: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 271: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 272: } 58: 273: if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 274: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 275: } -: 276: 58: 277: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 278: -: 279:#define ROTATE_180(INT, image) \ -: 280: for (y = 0; y < imIn->ysize; y++, yr--) { \ -: 281: INT* in = (INT *)imIn->image[y]; \ -: 282: INT* out = (INT *)imOut->image[yr]; \ -: 283: xr = imIn->xsize-1; \ -: 284: for (x = 0; x < imIn->xsize; x++, xr--) { \ -: 285: out[xr] = in[x]; \ -: 286: } \ -: 287: } -: 288: 58: 289: ImagingSectionEnter(&cookie); call 0 returned 100% -: 290: 58: 291: yr = imIn->ysize-1; 58: 292: if (imIn->image8) { branch 0 taken 24% (fallthrough) branch 1 taken 76% 44: 293: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 73% (fallthrough) branch 1 taken 27% 1524: 294: ROTATE_180(UINT16, image8) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% -: 295: } else { 4988: 296: ROTATE_180(UINT8, image8) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% -: 297: } -: 298: } else { 2156: 299: ROTATE_180(INT32, image32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) -: 300: } -: 301: 58: 302: ImagingSectionLeave(&cookie); call 0 returned 100% -: 303: -: 304:#undef ROTATE_180 -: 305: 58: 306: return imOut; -: 307:} -: 308: -: 309: -: 310:Imaging function ImagingRotate270 called 45 returned 100% blocks executed 97% 45: 311:ImagingRotate270(Imaging imOut, Imaging imIn) -: 312:{ -: 313: ImagingSectionCookie cookie; -: 314: int x, y, xx, yy, yr, xxsize, yysize; -: 315: int xxx, yyy, xxxsize, yyysize; -: 316: 45: 317: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 318: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 319: } 45: 320: if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 321: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 322: } -: 323: 45: 324: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 325: -: 326:#define ROTATE_270(INT, image) \ -: 327: for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ -: 328: for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ -: 329: yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ -: 330: xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ -: 331: for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ -: 332: for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ -: 333: yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ -: 334: xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ -: 335: yr = imIn->ysize - 1 - yy; \ -: 336: for (yyy = yy; yyy < yyysize; yyy++, yr--) { \ -: 337: INT* in = (INT *)imIn->image[yyy]; \ -: 338: for (xxx = xx; xxx < xxxsize; xxx++) { \ -: 339: INT* out = (INT *)imOut->image[xxx]; \ -: 340: out[yr] = in[xxx]; \ -: 341: } \ -: 342: } \ -: 343: } \ -: 344: } \ -: 345: } \ -: 346: } -: 347: 45: 348: ImagingSectionEnter(&cookie); call 0 returned 100% -: 349: 45: 350: if (imIn->image8) { branch 0 taken 29% (fallthrough) branch 1 taken 71% 32: 351: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 63% (fallthrough) branch 1 taken 38% 12: 352: ROTATE_270(UINT16, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 353: } else { 20: 354: ROTATE_270(UINT8, image8); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 95% branch 5 taken 5% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 355: } -: 356: } else { 13: 357: ROTATE_270(INT32, image32); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 96% branch 5 taken 4% (fallthrough) branch 6 taken 95% branch 7 taken 5% branch 8 taken 52% branch 9 taken 48% (fallthrough) branch 10 taken 48% branch 11 taken 52% (fallthrough) -: 358: } -: 359: 45: 360: ImagingSectionLeave(&cookie); call 0 returned 100% -: 361: -: 362:#undef ROTATE_270 -: 363: 45: 364: return imOut; -: 365:} -: 366: -: 367: -: 368:/* -------------------------------------------------------------------- */ -: 369:/* Transforms */ -: 370: -: 371:/* transform primitives (ImagingTransformMap) */ -: 372: -: 373:static int function affine_transform called 879938 returned 100% blocks executed 100% 879938: 374:affine_transform(double* xout, double* yout, int x, int y, void* data) -: 375:{ -: 376: /* full moon tonight. your compiler will generate bogus code -: 377: for simple expressions, unless you reorganize the code, or -: 378: install Service Pack 3 */ -: 379: 879938: 380: double* a = (double*) data; 879938: 381: double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; 879938: 382: double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; -: 383: 879938: 384: double xin = x + 0.5; 879938: 385: double yin = y + 0.5; -: 386: 879938: 387: xout[0] = a0*xin + a1*yin + a2; 879938: 388: yout[0] = a3*xin + a4*yin + a5; -: 389: 879938: 390: return 1; -: 391:} -: 392: -: 393:static int function perspective_transform called 1006161 returned 100% blocks executed 100% 1006161: 394:perspective_transform(double* xout, double* yout, int x, int y, void* data) -: 395:{ 1006161: 396: double* a = (double*) data; 1006161: 397: double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; 1006161: 398: double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; 1006161: 399: double a6 = a[6]; double a7 = a[7]; -: 400: 1006161: 401: double xin = x + 0.5; 1006161: 402: double yin = y + 0.5; -: 403: 1006161: 404: xout[0] = (a0*xin + a1*yin + a2) / (a6*xin + a7*yin + 1); 1006161: 405: yout[0] = (a3*xin + a4*yin + a5) / (a6*xin + a7*yin + 1); -: 406: 1006161: 407: return 1; -: 408:} -: 409: -: 410:static int function quad_transform called 75540 returned 100% blocks executed 100% 75540: 411:quad_transform(double* xout, double* yout, int x, int y, void* data) -: 412:{ -: 413: /* quad warp: map quadrilateral to rectangle */ -: 414: 75540: 415: double* a = (double*) data; 75540: 416: double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3]; 75540: 417: double a4 = a[4]; double a5 = a[5]; double a6 = a[6]; double a7 = a[7]; -: 418: 75540: 419: double xin = x + 0.5; 75540: 420: double yin = y + 0.5; -: 421: 75540: 422: xout[0] = a0 + a1*xin + a2*yin + a3*xin*yin; 75540: 423: yout[0] = a4 + a5*xin + a6*yin + a7*xin*yin; -: 424: 75540: 425: return 1; -: 426:} -: 427: -: 428:/* transform filters (ImagingTransformFilter) */ -: 429: -: 430:static int function nearest_filter8 called 10004 returned 100% blocks executed 100% 10004: 431:nearest_filter8(void* out, Imaging im, double xin, double yin) -: 432:{ 10004: 433: int x = COORD(xin); branch 0 taken 100% (fallthrough) branch 1 taken 0% 10004: 434: int y = COORD(yin); branch 0 taken 100% (fallthrough) branch 1 taken 0% 10004: 435: if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 436: return 0; -: 437: } 10004: 438: ((UINT8*)out)[0] = im->image8[y][x]; 10004: 439: return 1; -: 440:} -: 441: -: 442:static int function nearest_filter16 called 3252 returned 100% blocks executed 100% 3252: 443:nearest_filter16(void* out, Imaging im, double xin, double yin) -: 444:{ 3252: 445: int x = COORD(xin); branch 0 taken 100% (fallthrough) branch 1 taken 0% 3252: 446: int y = COORD(yin); branch 0 taken 100% (fallthrough) branch 1 taken 0% 3252: 447: if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 448: return 0; -: 449: } 6504: 450: memcpy(out, im->image8[y] + x * sizeof(INT16), sizeof(INT16)); 3252: 451: return 1; -: 452:} -: 453: -: 454:static int function nearest_filter32 called 335387 returned 100% blocks executed 100% 335387: 455:nearest_filter32(void* out, Imaging im, double xin, double yin) -: 456:{ 335387: 457: int x = COORD(xin); branch 0 taken 98% (fallthrough) branch 1 taken 2% 335387: 458: int y = COORD(yin); branch 0 taken 98% (fallthrough) branch 1 taken 2% 335387: 459: if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { branch 0 taken 98% (fallthrough) branch 1 taken 2% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 98% (fallthrough) branch 5 taken 2% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 460: return 0; -: 461: } 645998: 462: memcpy(out, &im->image32[y][x], sizeof(INT32)); 322999: 463: return 1; -: 464:} -: 465: -: 466:#define XCLIP(im, x) ( ((x) < 0) ? 0 : ((x) < im->xsize) ? (x) : im->xsize-1 ) -: 467:#define YCLIP(im, y) ( ((y) < 0) ? 0 : ((y) < im->ysize) ? (y) : im->ysize-1 ) -: 468: -: 469:#define BILINEAR(v, a, b, d)\ -: 470: (v = (a) + ( (b) - (a) ) * (d)) -: 471: -: 472:#define BILINEAR_HEAD(type)\ -: 473: int x, y;\ -: 474: int x0, x1;\ -: 475: double v1, v2;\ -: 476: double dx, dy;\ -: 477: type* in;\ -: 478: if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize) {\ -: 479: return 0;\ -: 480: }\ -: 481: xin -= 0.5;\ -: 482: yin -= 0.5;\ -: 483: x = FLOOR(xin);\ -: 484: y = FLOOR(yin);\ -: 485: dx = xin - x;\ -: 486: dy = yin - y; -: 487: -: 488:#define BILINEAR_BODY(type, image, step, offset) {\ -: 489: in = (type*) ((image)[YCLIP(im, y)] + offset);\ -: 490: x0 = XCLIP(im, x+0)*step;\ -: 491: x1 = XCLIP(im, x+1)*step;\ -: 492: BILINEAR(v1, in[x0], in[x1], dx);\ -: 493: if (y+1 >= 0 && y+1 < im->ysize) {\ -: 494: in = (type*) ((image)[y+1] + offset);\ -: 495: BILINEAR(v2, in[x0], in[x1], dx);\ -: 496: } else {\ -: 497: v2 = v1;\ -: 498: }\ -: 499: BILINEAR(v1, v1, v2, dy);\ -: 500:} -: 501: -: 502:static int function bilinear_filter8 called 16384 returned 100% blocks executed 88% 16384: 503:bilinear_filter8(void* out, Imaging im, double xin, double yin) -: 504:{ 16384: 505: BILINEAR_HEAD(UINT8); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 0% (fallthrough) branch 9 taken 100% branch 10 taken 3% (fallthrough) branch 11 taken 97% 16384: 506: BILINEAR_BODY(UINT8, im->image8, 1, 0); branch 0 taken 97% (fallthrough) branch 1 taken 3% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 3% (fallthrough) branch 11 taken 97% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 100% (fallthrough) branch 15 taken 0% 16384: 507: ((UINT8*)out)[0] = (UINT8) v1; 16384: 508: return 1; -: 509:} -: 510: -: 511:static int function bilinear_filter32I called 0 returned 0% blocks executed 0% #####: 512:bilinear_filter32I(void* out, Imaging im, double xin, double yin) -: 513:{ -: 514: INT32 k; #####: 515: BILINEAR_HEAD(INT32); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 516: BILINEAR_BODY(INT32, im->image32, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed #####: 517: k = v1; #####: 518: memcpy(out, &k, sizeof(k)); #####: 519: return 1; -: 520:} -: 521: -: 522:static int function bilinear_filter32F called 0 returned 0% blocks executed 0% #####: 523:bilinear_filter32F(void* out, Imaging im, double xin, double yin) -: 524:{ -: 525: FLOAT32 k; #####: 526: BILINEAR_HEAD(FLOAT32); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 527: BILINEAR_BODY(FLOAT32, im->image32, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed #####: 528: k = v1; #####: 529: memcpy(out, &k, sizeof(k)); #####: 530: return 1; -: 531:} -: 532: -: 533:static int function bilinear_filter32LA called 16384 returned 100% blocks executed 81% 16384: 534:bilinear_filter32LA(void* out, Imaging im, double xin, double yin) -: 535:{ 16384: 536: BILINEAR_HEAD(UINT8); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 50% (fallthrough) branch 3 taken 50% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 50% (fallthrough) branch 7 taken 50% branch 8 taken 0% (fallthrough) branch 9 taken 100% branch 10 taken 0% (fallthrough) branch 11 taken 100% 4096: 537: BILINEAR_BODY(UINT8, im->image, 4, 0); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 100% (fallthrough) branch 11 taken 0% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 100% (fallthrough) branch 15 taken 0% 4096: 538: ((UINT8*)out)[0] = (UINT8) v1; 4096: 539: ((UINT8*)out)[1] = (UINT8) v1; 4096: 540: ((UINT8*)out)[2] = (UINT8) v1; 4096: 541: BILINEAR_BODY(UINT8, im->image, 4, 3); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 100% (fallthrough) branch 11 taken 0% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 100% (fallthrough) branch 15 taken 0% 4096: 542: ((UINT8*)out)[3] = (UINT8) v1; 4096: 543: return 1; -: 544:} -: 545: -: 546:static int function bilinear_filter32RGB called 827178 returned 100% blocks executed 93% 827178: 547:bilinear_filter32RGB(void* out, Imaging im, double xin, double yin) -: 548:{ -: 549: int b; 827178: 550: BILINEAR_HEAD(UINT8); branch 0 taken 98% (fallthrough) branch 1 taken 2% branch 2 taken 97% (fallthrough) branch 3 taken 3% branch 4 taken 98% (fallthrough) branch 5 taken 2% branch 6 taken 98% (fallthrough) branch 7 taken 2% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) branch 11 taken 99% 3073400: 551: for (b = 0; b < im->bands; b++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 2312318: 552: BILINEAR_BODY(UINT8, im->image, 4, b); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 99% (fallthrough) branch 5 taken 1% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 99% (fallthrough) branch 11 taken 1% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 99% (fallthrough) branch 15 taken 1% 2312318: 553: ((UINT8*)out)[b] = (UINT8) v1; -: 554: } -: 555: return 1; -: 556:} -: 557: -: 558:#undef BILINEAR -: 559:#undef BILINEAR_HEAD -: 560:#undef BILINEAR_BODY -: 561: -: 562:#define BICUBIC(v, v1, v2, v3, v4, d) {\ -: 563: double p1 = v2;\ -: 564: double p2 = -v1 + v3;\ -: 565: double p3 = 2*(v1 - v2) + v3 - v4;\ -: 566: double p4 = -v1 + v2 - v3 + v4;\ -: 567: v = p1 + (d)*(p2 + (d)*(p3 + (d)*p4));\ -: 568:} -: 569: -: 570:#define BICUBIC_HEAD(type)\ -: 571: int x = FLOOR(xin);\ -: 572: int y = FLOOR(yin);\ -: 573: int x0, x1, x2, x3;\ -: 574: double v1, v2, v3, v4;\ -: 575: double dx, dy;\ -: 576: type* in;\ -: 577: if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize) {\ -: 578: return 0;\ -: 579: }\ -: 580: xin -= 0.5;\ -: 581: yin -= 0.5;\ -: 582: x = FLOOR(xin);\ -: 583: y = FLOOR(yin);\ -: 584: dx = xin - x;\ -: 585: dy = yin - y;\ -: 586: x--; y--; -: 587: -: 588:#define BICUBIC_BODY(type, image, step, offset) {\ -: 589: in = (type*) ((image)[YCLIP(im, y)] + offset);\ -: 590: x0 = XCLIP(im, x+0)*step;\ -: 591: x1 = XCLIP(im, x+1)*step;\ -: 592: x2 = XCLIP(im, x+2)*step;\ -: 593: x3 = XCLIP(im, x+3)*step;\ -: 594: BICUBIC(v1, in[x0], in[x1], in[x2], in[x3], dx);\ -: 595: if (y+1 >= 0 && y+1 < im->ysize) {\ -: 596: in = (type*) ((image)[y+1] + offset);\ -: 597: BICUBIC(v2, in[x0], in[x1], in[x2], in[x3], dx);\ -: 598: } else {\ -: 599: v2 = v1;\ -: 600: }\ -: 601: if (y+2 >= 0 && y+2 < im->ysize) {\ -: 602: in = (type*) ((image)[y+2] + offset);\ -: 603: BICUBIC(v3, in[x0], in[x1], in[x2], in[x3], dx);\ -: 604: } else {\ -: 605: v3 = v2;\ -: 606: }\ -: 607: if (y+3 >= 0 && y+3 < im->ysize) {\ -: 608: in = (type*) ((image)[y+3] + offset);\ -: 609: BICUBIC(v4, in[x0], in[x1], in[x2], in[x3], dx);\ -: 610: } else {\ -: 611: v4 = v3;\ -: 612: }\ -: 613: BICUBIC(v1, v1, v2, v3, v4, dy);\ -: 614:} -: 615: -: 616: -: 617:static int function bicubic_filter8 called 0 returned 0% blocks executed 0% #####: 618:bicubic_filter8(void* out, Imaging im, double xin, double yin) -: 619:{ #####: 620: BICUBIC_HEAD(UINT8); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 621: BICUBIC_BODY(UINT8, im->image8, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 622: if (v1 <= 0.0) { branch 0 never executed branch 1 never executed #####: 623: ((UINT8*)out)[0] = 0; #####: 624: } else if (v1 >= 255.0) { branch 0 never executed branch 1 never executed #####: 625: ((UINT8*)out)[0] = 255; -: 626: } else { #####: 627: ((UINT8*)out)[0] = (UINT8) v1; -: 628: } -: 629: return 1; -: 630:} -: 631: -: 632:static int function bicubic_filter32I called 0 returned 0% blocks executed 0% #####: 633:bicubic_filter32I(void* out, Imaging im, double xin, double yin) -: 634:{ -: 635: INT32 k; #####: 636: BICUBIC_HEAD(INT32); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 637: BICUBIC_BODY(INT32, im->image32, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 638: k = v1; #####: 639: memcpy(out, &k, sizeof(k)); #####: 640: return 1; -: 641:} -: 642: -: 643:static int function bicubic_filter32F called 0 returned 0% blocks executed 0% #####: 644:bicubic_filter32F(void* out, Imaging im, double xin, double yin) -: 645:{ -: 646: FLOAT32 k; #####: 647: BICUBIC_HEAD(FLOAT32); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 648: BICUBIC_BODY(FLOAT32, im->image32, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 649: k = v1; #####: 650: memcpy(out, &k, sizeof(k)); #####: 651: return 1; -: 652:} -: 653: -: 654:static int function bicubic_filter32LA called 0 returned 0% blocks executed 0% #####: 655:bicubic_filter32LA(void* out, Imaging im, double xin, double yin) -: 656:{ #####: 657: BICUBIC_HEAD(UINT8); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 658: BICUBIC_BODY(UINT8, im->image, 4, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 659: if (v1 <= 0.0) { branch 0 never executed branch 1 never executed #####: 660: ((UINT8*)out)[0] = 0; #####: 661: ((UINT8*)out)[1] = 0; #####: 662: ((UINT8*)out)[2] = 0; #####: 663: } else if (v1 >= 255.0) { branch 0 never executed branch 1 never executed #####: 664: ((UINT8*)out)[0] = 255; #####: 665: ((UINT8*)out)[1] = 255; #####: 666: ((UINT8*)out)[2] = 255; -: 667: } else { #####: 668: ((UINT8*)out)[0] = (UINT8) v1; #####: 669: ((UINT8*)out)[1] = (UINT8) v1; #####: 670: ((UINT8*)out)[2] = (UINT8) v1; -: 671: } #####: 672: BICUBIC_BODY(UINT8, im->image, 4, 3); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 673: if (v1 <= 0.0) { branch 0 never executed branch 1 never executed #####: 674: ((UINT8*)out)[3] = 0; #####: 675: } else if (v1 >= 255.0) { branch 0 never executed branch 1 never executed #####: 676: ((UINT8*)out)[3] = 255; -: 677: } else { #####: 678: ((UINT8*)out)[3] = (UINT8) v1; -: 679: } -: 680: return 1; -: 681:} -: 682: -: 683:static int function bicubic_filter32RGB called 753050 returned 100% blocks executed 94% 753050: 684:bicubic_filter32RGB(void* out, Imaging im, double xin, double yin) -: 685:{ -: 686: int b; 753050: 687: BICUBIC_HEAD(UINT8); branch 0 taken 96% (fallthrough) branch 1 taken 4% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 98% (fallthrough) branch 5 taken 2% branch 6 taken 99% (fallthrough) branch 7 taken 1% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) branch 11 taken 99% 2766012: 688: for (b = 0; b < im->bands; b++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 2074509: 689: BICUBIC_BODY(UINT8, im->image, 4, b); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 99% (fallthrough) branch 5 taken 1% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 99% (fallthrough) branch 9 taken 1% branch 10 taken 100% (fallthrough) branch 11 taken 0% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 99% (fallthrough) branch 15 taken 1% branch 16 taken 100% (fallthrough) branch 17 taken 0% branch 18 taken 99% (fallthrough) branch 19 taken 1% branch 20 taken 99% (fallthrough) branch 21 taken 1% branch 22 taken 100% (fallthrough) branch 23 taken 0% branch 24 taken 100% (fallthrough) branch 25 taken 0% branch 26 taken 99% (fallthrough) branch 27 taken 1% branch 28 taken 100% (fallthrough) branch 29 taken 0% branch 30 taken 98% (fallthrough) branch 31 taken 2% 2074509: 690: if (v1 <= 0.0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 9946: 691: ((UINT8*)out)[b] = 0; 2064563: 692: } else if (v1 >= 255.0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 15110: 693: ((UINT8*)out)[b] = 255; -: 694: } else { 2049453: 695: ((UINT8*)out)[b] = (UINT8) v1; -: 696: } -: 697: } -: 698: return 1; -: 699:} -: 700: -: 701:#undef BICUBIC -: 702:#undef BICUBIC_HEAD -: 703:#undef BICUBIC_BODY -: 704: -: 705:static ImagingTransformFilter function getfilter called 126 returned 100% blocks executed 80% 126: 706:getfilter(Imaging im, int filterid) -: 707:{ 126: 708: switch (filterid) { branch 0 taken 21% branch 1 taken 44% branch 2 taken 35% branch 3 taken 0% -: 709: case IMAGING_TRANSFORM_NEAREST: 26: 710: if (im->image8) { branch 0 taken 23% (fallthrough) branch 1 taken 77% 6: 711: switch (im->type) { branch 0 taken 67% branch 1 taken 0% branch 2 taken 33% -: 712: case IMAGING_TYPE_UINT8: -: 713: return nearest_filter8; -: 714: case IMAGING_TYPE_SPECIAL: 4: 715: switch (im->pixelsize) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% -: 716: case 1: -: 717: return nearest_filter8; -: 718: case 2: 4: 719: return nearest_filter16; -: 720: case 4: #####: 721: return nearest_filter32; -: 722: } -: 723: } -: 724: } else { -: 725: return nearest_filter32; -: 726: } -: 727: break; -: 728: case IMAGING_TRANSFORM_BILINEAR: 56: 729: if (im->image8) { branch 0 taken 98% (fallthrough) branch 1 taken 2% -: 730: return bilinear_filter8; 55: 731: } else if (im->image32) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 55: 732: switch (im->type) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% -: 733: case IMAGING_TYPE_UINT8: 55: 734: if (im->bands == 2) { branch 0 taken 98% (fallthrough) branch 1 taken 2% -: 735: return bilinear_filter32LA; -: 736: } else { 54: 737: return bilinear_filter32RGB; -: 738: } -: 739: case IMAGING_TYPE_INT32: -: 740: return bilinear_filter32I; -: 741: case IMAGING_TYPE_FLOAT32: #####: 742: return bilinear_filter32F; -: 743: } -: 744: } -: 745: break; -: 746: case IMAGING_TRANSFORM_BICUBIC: 44: 747: if (im->image8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 748: return bicubic_filter8; 44: 749: } else if (im->image32) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 44: 750: switch (im->type) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% -: 751: case IMAGING_TYPE_UINT8: 44: 752: if (im->bands == 2) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 753: return bicubic_filter32LA; -: 754: } else { 44: 755: return bicubic_filter32RGB; -: 756: } -: 757: case IMAGING_TYPE_INT32: -: 758: return bicubic_filter32I; -: 759: case IMAGING_TYPE_FLOAT32: #####: 760: return bicubic_filter32F; -: 761: } -: 762: } -: 763: break; -: 764: } -: 765: /* no such filter */ #####: 766: return NULL; -: 767:} -: 768: -: 769:/* transformation engines */ -: 770: -: 771:Imaging function ImagingGenericTransform called 126 returned 100% blocks executed 81% 126: 772:ImagingGenericTransform( -: 773: Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, -: 774: ImagingTransformMap transform, void* transform_data, -: 775: int filterid, int fill) -: 776:{ -: 777: /* slow generic transformation. use ImagingTransformAffine or -: 778: ImagingScaleAffine where possible. */ -: 779: -: 780: ImagingSectionCookie cookie; -: 781: int x, y; -: 782: char *out; -: 783: double xx, yy; -: 784: 126: 785: ImagingTransformFilter filter = getfilter(imIn, filterid); call 0 returned 100% 126: 786: if (!filter) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 787: return (Imaging) ImagingError_ValueError("bad filter number"); call 0 never executed -: 788: } -: 789: 126: 790: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 791: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 792: } -: 793: 126: 794: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 795: 126: 796: ImagingSectionEnter(&cookie); call 0 returned 100% -: 797: 126: 798: if (x0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 799: x0 = 0; -: 800: } 126: 801: if (y0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 802: y0 = 0; -: 803: } 126: 804: if (x1 > imOut->xsize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 805: x1 = imOut->xsize; -: 806: } 126: 807: if (y1 > imOut->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 808: y1 = imOut->ysize; -: 809: } -: 810: 13687: 811: for (y = y0; y < y1; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 13561: 812: out = imOut->image[y] + x0*imOut->pixelsize; 1975200: 813: for (x = x0; x < x1; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3923278: 814: if ( ! transform(&xx, &yy, x-x0, y-y0, transform_data) || call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 8% (fallthrough) branch 4 taken 92% 1961639: 815: ! filter(out, imIn, xx, yy)) { call 0 returned 100% 152319: 816: if (fill) { branch 0 taken 76% (fallthrough) branch 1 taken 24% 115455: 817: memset(out, 0, imOut->pixelsize); -: 818: } -: 819: } 1961639: 820: out += imOut->pixelsize; -: 821: } -: 822: } -: 823: 126: 824: ImagingSectionLeave(&cookie); call 0 returned 100% -: 825: 126: 826: return imOut; -: 827:} -: 828: -: 829:static Imaging function ImagingScaleAffine called 136 returned 100% blocks executed 88% 136: 830:ImagingScaleAffine(Imaging imOut, Imaging imIn, -: 831: int x0, int y0, int x1, int y1, -: 832: double a[6], int fill) -: 833:{ -: 834: /* scale, nearest neighbour resampling */ -: 835: -: 836: ImagingSectionCookie cookie; -: 837: int x, y; -: 838: int xin; -: 839: double xo, yo; -: 840: int xmin, xmax; -: 841: int *xintab; -: 842: 136: 843: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 844: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 845: } -: 846: 136: 847: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 848: 136: 849: if (x0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 850: x0 = 0; -: 851: } 136: 852: if (y0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 853: y0 = 0; -: 854: } 136: 855: if (x1 > imOut->xsize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 856: x1 = imOut->xsize; -: 857: } 136: 858: if (y1 > imOut->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 859: y1 = imOut->ysize; -: 860: } -: 861: -: 862: /* malloc check ok, uses calloc for overflow */ 136: 863: xintab = (int*) calloc(imOut->xsize, sizeof(int)); 136: 864: if (!xintab) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 865: ImagingDelete(imOut); call 0 never executed #####: 866: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 867: } -: 868: 136: 869: xo = a[2] + a[0] * 0.5; 136: 870: yo = a[5] + a[4] * 0.5; -: 871: 136: 872: xmin = x1; 136: 873: xmax = x0; -: 874: -: 875: /* Pretabulate horizontal pixel positions */ 25725: 876: for (x = x0; x < x1; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 25589: 877: xin = COORD(xo); branch 0 taken 99% (fallthrough) branch 1 taken 1% 25589: 878: if (xin >= 0 && xin < (int) imIn->xsize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 97% (fallthrough) branch 3 taken 3% 24558: 879: xmax = x+1; 24558: 880: if (x < xmin) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 132: 881: xmin = x; -: 882: } 24558: 883: xintab[x] = xin; -: 884: } 25589: 885: xo += a[0]; -: 886: } -: 887: -: 888:#define AFFINE_SCALE(pixel, image)\ -: 889: for (y = y0; y < y1; y++) {\ -: 890: int yi = COORD(yo);\ -: 891: pixel *in, *out;\ -: 892: out = imOut->image[y];\ -: 893: if (fill && x1 > x0) {\ -: 894: memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ -: 895: }\ -: 896: if (yi >= 0 && yi < imIn->ysize) {\ -: 897: in = imIn->image[yi];\ -: 898: for (x = xmin; x < xmax; x++) {\ -: 899: out[x] = in[xintab[x]];\ -: 900: }\ -: 901: }\ -: 902: yo += a[4];\ -: 903: } -: 904: 136: 905: ImagingSectionEnter(&cookie); call 0 returned 100% -: 906: 136: 907: if (imIn->image8) { branch 0 taken 66% (fallthrough) branch 1 taken 34% 39522: 908: AFFINE_SCALE(UINT8, image8); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 99% branch 11 taken 1% (fallthrough) branch 12 taken 99% branch 13 taken 1% -: 909: } else { 10986: 910: AFFINE_SCALE(INT32, image32); branch 0 taken 94% (fallthrough) branch 1 taken 6% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 94% (fallthrough) branch 7 taken 6% branch 8 taken 86% (fallthrough) branch 9 taken 14% branch 10 taken 99% branch 11 taken 1% (fallthrough) branch 12 taken 98% branch 13 taken 2% (fallthrough) -: 911: } -: 912: 136: 913: ImagingSectionLeave(&cookie); call 0 returned 100% -: 914: -: 915:#undef AFFINE_SCALE -: 916: 136: 917: free(xintab); -: 918: 136: 919: return imOut; -: 920:} -: 921: -: 922:static inline int -: 923:check_fixed(double a[6], int x, int y) -: 924:{ 976: 925: return (fabs(x*a[0] + y*a[1] + a[2]) < 32768.0 && branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 0% (fallthrough) branch 11 taken 100% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 0% (fallthrough) branch 15 taken 100% 488: 926: fabs(x*a[3] + y*a[4] + a[5]) < 32768.0); -: 927:} -: 928: -: 929:static inline Imaging function affine_fixed.isra.0 called 122 returned 100% blocks executed 96% 122: 930:affine_fixed(Imaging imOut, Imaging imIn, -: 931: int x0, int y0, int x1, int y1, -: 932: double a[6], int filterid, int fill) -: 933:{ -: 934: /* affine transform, nearest neighbour resampling, fixed point -: 935: arithmetics */ -: 936: -: 937: ImagingSectionCookie cookie; -: 938: int x, y; -: 939: int xin, yin; -: 940: int xsize, ysize; -: 941: int xx, yy; -: 942: int a0, a1, a2, a3, a4, a5; -: 943: 122: 944: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 945: 122: 946: xsize = (int) imIn->xsize; 122: 947: ysize = (int) imIn->ysize; -: 948: -: 949:/* use 16.16 fixed point arithmetics */ -: 950:#define FIX(v) FLOOR((v)*65536.0 + 0.5) -: 951: 122: 952: a0 = FIX(a[0]); a1 = FIX(a[1]); branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 95% (fallthrough) branch 3 taken 5% 122: 953: a3 = FIX(a[3]); a4 = FIX(a[4]); branch 0 taken 4% (fallthrough) branch 1 taken 96% branch 2 taken 0% (fallthrough) branch 3 taken 100% 122: 954: a2 = FIX(a[2] + a[0] * 0.5 + a[1] * 0.5); branch 0 taken 4% (fallthrough) branch 1 taken 96% 122: 955: a5 = FIX(a[5] + a[3] * 0.5 + a[4] * 0.5); branch 0 taken 22% (fallthrough) branch 1 taken 78% -: 956: -: 957:#undef FIX -: 958: -: 959:#define AFFINE_TRANSFORM_FIXED(pixel, image)\ -: 960: for (y = y0; y < y1; y++) {\ -: 961: pixel *out;\ -: 962: xx = a2;\ -: 963: yy = a5;\ -: 964: out = imOut->image[y];\ -: 965: if (fill && x1 > x0) {\ -: 966: memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ -: 967: }\ -: 968: for (x = x0; x < x1; x++, out++) {\ -: 969: xin = xx >> 16;\ -: 970: if (xin >= 0 && xin < xsize) {\ -: 971: yin = yy >> 16;\ -: 972: if (yin >= 0 && yin < ysize) {\ -: 973: *out = imIn->image[yin][xin];\ -: 974: }\ -: 975: }\ -: 976: xx += a0;\ -: 977: yy += a3;\ -: 978: }\ -: 979: a2 += a1;\ -: 980: a5 += a4;\ -: 981: } -: 982: 122: 983: ImagingSectionEnter(&cookie); call 0 returned 100% -: 984: 122: 985: if (imIn->image8) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 5288026: 986: AFFINE_TRANSFORM_FIXED(UINT8, image8) branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 99% (fallthrough) branch 5 taken 1% branch 6 taken 99% (fallthrough) branch 7 taken 1% branch 8 taken 99% (fallthrough) branch 9 taken 1% branch 10 taken 99% (fallthrough) branch 11 taken 1% branch 12 taken 99% branch 13 taken 1% (fallthrough) branch 14 taken 99% branch 15 taken 1% -: 987: } else { 1070102: 988: AFFINE_TRANSFORM_FIXED(INT32, image32) branch 0 taken 97% (fallthrough) branch 1 taken 3% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 87% (fallthrough) branch 5 taken 13% branch 6 taken 96% (fallthrough) branch 7 taken 4% branch 8 taken 86% (fallthrough) branch 9 taken 14% branch 10 taken 87% (fallthrough) branch 11 taken 13% branch 12 taken 99% branch 13 taken 1% (fallthrough) branch 14 taken 99% branch 15 taken 1% (fallthrough) -: 989: } -: 990: 122: 991: ImagingSectionLeave(&cookie); call 0 returned 100% -: 992: -: 993:#undef AFFINE_TRANSFORM_FIXED -: 994: 122: 995: return imOut; -: 996:} -: 997: -: 998:Imaging function ImagingTransformAffine called 315 returned 100% blocks executed 35% 315: 999:ImagingTransformAffine(Imaging imOut, Imaging imIn, -: 1000: int x0, int y0, int x1, int y1, -: 1001: double a[6], int filterid, int fill) -: 1002:{ -: 1003: /* affine transform, nearest neighbour resampling, floating point -: 1004: arithmetics*/ -: 1005: -: 1006: ImagingSectionCookie cookie; -: 1007: int x, y; -: 1008: int xin, yin; -: 1009: int xsize, ysize; -: 1010: double xx, yy; -: 1011: double xo, yo; -: 1012: 315: 1013: if (filterid || imIn->type == IMAGING_TYPE_SPECIAL) { branch 0 taken 83% (fallthrough) branch 1 taken 17% branch 2 taken 2% (fallthrough) branch 3 taken 98% 57: 1014: return ImagingGenericTransform( call 0 returned 100% -: 1015: imOut, imIn, -: 1016: x0, y0, x1, y1, -: 1017: affine_transform, a, -: 1018: filterid, fill); -: 1019: } -: 1020: 258: 1021: if (a[1] == 0 && a[3] == 0) { branch 0 taken 53% (fallthrough) branch 1 taken 47% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 1022: /* Scaling */ 136: 1023: return ImagingScaleAffine(imOut, imIn, x0, y0, x1, y1, a, fill); call 0 returned 100% -: 1024: } -: 1025: 122: 1026: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 1027: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 1028: } -: 1029: 122: 1030: if (x0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1031: x0 = 0; -: 1032: } 122: 1033: if (y0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1034: y0 = 0; -: 1035: } 122: 1036: if (x1 > imOut->xsize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1037: x1 = imOut->xsize; -: 1038: } 122: 1039: if (y1 > imOut->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1040: y1 = imOut->ysize; -: 1041: } -: 1042: -: 1043: /* translate all four corners to check if they are within the -: 1044: range that can be represented by the fixed point arithmetics */ -: 1045: 366: 1046: if (check_fixed(a, 0, 0) && check_fixed(a, x1-x0, y1-y0) && branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% 488: 1047: check_fixed(a, 0, y1-y0) && check_fixed(a, x1-x0, 0)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 122: 1048: return affine_fixed(imOut, imIn, x0, y0, x1, y1, a, filterid, fill); call 0 returned 100% -: 1049: } -: 1050: -: 1051: /* FIXME: cannot really think of any reasonable case when the -: 1052: following code is used. maybe we should fall back on the slow -: 1053: generic transform engine in this case? */ -: 1054: #####: 1055: ImagingCopyPalette(imOut, imIn); call 0 never executed -: 1056: #####: 1057: xsize = (int) imIn->xsize; #####: 1058: ysize = (int) imIn->ysize; -: 1059: #####: 1060: xo = a[2] + a[1] * 0.5 + a[0] * 0.5; #####: 1061: yo = a[5] + a[4] * 0.5 + a[3] * 0.5; -: 1062: -: 1063:#define AFFINE_TRANSFORM(pixel, image)\ -: 1064: for (y = y0; y < y1; y++) {\ -: 1065: pixel *out;\ -: 1066: xx = xo;\ -: 1067: yy = yo;\ -: 1068: out = imOut->image[y];\ -: 1069: if (fill && x1 > x0) {\ -: 1070: memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ -: 1071: }\ -: 1072: for (x = x0; x < x1; x++, out++) {\ -: 1073: xin = COORD(xx);\ -: 1074: if (xin >= 0 && xin < xsize) {\ -: 1075: yin = COORD(yy);\ -: 1076: if (yin >= 0 && yin < ysize) {\ -: 1077: *out = imIn->image[yin][xin];\ -: 1078: }\ -: 1079: }\ -: 1080: xx += a[0];\ -: 1081: yy += a[3];\ -: 1082: }\ -: 1083: xo += a[1];\ -: 1084: yo += a[4];\ -: 1085: } -: 1086: #####: 1087: ImagingSectionEnter(&cookie); call 0 never executed -: 1088: #####: 1089: if (imIn->image8) { branch 0 never executed branch 1 never executed #####: 1090: AFFINE_TRANSFORM(UINT8, image8) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed -: 1091: } else { #####: 1092: AFFINE_TRANSFORM(INT32, image32) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed -: 1093: } -: 1094: #####: 1095: ImagingSectionLeave(&cookie); call 0 never executed -: 1096: -: 1097:#undef AFFINE_TRANSFORM -: 1098: #####: 1099: return imOut; -: 1100:} -: 1101: -: 1102:Imaging function ImagingTransform called 384 returned 100% blocks executed 83% 384: 1103:ImagingTransform(Imaging imOut, Imaging imIn, int method, -: 1104: int x0, int y0, int x1, int y1, -: 1105: double a[8], int filterid, int fill) -: 1106:{ -: 1107: ImagingTransformMap transform; -: 1108: 384: 1109: switch(method) { branch 0 taken 82% branch 1 taken 2% branch 2 taken 0% branch 3 taken 16% -: 1110: case IMAGING_TRANSFORM_AFFINE: 315: 1111: return ImagingTransformAffine( call 0 returned 100% -: 1112: imOut, imIn, x0, y0, x1, y1, a, filterid, fill); -: 1113: break; -: 1114: case IMAGING_TRANSFORM_PERSPECTIVE: -: 1115: transform = perspective_transform; -: 1116: break; -: 1117: case IMAGING_TRANSFORM_QUAD: 9: 1118: transform = quad_transform; 9: 1119: break; -: 1120: default: #####: 1121: return (Imaging) ImagingError_ValueError("bad transform method"); call 0 never executed -: 1122: } -: 1123: 69: 1124: return ImagingGenericTransform( call 0 returned 100% -: 1125: imOut, imIn, -: 1126: x0, y0, x1, y1, -: 1127: transform, a, filterid, fill); -: 1128:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#BitDecode.c.gcov -: 0:Source:src/libImaging/BitDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/BitDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/BitDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for packed bitfields (converts to floating point) -: 6: * -: 7: * history: -: 8: * 97-05-31 fl created (much more than originally intended) -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1997. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19:#include "Bit.h" -: 20: -: 21: -: 22:int function ImagingBitDecode called 0 returned 0% blocks executed 0% #####: 23:ImagingBitDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 24:{ #####: 25: BITSTATE* bitstate = state->context; -: 26: UINT8* ptr; -: 27: #####: 28: if (state->state == 0) { branch 0 never executed branch 1 never executed -: 29: -: 30: /* Initialize context variables */ -: 31: -: 32: /* this decoder only works for float32 image buffers */ #####: 33: if (im->type != IMAGING_TYPE_FLOAT32) { branch 0 never executed branch 1 never executed #####: 34: state->errcode = IMAGING_CODEC_CONFIG; #####: 35: return -1; -: 36: } -: 37: -: 38: /* sanity check */ #####: 39: if (bitstate->bits < 1 || bitstate->bits >= 32) { branch 0 never executed branch 1 never executed #####: 40: state->errcode = IMAGING_CODEC_CONFIG; #####: 41: return -1; -: 42: } -: 43: #####: 44: bitstate->mask = (1<bits)-1; -: 45: #####: 46: if (bitstate->sign) { branch 0 never executed branch 1 never executed #####: 47: bitstate->signmask = (1<<(bitstate->bits-1)); -: 48: } -: 49: -: 50: /* check image orientation */ #####: 51: if (state->ystep < 0) { branch 0 never executed branch 1 never executed #####: 52: state->y = state->ysize-1; #####: 53: state->ystep = -1; -: 54: } else { #####: 55: state->ystep = 1; -: 56: } -: 57: #####: 58: state->state = 1; -: 59: -: 60: } -: 61: -: 62: ptr = buf; -: 63: #####: 64: while (bytes > 0) { branch 0 never executed branch 1 never executed -: 65: #####: 66: UINT8 byte = *ptr; -: 67: #####: 68: ptr++; #####: 69: bytes--; -: 70: -: 71: /* get a byte from the input stream and insert in the bit buffer */ #####: 72: if (bitstate->fill&1) { branch 0 never executed branch 1 never executed -: 73: /* fill MSB first */ #####: 74: bitstate->bitbuffer |= (unsigned long) byte << bitstate->bitcount; -: 75: } else { -: 76: /* fill LSB first */ #####: 77: bitstate->bitbuffer = (bitstate->bitbuffer << 8) | byte; -: 78: } -: 79: #####: 80: bitstate->bitcount += 8; -: 81: #####: 82: while (bitstate->bitcount >= bitstate->bits) { branch 0 never executed branch 1 never executed -: 83: -: 84: /* get a pixel from the bit buffer */ -: 85: unsigned long data; -: 86: FLOAT32 pixel; -: 87: #####: 88: if (bitstate->fill&2) { branch 0 never executed branch 1 never executed -: 89: /* store LSB first */ #####: 90: data = bitstate->bitbuffer & bitstate->mask; #####: 91: if (bitstate->bitcount > 32) { branch 0 never executed branch 1 never executed -: 92: /* bitbuffer overflow; restore it from last input byte */ #####: 93: bitstate->bitbuffer = byte >> (8 - (bitstate->bitcount - -: 94: bitstate->bits)); -: 95: } else { #####: 96: bitstate->bitbuffer >>= bitstate->bits; -: 97: } -: 98: } else { -: 99: /* store MSB first */ #####: 100: data = (bitstate->bitbuffer >> (bitstate->bitcount - -: 101: bitstate->bits)) #####: 102: & bitstate->mask; -: 103: } -: 104: #####: 105: bitstate->bitcount -= bitstate->bits; -: 106: #####: 107: if (bitstate->lutsize > 0) { branch 0 never executed branch 1 never executed -: 108: /* map through lookup table */ #####: 109: if (data <= 0) { branch 0 never executed branch 1 never executed #####: 110: pixel = bitstate->lut[0]; #####: 111: } else if (data >= bitstate->lutsize) { branch 0 never executed branch 1 never executed #####: 112: pixel = bitstate->lut[bitstate->lutsize-1]; -: 113: } else { #####: 114: pixel = bitstate->lut[data]; -: 115: } -: 116: } else { -: 117: /* convert */ #####: 118: if (data & bitstate->signmask) { branch 0 never executed branch 1 never executed -: 119: /* image memory contains signed data */ #####: 120: pixel = (FLOAT32) (INT32) (data | ~bitstate->mask); -: 121: } else { #####: 122: pixel = (FLOAT32) data; -: 123: } -: 124: } -: 125: #####: 126: *(FLOAT32*)(&im->image32[state->y][state->x]) = pixel; -: 127: -: 128: /* step forward */ #####: 129: if (++state->x >= state->xsize) { branch 0 never executed branch 1 never executed -: 130: /* new line */ #####: 131: state->y += state->ystep; #####: 132: if (state->y < 0 || state->y >= state->ysize) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 133: /* end of file (errcode = 0) */ -: 134: return -1; -: 135: } #####: 136: state->x = 0; -: 137: /* reset bit buffer */ #####: 138: if (bitstate->pad > 0) { branch 0 never executed branch 1 never executed #####: 139: bitstate->bitcount = 0; -: 140: } -: 141: } -: 142: } -: 143: } -: 144: #####: 145: return ptr - buf; -: 146:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Crop.c.gcov -: 0:Source:src/libImaging/Crop.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Crop.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Crop.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * cut region from image -: 6: * -: 7: * history: -: 8: * 95-11-27 fl Created -: 9: * 98-07-10 fl Fixed "null result" error -: 10: * 99-02-05 fl Rewritten to use Paste primitive -: 11: * -: 12: * Copyright (c) Secret Labs AB 1997-99. -: 13: * Copyright (c) Fredrik Lundh 1995. -: 14: * -: 15: * See the README file for information on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21: -: 22:Imaging function ImagingCrop called 1028538 returned 100% blocks executed 84% 1028538: 23:ImagingCrop(Imaging imIn, int sx0, int sy0, int sx1, int sy1) -: 24:{ -: 25: Imaging imOut; -: 26: int xsize, ysize; -: 27: int dx0, dy0, dx1, dy1; 1028538: 28: INT32 zero = 0; -: 29: 1028538: 30: if (!imIn) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 31: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 32: } -: 33: 1028538: 34: xsize = sx1 - sx0; 1028538: 35: if (xsize < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2: 36: xsize = 0; -: 37: } 1028538: 38: ysize = sy1 - sy0; 1028538: 39: if (ysize < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2: 40: ysize = 0; -: 41: } -: 42: 1028538: 43: imOut = ImagingNewDirty(imIn->mode, xsize, ysize); call 0 returned 100% 1028538: 44: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 45: return NULL; -: 46: } -: 47: 1028538: 48: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 49: 1028538: 50: if (sx0 < 0 || sy0 < 0 || sx1 > imIn->xsize || sy1 > imIn->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 99% (fallthrough) branch 5 taken 1% branch 6 taken 1% (fallthrough) branch 7 taken 99% 19: 51: (void) ImagingFill(imOut, &zero); call 0 returned 100% -: 52: } -: 53: 1028538: 54: dx0 = -sx0; 1028538: 55: dy0 = -sy0; 1028538: 56: dx1 = imIn->xsize - sx0; 1028538: 57: dy1 = imIn->ysize - sy0; -: 58: -: 59: /* paste the source image on top of the output image!!! */ 1028538: 60: if (ImagingPaste(imOut, imIn, NULL, dx0, dy0, dx1, dy1) < 0) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 61: ImagingDelete(imOut); call 0 never executed #####: 62: return NULL; -: 63: } -: 64: -: 65: return imOut; -: 66:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#SgiRleDecode.c.gcov -: 0:Source:src/libImaging/SgiRleDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/SgiRleDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/SgiRleDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for Sgi RLE data. -: 6: * -: 7: * history: -: 8: * 2017-07-28 mb fixed for images larger than 64KB -: 9: * 2017-07-20 mb created -: 10: * -: 11: * Copyright (c) Mickael Bonfill 2017. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16:#include "Imaging.h" -: 17:#include "Sgi.h" -: 18: -: 19:#define SGI_HEADER_SIZE 512 -: 20:#define RLE_COPY_FLAG 0x80 -: 21:#define RLE_MAX_RUN 0x7f -: 22: -: 23:static void read4B(UINT32* dest, UINT8* buf) -: 24:{ 7310: 25: *dest = (UINT32)((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]); -: 26:} -: 27: function expandrow called 390 returned 100% blocks executed 94% 390: 28:static int expandrow(UINT8* dest, UINT8* src, int n, int z, int xsize) -: 29:{ -: 30: UINT8 pixel, count; 390: 31: int x = 0; -: 32: 4029: 33: for (;n > 0; n--) branch 0 taken 100% branch 1 taken 0% (fallthrough) -: 34: { 4029: 35: pixel = *src++; 4029: 36: if (n == 1 && pixel != 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed -: 37: return n; -: 38: } 4029: 39: count = pixel & RLE_MAX_RUN; 4029: 40: if (!count) { branch 0 taken 10% (fallthrough) branch 1 taken 90% 389: 41: return count; -: 42: } 3640: 43: if (x + count > xsize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 44: return -1; -: 45: } 3639: 46: x += count; 3639: 47: if (pixel & RLE_COPY_FLAG) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 44413: 48: while(count--) { branch 0 taken 97% branch 1 taken 3% 42875: 49: *dest = *src++; 42875: 50: dest += z; -: 51: } -: 52: -: 53: } -: 54: else { 2101: 55: pixel = *src++; 10993: 56: while (count--) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 6791: 57: *dest = pixel; 6791: 58: dest += z; -: 59: } -: 60: } -: 61: -: 62: } -: 63: return 0; -: 64:} -: 65: function expandrow2 called 2289 returned 100% blocks executed 94% 2289: 66:static int expandrow2(UINT8* dest, const UINT8* src, int n, int z, int xsize) -: 67:{ -: 68: UINT8 pixel, count; -: 69: 2289: 70: int x = 0; -: 71: 27832: 72: for (;n > 0; n--) branch 0 taken 100% branch 1 taken 0% (fallthrough) -: 73: { 27832: 74: pixel = src[1]; 27832: 75: src+=2; 27832: 76: if (n == 1 && pixel != 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed -: 77: return n; -: 78: } 27832: 79: count = pixel & RLE_MAX_RUN; 27832: 80: if (!count) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 2286: 81: return count; -: 82: } 25546: 83: if (x + count > xsize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 84: return -1; -: 85: } 25543: 86: x += count; 25543: 87: if (pixel & RLE_COPY_FLAG) { branch 0 taken 57% (fallthrough) branch 1 taken 43% 790014: 88: while(count--) { branch 0 taken 99% branch 1 taken 1% 778949: 89: memcpy(dest, src, 2); 778949: 90: src += 2; 778949: 91: dest += z * 2; -: 92: } -: 93: } -: 94: else { 699326: 95: while (count--) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 684848: 96: memcpy(dest, src, 2); 684848: 97: dest += z * 2; -: 98: } 14478: 99: src+=2; -: 100: } -: 101: } -: 102: return 0; -: 103:} -: 104: -: 105: -: 106:int function ImagingSgiRleDecode called 7 returned 100% blocks executed 97% 7: 107:ImagingSgiRleDecode(Imaging im, ImagingCodecState state, -: 108: UINT8* buf, Py_ssize_t bytes) -: 109:{ -: 110: UINT8 *ptr; -: 111: SGISTATE *c; 7: 112: int err = 0; -: 113: int status; -: 114: -: 115: /* Get all data from File descriptor */ 7: 116: c = (SGISTATE*)state->context; 7: 117: _imaging_seek_pyFd(state->fd, 0L, SEEK_END); call 0 returned 100% 7: 118: c->bufsize = _imaging_tell_pyFd(state->fd); call 0 returned 100% 7: 119: c->bufsize -= SGI_HEADER_SIZE; 7: 120: ptr = malloc(sizeof(UINT8) * c->bufsize); 7: 121: if (!ptr) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 122: return IMAGING_CODEC_MEMORY; -: 123: } 7: 124: _imaging_seek_pyFd(state->fd, SGI_HEADER_SIZE, SEEK_SET); call 0 returned 100% 7: 125: _imaging_read_pyFd(state->fd, (char*)ptr, c->bufsize); call 0 returned 100% -: 126: -: 127: -: 128: /* decoder initialization */ 7: 129: state->count = 0; 7: 130: state->y = 0; 7: 131: if (state->ystep < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 7: 132: state->y = im->ysize - 1; -: 133: } else { #####: 134: state->ystep = 1; -: 135: } -: 136: 14: 137: if (im->xsize > INT_MAX / im->bands || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 7: 138: im->ysize > INT_MAX / im->bands) { -: 139: err = IMAGING_CODEC_MEMORY; -: 140: goto sgi_finish_decode; -: 141: } -: 142: -: 143: /* Allocate memory for RLE tables and rows */ 7: 144: free(state->buffer); 7: 145: state->buffer = NULL; -: 146: /* malloc overflow check above */ 7: 147: state->buffer = calloc(im->xsize * im->bands, sizeof(UINT8) * 2); 7: 148: c->tablen = im->bands * im->ysize; 7: 149: c->starttab = calloc(c->tablen, sizeof(UINT32)); 7: 150: c->lengthtab = calloc(c->tablen, sizeof(UINT32)); 7: 151: if (!state->buffer || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 7: 152: !c->starttab || branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 153: !c->lengthtab) { -: 154: err = IMAGING_CODEC_MEMORY; -: 155: goto sgi_finish_decode; -: 156: } -: 157: /* populate offsets table */ 3662: 158: for (c->tabindex = 0, c->bufindex = 0; c->tabindex < c->tablen; c->tabindex++, c->bufindex+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 7310: 159: read4B(&c->starttab[c->tabindex], &ptr[c->bufindex]); -: 160: } -: 161: /* populate lengths table */ 3662: 162: for (c->tabindex = 0, c->bufindex = c->tablen * sizeof(UINT32); c->tabindex < c->tablen; c->tabindex++, c->bufindex+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 7310: 163: read4B(&c->lengthtab[c->tabindex], &ptr[c->bufindex]); -: 164: } -: 165: 7: 166: state->count += c->tablen * sizeof(UINT32) * 2; -: 167: -: 168: /* read compressed rows */ 898: 169: for (c->rowno = 0; c->rowno < im->ysize; c->rowno++, state->y += state->ystep) branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 170: { 3571: 171: for (c->channo = 0; c->channo < im->bands; c->channo++) branch 0 taken 75% branch 1 taken 25% (fallthrough) -: 172: { 2680: 173: c->rleoffset = c->starttab[c->rowno + c->channo * im->ysize]; 2680: 174: c->rlelength = c->lengthtab[c->rowno + c->channo * im->ysize]; 2680: 175: c->rleoffset -= SGI_HEADER_SIZE; -: 176: 2680: 177: if (c->rleoffset + c->rlelength > c->bufsize) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 178: state->errcode = IMAGING_CODEC_OVERRUN; 1: 179: return -1; -: 180: } -: 181: -: 182: /* row decompression */ 2679: 183: if (c->bpc ==1) { branch 0 taken 15% (fallthrough) branch 1 taken 85% 390: 184: status = expandrow(&state->buffer[c->channo], &ptr[c->rleoffset], c->rlelength, im->bands, im->xsize); call 0 returned 100% -: 185: } -: 186: else { 2289: 187: status = expandrow2(&state->buffer[c->channo * 2], &ptr[c->rleoffset], c->rlelength, im->bands, im->xsize); call 0 returned 100% -: 188: } 2679: 189: if (status == -1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 4: 190: state->errcode = IMAGING_CODEC_OVERRUN; 4: 191: return -1; 2675: 192: } else if (status == 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 193: goto sgi_finish_decode; -: 194: } -: 195: 2675: 196: state->count += c->rlelength; -: 197: } -: 198: -: 199: /* store decompressed data in image */ 891: 200: state->shuffle((UINT8*)im->image[state->y], state->buffer, im->xsize); call 0 returned 100% -: 201: -: 202: } -: 203: 2: 204: c->bufsize++; -: 205: -: 206:sgi_finish_decode: ; -: 207: 2: 208: free(c->starttab); 2: 209: free(c->lengthtab); 2: 210: free(ptr); 2: 211: if (err != 0){ branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 212: return err; -: 213: } 2: 214: return state->count - c->bufsize; -: 215:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#codec_fd.c.gcov -: 0:Source:src/libImaging/codec_fd.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/codec_fd.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/codec_fd.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:#include "Python.h" -: 2:#include "Imaging.h" -: 3: -: 4: -: 5:Py_ssize_t function _imaging_read_pyFd called 69 returned 100% blocks executed 80% 69: 6:_imaging_read_pyFd(PyObject *fd, char* dest, Py_ssize_t bytes) -: 7:{ -: 8: /* dest should be a buffer bytes long, returns length of read -: 9: -1 on error */ -: 10: -: 11: PyObject *result; -: 12: char *buffer; -: 13: Py_ssize_t length; -: 14: int bytes_result; -: 15: 69: 16: result = PyObject_CallMethod(fd, "read", "n", bytes); call 0 returned 100% -: 17: 69: 18: bytes_result = PyBytes_AsStringAndSize(result, &buffer, &length); call 0 returned 100% 69: 19: if (bytes_result == -1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 20: goto err; -: 21: } -: 22: 69: 23: if (length > bytes) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 24: goto err; -: 25: } -: 26: 138: 27: memcpy(dest, buffer, length); -: 28: 69: 29: Py_DECREF(result); branch 0 taken 58% (fallthrough) branch 1 taken 42% call 2 returned 100% 69: 30: return length; -: 31: -: 32: err: #####: 33: Py_DECREF(result); branch 0 never executed branch 1 never executed call 2 never executed -: 34: return -1; -: 35: -: 36:} -: 37: -: 38:Py_ssize_t function _imaging_write_pyFd called 54 returned 100% blocks executed 100% 54: 39:_imaging_write_pyFd(PyObject *fd, char* src, Py_ssize_t bytes) -: 40:{ -: 41: -: 42: PyObject *result; -: 43: PyObject *byteObj; -: 44: 54: 45: byteObj = PyBytes_FromStringAndSize(src, bytes); call 0 returned 100% 54: 46: result = PyObject_CallMethod(fd, "write", "O", byteObj); call 0 returned 100% -: 47: 54: 48: Py_DECREF(byteObj); branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% 54: 49: Py_DECREF(result); branch 0 taken 24% (fallthrough) branch 1 taken 76% call 2 returned 100% -: 50: 54: 51: return bytes; -: 52: -: 53:} -: 54: -: 55:int function _imaging_seek_pyFd called 40 returned 100% blocks executed 100% 40: 56:_imaging_seek_pyFd(PyObject *fd, Py_ssize_t offset, int whence) -: 57:{ -: 58: PyObject *result; -: 59: 40: 60: result = PyObject_CallMethod(fd, "seek", "ni", offset, whence); call 0 returned 100% -: 61: 40: 62: Py_DECREF(result); branch 0 taken 68% (fallthrough) branch 1 taken 33% call 2 returned 100% 40: 63: return 0; -: 64: -: 65:} -: 66: -: 67:Py_ssize_t function _imaging_tell_pyFd called 33 returned 100% blocks executed 100% 33: 68:_imaging_tell_pyFd(PyObject *fd) -: 69:{ -: 70: PyObject *result; -: 71: Py_ssize_t location; -: 72: 33: 73: result = PyObject_CallMethod(fd, "tell", NULL); call 0 returned 100% 33: 74: location = PyLong_AsSsize_t(result); call 0 returned 100% -: 75: 33: 76: Py_DECREF(result); branch 0 taken 61% (fallthrough) branch 1 taken 39% call 2 returned 100% 33: 77: return location; -: 78:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Draw.c.gcov -: 0:Source:src/libImaging/Draw.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Draw.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Draw.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * a simple drawing package for the Imaging library -: 6: * -: 7: * history: -: 8: * 1996-04-13 fl Created. -: 9: * 1996-04-30 fl Added transforms and polygon support. -: 10: * 1996-08-12 fl Added filled polygons. -: 11: * 1996-11-05 fl Fixed float/int confusion in polygon filler -: 12: * 1997-07-04 fl Support 32-bit images (C++ would have been nice) -: 13: * 1998-09-09 fl Eliminated qsort casts; improved rectangle clipping -: 14: * 1998-09-10 fl Fixed fill rectangle to include lower edge (!) -: 15: * 1998-12-29 fl Added arc, chord, and pieslice primitives -: 16: * 1999-01-10 fl Added some level 2 ("arrow") stuff (experimental) -: 17: * 1999-02-06 fl Added bitmap primitive -: 18: * 1999-07-26 fl Eliminated a compiler warning -: 19: * 1999-07-31 fl Pass ink as void* instead of int -: 20: * 2002-12-10 fl Added experimental RGBA-on-RGB drawing -: 21: * 2004-09-04 fl Support simple wide lines (no joins) -: 22: * 2005-05-25 fl Fixed line width calculation -: 23: * -: 24: * Copyright (c) 1996-2006 by Fredrik Lundh -: 25: * Copyright (c) 1997-2006 by Secret Labs AB. -: 26: * -: 27: * See the README file for information on usage and redistribution. -: 28: */ -: 29: -: 30:/* FIXME: support fill/outline attribute for all filled shapes */ -: 31:/* FIXME: support zero-winding fill */ -: 32:/* FIXME: add drawing context, support affine transforms */ -: 33:/* FIXME: support clip window (and mask?) */ -: 34: -: 35:#include "Imaging.h" -: 36: -: 37:#include -: 38:#include -: 39: -: 40:#define CEIL(v) (int) ceil(v) -: 41:#define FLOOR(v) ((v) >= 0.0 ? (int) (v) : (int) floor(v)) -: 42: -: 43:#define INK8(ink) (*(UINT8*)ink) -: 44: -: 45:/* -: 46: * Rounds around zero (up=away from zero, down=towards zero) -: 47: * This guarantees that ROUND_UP|DOWN(f) == -ROUND_UP|DOWN(-f) -: 48: */ -: 49:#define ROUND_UP(f) ((int) ((f) >= 0.0 ? floor((f) + 0.5F) : -floor(fabs(f) + 0.5F))) -: 50:#define ROUND_DOWN(f) ((int) ((f) >= 0.0 ? ceil((f) - 0.5F) : -ceil(fabs(f) - 0.5F))) -: 51: -: 52:/* -------------------------------------------------------------------- */ -: 53:/* Primitives */ -: 54:/* -------------------------------------------------------------------- */ -: 55: -: 56:typedef struct { -: 57: /* edge descriptor for polygon engine */ -: 58: int d; -: 59: int x0, y0; -: 60: int xmin, ymin, xmax, ymax; -: 61: float dx; -: 62:} Edge; -: 63: -: 64:/* Type used in "polygon*" functions */ -: 65:typedef void (*hline_handler)(Imaging, int, int, int, int); -: 66: -: 67:static inline void function point8 called 658 returned 100% blocks executed 100% 658: 68:point8(Imaging im, int x, int y, int ink) -: 69:{ 658: 70: if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 99% (fallthrough) branch 7 taken 1% 655: 71: if (strncmp(im->mode, "I;16", 4) == 0) { branch 0 taken 15% (fallthrough) branch 1 taken 85% 100: 72: im->image8[y][x*2] = (UINT8) ink; 100: 73: im->image8[y][x*2+1] = (UINT8) ink; -: 74: } else { 555: 75: im->image8[y][x] = (UINT8) ink; -: 76: } -: 77: } 658: 78:} -: 79: -: 80:static inline void function point32 called 165 returned 100% blocks executed 100% 165: 81:point32(Imaging im, int x, int y, int ink) -: 82:{ 63249: 83: if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 100% (fallthrough) branch 11 taken 0% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 100% (fallthrough) branch 15 taken 0% branch 16 taken 100% (fallthrough) branch 17 taken 0% branch 18 taken 100% (fallthrough) branch 19 taken 0% branch 20 taken 100% (fallthrough) branch 21 taken 0% branch 22 taken 100% (fallthrough) branch 23 taken 0% branch 24 taken 100% (fallthrough) branch 25 taken 0% branch 26 taken 100% (fallthrough) branch 27 taken 0% branch 28 taken 100% (fallthrough) branch 29 taken 0% branch 30 taken 100% (fallthrough) branch 31 taken 0% branch 32 taken 100% (fallthrough) branch 33 taken 0% branch 34 taken 53% (fallthrough) branch 35 taken 47% branch 36 taken 100% (fallthrough) branch 37 taken 0% branch 38 taken 11% (fallthrough) branch 39 taken 89% 63094: 84: im->image32[y][x] = ink; -: 85: } 165: 86:} -: 87: -: 88:static inline void function point32rgba called 0 returned 0% blocks executed 0% #####: 89:point32rgba(Imaging im, int x, int y, int ink) -: 90:{ -: 91: unsigned int tmp1; -: 92: #####: 93: if (x >= 0 && x < im->xsize && y >= 0 && y < im->ysize) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed #####: 94: UINT8* out = (UINT8*) im->image[y]+x*4; #####: 95: UINT8* in = (UINT8*) &ink; #####: 96: out[0] = BLEND(in[3], out[0], in[0], tmp1); #####: 97: out[1] = BLEND(in[3], out[1], in[1], tmp1); #####: 98: out[2] = BLEND(in[3], out[2], in[2], tmp1); -: 99: } #####: 100:} -: 101: -: 102:static inline void function hline8 called 2781 returned 100% blocks executed 93% 2781: 103:hline8(Imaging im, int x0, int y0, int x1, int ink) -: 104:{ -: 105: int tmp, pixelwidth; -: 106: 2781: 107: if (y0 >= 0 && y0 < im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 98% (fallthrough) branch 3 taken 2% 2737: 108: if (x0 > x1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 109: tmp = x0, x0 = x1, x1 = tmp; -: 110: } 2737: 111: if (x0 < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 112: x0 = 0; 2737: 113: } else if (x0 >= im->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 114: return; -: 115: } 2737: 116: if (x1 < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 117: return; 2737: 118: } else if (x1 >= im->xsize) { branch 0 taken 12% (fallthrough) branch 1 taken 88% 337: 119: x1 = im->xsize-1; -: 120: } 2737: 121: if (x0 <= x1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 2737: 122: pixelwidth = strncmp(im->mode, "I;16", 4) == 0 ? 2 : 1; branch 0 taken 98% (fallthrough) branch 1 taken 2% 5474: 123: memset(im->image8[y0] + x0 * pixelwidth, (UINT8) ink, 2737: 124: (x1 - x0 + 1) * pixelwidth); -: 125: } -: 126: } -: 127:} -: 128: -: 129:static inline void function hline32 called 77255 returned 100% blocks executed 100% 77255: 130:hline32(Imaging im, int x0, int y0, int x1, int ink) -: 131:{ -: 132: int tmp; -: 133: INT32* p; -: 134: 77255: 135: if (y0 >= 0 && y0 < im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 99% (fallthrough) branch 3 taken 1% 77243: 136: if (x0 > x1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 6: 137: tmp = x0, x0 = x1, x1 = tmp; -: 138: } 77243: 139: if (x0 < 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 140: x0 = 0; 77043: 141: } else if (x0 >= im->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 142: return; -: 143: } 77243: 144: if (x1 < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 145: return; 77243: 146: } else if (x1 >= im->xsize) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 1173: 147: x1 = im->xsize-1; -: 148: } 77243: 149: p = im->image32[y0]; 1020421: 150: while (x0 <= x1) { branch 0 taken 92% branch 1 taken 8% (fallthrough) 865935: 151: p[x0++] = ink; -: 152: } -: 153: } -: 154:} -: 155: -: 156:static inline void function hline32rgba called 102 returned 100% blocks executed 86% 102: 157:hline32rgba(Imaging im, int x0, int y0, int x1, int ink) -: 158:{ -: 159: int tmp; -: 160: unsigned int tmp1; -: 161: 102: 162: if (y0 >= 0 && y0 < im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 102: 163: if (x0 > x1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 164: tmp = x0, x0 = x1, x1 = tmp; -: 165: } 102: 166: if (x0 < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 167: x0 = 0; 102: 168: } else if (x0 >= im->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 169: return; -: 170: } 102: 171: if (x1 < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 172: return; 102: 173: } else if (x1 >= im->xsize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 174: x1 = im->xsize-1; -: 175: } 102: 176: if (x0 <= x1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 102: 177: UINT8* out = (UINT8*) im->image[y0]+x0*4; 102: 178: UINT8* in = (UINT8*) &ink; 2229: 179: while (x0 <= x1) { branch 0 taken 95% branch 1 taken 5% (fallthrough) 2025: 180: out[0] = BLEND(in[3], out[0], in[0], tmp1); 2025: 181: out[1] = BLEND(in[3], out[1], in[1], tmp1); 2025: 182: out[2] = BLEND(in[3], out[2], in[2], tmp1); 2025: 183: x0++; out += 4; -: 184: } -: 185: } -: 186: } -: 187:} -: 188: -: 189:static inline void function line8 called 11 returned 100% blocks executed 86% 11: 190:line8(Imaging im, int x0, int y0, int x1, int y1, int ink) -: 191:{ -: 192: int i, n, e; -: 193: int dx, dy; -: 194: int xs, ys; -: 195: -: 196: /* normalize coordinates */ 11: 197: dx = x1-x0; 11: 198: if (dx < 0) { branch 0 taken 18% (fallthrough) branch 1 taken 82% 2: 199: dx = -dx, xs = -1; -: 200: } else { -: 201: xs = 1; -: 202: } 11: 203: dy = y1-y0; 11: 204: if (dy < 0) { branch 0 taken 45% (fallthrough) branch 1 taken 55% 5: 205: dy = -dy, ys = -1; -: 206: } else { -: 207: ys = 1; -: 208: } -: 209: 11: 210: n = (dx > dy) ? dx : dy; -: 211: 11: 212: if (dx == 0) { branch 0 taken 45% (fallthrough) branch 1 taken 55% -: 213: -: 214: /* vertical */ 200: 215: for (i = 0; i < dy; i++) { branch 0 taken 98% branch 1 taken 2% 200: 216: point8(im, x0, y0, ink); call 0 returned 100% 200: 217: y0 += ys; -: 218: } -: 219: 6: 220: } else if (dy == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 221: -: 222: /* horizontal */ #####: 223: for (i = 0; i < dx; i++) { branch 0 never executed branch 1 never executed #####: 224: point8(im, x0, y0, ink); call 0 never executed #####: 225: x0 += xs; -: 226: } -: 227: 6: 228: } else if (dx > dy) { branch 0 taken 33% (fallthrough) branch 1 taken 67% -: 229: -: 230: /* bresenham, horizontal slope */ 2: 231: n = dx; 2: 232: dy += dy; 2: 233: e = dy - dx; 2: 234: dx += dx; -: 235: 122: 236: for (i = 0; i < n; i++) { branch 0 taken 98% branch 1 taken 2% 120: 237: point8(im, x0, y0, ink); call 0 returned 100% 120: 238: if (e >= 0) { branch 0 taken 67% (fallthrough) branch 1 taken 33% 80: 239: y0 += ys; 80: 240: e -= dx; -: 241: } 120: 242: e += dy; 120: 243: x0 += xs; -: 244: } -: 245: -: 246: } else { -: 247: -: 248: /* bresenham, vertical slope */ 4: 249: n = dy; 4: 250: dx += dx; 4: 251: e = dx - dy; 4: 252: dy += dy; -: 253: 340: 254: for (i = 0; i < n; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 336: 255: point8(im, x0, y0, ink); call 0 returned 100% 336: 256: if (e >= 0) { branch 0 taken 88% (fallthrough) branch 1 taken 12% 296: 257: x0 += xs; 296: 258: e -= dy; -: 259: } 336: 260: e += dx; 336: 261: y0 += ys; -: 262: } -: 263: -: 264: } 11: 265:} -: 266: -: 267:static inline void function line32 called 288 returned 100% blocks executed 100% 288: 268:line32(Imaging im, int x0, int y0, int x1, int y1, int ink) -: 269:{ -: 270: int i, n, e; -: 271: int dx, dy; -: 272: int xs, ys; -: 273: -: 274: /* normalize coordinates */ 288: 275: dx = x1-x0; 288: 276: if (dx < 0) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 7: 277: dx = -dx, xs = -1; -: 278: } else { -: 279: xs = 1; -: 280: } 288: 281: dy = y1-y0; 288: 282: if (dy < 0) { branch 0 taken 14% (fallthrough) branch 1 taken 86% 41: 283: dy = -dy, ys = -1; -: 284: } else { -: 285: ys = 1; -: 286: } -: 287: 288: 288: n = (dx > dy) ? dx : dy; -: 289: 288: 290: if (dx == 0) { branch 0 taken 48% (fallthrough) branch 1 taken 52% -: 291: -: 292: /* vertical */ 31174: 293: for (i = 0; i < dy; i++) { branch 0 taken 99% branch 1 taken 1% 31174: 294: point32(im, x0, y0, ink); 31174: 295: y0 += ys; -: 296: } -: 297: 149: 298: } else if (dy == 0) { branch 0 taken 52% (fallthrough) branch 1 taken 48% -: 299: -: 300: /* horizontal */ 31250: 301: for (i = 0; i < dx; i++) { branch 0 taken 99% branch 1 taken 1% 31250: 302: point32(im, x0, y0, ink); 31250: 303: x0 += xs; -: 304: } -: 305: 71: 306: } else if (dx > dy) { branch 0 taken 3% (fallthrough) branch 1 taken 97% -: 307: -: 308: /* bresenham, horizontal slope */ 2: 309: n = dx; 2: 310: dy += dy; 2: 311: e = dy - dx; 2: 312: dx += dx; -: 313: 122: 314: for (i = 0; i < n; i++) { branch 0 taken 98% branch 1 taken 2% 120: 315: point32(im, x0, y0, ink); 120: 316: if (e >= 0) { branch 0 taken 67% (fallthrough) branch 1 taken 33% 80: 317: y0 += ys; 80: 318: e -= dx; -: 319: } 120: 320: e += dy; 120: 321: x0 += xs; -: 322: } -: 323: -: 324: } else { -: 325: -: 326: /* bresenham, vertical slope */ 69: 327: n = dy; 69: 328: dx += dx; 69: 329: e = dx - dy; 69: 330: dy += dy; -: 331: 609: 332: for (i = 0; i < n; i++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 540: 333: point32(im, x0, y0, ink); 540: 334: if (e >= 0) { branch 0 taken 78% (fallthrough) branch 1 taken 22% 420: 335: x0 += xs; 420: 336: e -= dy; -: 337: } 540: 338: e += dx; 540: 339: y0 += ys; -: 340: } -: 341: -: 342: } 288: 343:} -: 344: -: 345:static inline void function line32rgba called 0 returned 0% blocks executed 0% #####: 346:line32rgba(Imaging im, int x0, int y0, int x1, int y1, int ink) -: 347:{ -: 348: int i, n, e; -: 349: int dx, dy; -: 350: int xs, ys; -: 351: -: 352: /* normalize coordinates */ #####: 353: dx = x1-x0; #####: 354: if (dx < 0) { branch 0 never executed branch 1 never executed #####: 355: dx = -dx, xs = -1; -: 356: } else { -: 357: xs = 1; -: 358: } #####: 359: dy = y1-y0; #####: 360: if (dy < 0) { branch 0 never executed branch 1 never executed #####: 361: dy = -dy, ys = -1; -: 362: } else { -: 363: ys = 1; -: 364: } -: 365: #####: 366: n = (dx > dy) ? dx : dy; -: 367: #####: 368: if (dx == 0) { branch 0 never executed branch 1 never executed -: 369: -: 370: /* vertical */ #####: 371: for (i = 0; i < dy; i++) { branch 0 never executed branch 1 never executed #####: 372: point32rgba(im, x0, y0, ink); call 0 never executed #####: 373: y0 += ys; -: 374: } -: 375: #####: 376: } else if (dy == 0) { branch 0 never executed branch 1 never executed -: 377: -: 378: /* horizontal */ #####: 379: for (i = 0; i < dx; i++) { branch 0 never executed branch 1 never executed #####: 380: point32rgba(im, x0, y0, ink); call 0 never executed #####: 381: x0 += xs; -: 382: } -: 383: #####: 384: } else if (dx > dy) { branch 0 never executed branch 1 never executed -: 385: -: 386: /* bresenham, horizontal slope */ #####: 387: n = dx; #####: 388: dy += dy; #####: 389: e = dy - dx; #####: 390: dx += dx; -: 391: #####: 392: for (i = 0; i < n; i++) { branch 0 never executed branch 1 never executed #####: 393: point32rgba(im, x0, y0, ink); call 0 never executed #####: 394: if (e >= 0) { branch 0 never executed branch 1 never executed #####: 395: y0 += ys; #####: 396: e -= dx; -: 397: } #####: 398: e += dy; #####: 399: x0 += xs; -: 400: } -: 401: -: 402: } else { -: 403: -: 404: /* bresenham, vertical slope */ #####: 405: n = dy; #####: 406: dx += dx; #####: 407: e = dx - dy; #####: 408: dy += dy; -: 409: #####: 410: for (i = 0; i < n; i++) { branch 0 never executed branch 1 never executed #####: 411: point32rgba(im, x0, y0, ink); call 0 never executed #####: 412: if (e >= 0) { branch 0 never executed branch 1 never executed #####: 413: x0 += xs; #####: 414: e -= dy; -: 415: } #####: 416: e += dx; #####: 417: y0 += ys; -: 418: } -: 419: -: 420: } #####: 421:} -: 422: -: 423:static int function x_cmp called 7448 returned 100% blocks executed 100% 7448: 424:x_cmp(const void *x0, const void *x1) -: 425:{ 7448: 426: float diff = *((float*)x0) - *((float*)x1); 7448: 427: if (diff < 0) { branch 0 taken 56% (fallthrough) branch 1 taken 44% -: 428: return -1; 4169: 429: } else if (diff > 0) { branch 0 taken 21% (fallthrough) branch 1 taken 79% -: 430: return 1; -: 431: } else { 890: 432: return 0; -: 433: } -: 434:} -: 435: -: 436: -: 437:static void function draw_horizontal_lines called 12757 returned 100% blocks executed 100% 12757: 438:draw_horizontal_lines(Imaging im, int n, Edge *e, int ink, int *x_pos, int y, hline_handler hline) -: 439:{ -: 440: int i; 82885: 441: for (i = 0; i < n; i++) { branch 0 taken 85% branch 1 taken 15% (fallthrough) 70128: 442: if (e[i].ymin == y && e[i].ymin == e[i].ymax) { branch 0 taken 3% (fallthrough) branch 1 taken 97% branch 2 taken 21% (fallthrough) branch 3 taken 79% -: 443: int xmax; 438: 444: int xmin = e[i].xmin; 438: 445: if (*x_pos < xmin) { branch 0 taken 48% (fallthrough) branch 1 taken 52% -: 446: // Line would be after the current position 209: 447: continue; -: 448: } -: 449: 229: 450: xmax = e[i].xmax; 229: 451: if (*x_pos > xmin) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 452: // Line would be partway through x_pos, so increase the starting point 228: 453: xmin = *x_pos; 228: 454: if (xmax < xmin) { branch 0 taken 93% (fallthrough) branch 1 taken 7% -: 455: // Line would now end before it started 212: 456: continue; -: 457: } -: 458: } -: 459: 17: 460: (*hline)(im, xmin, e[i].ymin, xmax, ink); call 0 returned 100% 17: 461: *x_pos = xmax+1; -: 462: } -: 463: } 12757: 464:} -: 465: -: 466:/* -: 467: * Filled polygon draw function using scan line algorithm. -: 468: */ -: 469:static inline int function polygon_generic.isra.0 called 166 returned 100% blocks executed 96% 166: 470:polygon_generic(Imaging im, int n, Edge *e, int ink, int eofill, -: 471: hline_handler hline) -: 472:{ -: 473: -: 474: Edge** edge_table; -: 475: float* xx; 166: 476: int edge_count = 0; 166: 477: int ymin = im->ysize - 1; 166: 478: int ymax = 0; -: 479: int i; -: 480: 166: 481: if (n <= 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 482: return 0; -: 483: } -: 484: -: 485: /* Initialize the edge table and find polygon boundaries */ -: 486: /* malloc check ok, using calloc */ 166: 487: edge_table = calloc(n, sizeof(Edge*)); 166: 488: if (!edge_table) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 489: return -1; -: 490: } -: 491: 889: 492: for (i = 0; i < n; i++) { branch 0 taken 84% branch 1 taken 16% (fallthrough) 889: 493: if (ymin > e[i].ymin) { branch 0 taken 26% (fallthrough) branch 1 taken 74% 232: 494: ymin = e[i].ymin; -: 495: } 889: 496: if (ymax < e[i].ymax) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 324: 497: ymax = e[i].ymax; -: 498: } 889: 499: if (e[i].ymin == e[i].ymax) { branch 0 taken 23% (fallthrough) branch 1 taken 77% 205: 500: continue; -: 501: } 684: 502: edge_table[edge_count++] = (e + i); -: 503: } 166: 504: if (ymin < 0) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 3: 505: ymin = 0; -: 506: } 166: 507: if (ymax > im->ysize) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 508: ymax = im->ysize; -: 509: } -: 510: -: 511: /* Process the edge table with a scan line searching for intersections */ -: 512: /* malloc check ok, using calloc */ 166: 513: xx = calloc(edge_count * 2, sizeof(float)); 166: 514: if (!xx) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 515: free(edge_table); -: 516: return -1; -: 517: } 6289: 518: for (; ymin <= ymax; ymin++) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 6289: 519: int j = 0; 6289: 520: int x_pos = 0; 32885: 521: for (i = 0; i < edge_count; i++) { branch 0 taken 81% branch 1 taken 19% (fallthrough) 26596: 522: Edge* current = edge_table[i]; 26596: 523: if (ymin >= current->ymin && ymin <= current->ymax) { branch 0 taken 72% (fallthrough) branch 1 taken 28% branch 2 taken 68% (fallthrough) branch 3 taken 32% 12929: 524: xx[j++] = (ymin - current->y0) * current->dx + current->x0; -: 525: } -: 526: /* Needed to draw consistent polygons */ 26596: 527: if (ymin == current->ymax && ymin < ymax) { branch 0 taken 3% (fallthrough) branch 1 taken 97% branch 2 taken 52% (fallthrough) branch 3 taken 48% 353: 528: xx[j] = xx[j - 1]; 353: 529: j++; -: 530: } -: 531: } 6289: 532: qsort(xx, j, sizeof(float), x_cmp); 12930: 533: for (i = 1; i < j; i += 2) { call 0 returned 100% branch 1 taken 51% branch 2 taken 49% (fallthrough) 6641: 534: int x_end = ROUND_DOWN(xx[i]); branch 0 taken 99% (fallthrough) branch 1 taken 1% 6641: 535: if (x_end < x_pos) { branch 0 taken 3% (fallthrough) branch 1 taken 97% -: 536: // Line would be before the current position 173: 537: continue; -: 538: } 6468: 539: draw_horizontal_lines(im, n, e, ink, &x_pos, ymin, hline); call 0 returned 100% 6468: 540: if (x_end < x_pos) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 541: // Line would be before the current position 8: 542: continue; -: 543: } -: 544: 6460: 545: int x_start = ROUND_UP(xx[i-1]); branch 0 taken 99% (fallthrough) branch 1 taken 1% 6460: 546: if (x_pos > x_start) { branch 0 taken 3% (fallthrough) branch 1 taken 97% -: 547: // Line would be partway through x_pos, so increase the starting point 179: 548: x_start = x_pos; 179: 549: if (x_end < x_start) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 550: // Line would now end before it started #####: 551: continue; -: 552: } -: 553: } 6460: 554: (*hline)(im, x_start, ymin, x_end, ink); call 0 returned 100% 6460: 555: x_pos = x_end+1; -: 556: } 6289: 557: draw_horizontal_lines(im, n, e, ink, &x_pos, ymin, hline); call 0 returned 100% -: 558: } -: 559: 166: 560: free(xx); 166: 561: free(edge_table); -: 562: return 0; -: 563:} -: 564: -: 565:static inline int function polygon8 called 7 returned 100% blocks executed 100% 7: 566:polygon8(Imaging im, int n, Edge *e, int ink, int eofill) -: 567:{ 7: 568: return polygon_generic(im, n, e, ink, eofill, hline8); call 0 returned 100% -: 569:} -: 570: -: 571:static inline int function polygon32 called 159 returned 100% blocks executed 100% 159: 572:polygon32(Imaging im, int n, Edge *e, int ink, int eofill) -: 573:{ 159: 574: return polygon_generic(im, n, e, ink, eofill, hline32); call 0 returned 100% -: 575:} -: 576: -: 577:static inline int function polygon32rgba called 0 returned 0% blocks executed 0% #####: 578:polygon32rgba(Imaging im, int n, Edge *e, int ink, int eofill) -: 579:{ #####: 580: return polygon_generic(im, n, e, ink, eofill, hline32rgba); call 0 never executed -: 581:} -: 582: -: 583:static inline void function add_edge called 724 returned 100% blocks executed 100% 724: 584:add_edge(Edge *e, int x0, int y0, int x1, int y1) -: 585:{ -: 586: /* printf("edge %d %d %d %d\n", x0, y0, x1, y1); */ -: 587: 724: 588: if (x0 <= x1) { branch 0 taken 63% (fallthrough) branch 1 taken 37% 459: 589: e->xmin = x0, e->xmax = x1; -: 590: } else { 265: 591: e->xmin = x1, e->xmax = x0; -: 592: } -: 593: 724: 594: if (y0 <= y1) { branch 0 taken 62% (fallthrough) branch 1 taken 38% 450: 595: e->ymin = y0, e->ymax = y1; -: 596: } else { 274: 597: e->ymin = y1, e->ymax = y0; -: 598: } -: 599: 724: 600: if (y0 == y1) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 180: 601: e->d = 0; 180: 602: e->dx = 0.0; -: 603: } else { 544: 604: e->dx = ((float)(x1-x0)) / (y1-y0); 544: 605: if (y0 == e->ymin) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 270: 606: e->d = 1; -: 607: } else { 274: 608: e->d = -1; -: 609: } -: 610: } -: 611: 724: 612: e->x0 = x0; 724: 613: e->y0 = y0; 724: 614:} -: 615: -: 616:typedef struct { -: 617: void (*point)(Imaging im, int x, int y, int ink); -: 618: void (*hline)(Imaging im, int x0, int y0, int x1, int ink); -: 619: void (*line)(Imaging im, int x0, int y0, int x1, int y1, int ink); -: 620: int (*polygon)(Imaging im, int n, Edge *e, int ink, int eofill); -: 621:} DRAW; -: 622: -: 623:DRAW draw8 = { point8, hline8, line8, polygon8 }; -: 624:DRAW draw32 = { point32, hline32, line32, polygon32 }; -: 625:DRAW draw32rgba = { point32rgba, hline32rgba, line32rgba, polygon32rgba }; -: 626: -: 627:/* -------------------------------------------------------------------- */ -: 628:/* Interface */ -: 629:/* -------------------------------------------------------------------- */ -: 630: -: 631:#define DRAWINIT()\ -: 632: if (im->image8) {\ -: 633: draw = &draw8;\ -: 634: ink = INK8(ink_);\ -: 635: } else {\ -: 636: draw = (op) ? &draw32rgba : &draw32; \ -: 637: memcpy(&ink, ink_, sizeof(ink)); \ -: 638: } -: 639: -: 640:int function ImagingDrawPoint called 166 returned 100% blocks executed 100% 166: 641:ImagingDrawPoint(Imaging im, int x0, int y0, const void* ink_, int op) -: 642:{ -: 643: DRAW* draw; -: 644: INT32 ink; -: 645: 166: 646: DRAWINIT(); branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 647: 166: 648: draw->point(im, x0, y0, ink); call 0 returned 100% -: 649: 166: 650: return 0; -: 651:} -: 652: -: 653:int function ImagingDrawLine called 163 returned 100% blocks executed 100% 163: 654:ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void* ink_, -: 655: int op) -: 656:{ -: 657: DRAW* draw; -: 658: INT32 ink; -: 659: 163: 660: DRAWINIT(); branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 661: 163: 662: draw->line(im, x0, y0, x1, y1, ink); call 0 returned 100% -: 663: 163: 664: return 0; -: 665:} -: 666: -: 667:int function ImagingDrawWideLine called 140 returned 100% blocks executed 91% 140: 668:ImagingDrawWideLine(Imaging im, int x0, int y0, int x1, int y1, -: 669: const void* ink_, int width, int op) -: 670:{ -: 671: DRAW* draw; -: 672: INT32 ink; -: 673: int dx, dy; -: 674: double big_hypotenuse, small_hypotenuse, ratio_max, ratio_min; -: 675: int dxmin, dxmax, dymin, dymax; -: 676: Edge e[4]; -: 677: 140: 678: DRAWINIT(); branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 679: 140: 680: dx = x1-x0; 140: 681: dy = y1-y0; 140: 682: if (dx == 0 && dy == 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 683: draw->point(im, x0, y0, ink); call 0 returned 100% 1: 684: return 0; -: 685: } -: 686: 139: 687: big_hypotenuse = hypot(dx, dy); 139: 688: small_hypotenuse = (width - 1) / 2.0; 139: 689: ratio_max = ROUND_UP(small_hypotenuse) / big_hypotenuse; branch 0 taken 100% (fallthrough) branch 1 taken 0% 139: 690: ratio_min = ROUND_DOWN(small_hypotenuse) / big_hypotenuse; branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 691: 139: 692: dxmin = ROUND_DOWN(ratio_min * dy); branch 0 taken 63% (fallthrough) branch 1 taken 37% 139: 693: dxmax = ROUND_DOWN(ratio_max * dy); branch 0 taken 59% (fallthrough) branch 1 taken 41% 139: 694: dymin = ROUND_DOWN(ratio_min * dx); branch 0 taken 59% (fallthrough) branch 1 taken 41% 139: 695: dymax = ROUND_DOWN(ratio_max * dx); branch 0 taken 58% (fallthrough) branch 1 taken 42% -: 696: { 1112: 697: int vertices[4][2] = { 278: 698: {x0 - dxmin, y0 + dymax}, 278: 699: {x1 - dxmin, y1 + dymax}, 278: 700: {x1 + dxmax, y1 - dymin}, 278: 701: {x0 + dxmax, y0 - dymin} -: 702: }; -: 703: 139: 704: add_edge(e+0, vertices[0][0], vertices[0][1], vertices[1][0], vertices[1][1]); call 0 returned 100% 139: 705: add_edge(e+1, vertices[1][0], vertices[1][1], vertices[2][0], vertices[2][1]); call 0 returned 100% 139: 706: add_edge(e+2, vertices[2][0], vertices[2][1], vertices[3][0], vertices[3][1]); call 0 returned 100% 139: 707: add_edge(e+3, vertices[3][0], vertices[3][1], vertices[0][0], vertices[0][1]); call 0 returned 100% -: 708: 139: 709: draw->polygon(im, 4, e, ink, 0); call 0 returned 100% -: 710: } 139: 711: return 0; -: 712:} -: 713: -: 714:int function ImagingDrawRectangle called 147 returned 100% blocks executed 96% 147: 715:ImagingDrawRectangle(Imaging im, int x0, int y0, int x1, int y1, -: 716: const void* ink_, int fill, int width, int op) -: 717:{ -: 718: int i; -: 719: int y; -: 720: int tmp; -: 721: DRAW* draw; -: 722: INT32 ink; -: 723: 147: 724: DRAWINIT(); branch 0 taken 67% (fallthrough) branch 1 taken 33% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 725: 147: 726: if (y0 > y1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 727: tmp = y0, y0 = y1, y1 = tmp; -: 728: } -: 729: 147: 730: if (fill) { branch 0 taken 84% (fallthrough) branch 1 taken 16% -: 731: 123: 732: if (y0 < 0) { branch 0 taken 98% (fallthrough) branch 1 taken 2% -: 733: y0 = 0; 121: 734: } else if (y0 >= im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 735: return 0; -: 736: } -: 737: 123: 738: if (y1 < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 739: return 0; 123: 740: } else if (y1 > im->ysize) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 2: 741: y1 = im->ysize; -: 742: } -: 743: 3167: 744: for (y = y0; y <= y1; y++) { branch 0 taken 96% branch 1 taken 4% 3044: 745: draw->hline(im, x0, y, x1, ink); call 0 returned 100% -: 746: } -: 747: -: 748: } else { -: 749: /* outline */ 24: 750: if (width == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 751: width = 1; -: 752: } 56: 753: for (i = 0; i < width; i++) { branch 0 taken 57% branch 1 taken 43% (fallthrough) 32: 754: draw->hline(im, x0, y0+i, x1, ink); call 0 returned 100% 32: 755: draw->hline(im, x0, y1-i, x1, ink); call 0 returned 100% 32: 756: draw->line(im, x1-i, y0, x1-i, y1, ink); call 0 returned 100% 32: 757: draw->line(im, x0+i, y1, x0+i, y0, ink); call 0 returned 100% -: 758: } -: 759: } -: 760: -: 761: return 0; -: 762:} -: 763: -: 764:int function ImagingDrawPolygon called 26 returned 100% blocks executed 92% 26: 765:ImagingDrawPolygon(Imaging im, int count, int* xy, const void* ink_, -: 766: int fill, int op) -: 767:{ -: 768: int i, n; -: 769: DRAW* draw; -: 770: INT32 ink; -: 771: 26: 772: if (count <= 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 773: return 0; -: 774: } -: 775: 26: 776: DRAWINIT(); branch 0 taken 19% (fallthrough) branch 1 taken 81% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 777: 26: 778: if (fill) { branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 779: -: 780: /* Build edge list */ -: 781: /* malloc check ok, using calloc */ 19: 782: Edge* e = calloc(count, sizeof(Edge)); 19: 783: if (!e) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 784: (void) ImagingError_MemoryError(); call 0 never executed #####: 785: return -1; -: 786: } 52: 787: for (i = n = 0; i < count-1; i++) { branch 0 taken 73% branch 1 taken 27% (fallthrough) 52: 788: add_edge(&e[n++], xy[i+i], xy[i+i+1], xy[i+i+2], xy[i+i+3]); call 0 returned 100% -: 789: } 19: 790: if (xy[i+i] != xy[0] || xy[i+i+1] != xy[1]) { branch 0 taken 16% (fallthrough) branch 1 taken 84% branch 2 taken 33% (fallthrough) branch 3 taken 67% 17: 791: add_edge(&e[n++], xy[i+i], xy[i+i+1], xy[0], xy[1]); call 0 returned 100% -: 792: } 19: 793: draw->polygon(im, n, e, ink, 0); call 0 returned 100% 19: 794: free(e); -: 795: -: 796: } else { -: 797: -: 798: /* Outline */ 65: 799: for (i = 0; i < count-1; i++) { branch 0 taken 90% branch 1 taken 10% (fallthrough) 65: 800: draw->line(im, xy[i+i], xy[i+i+1], xy[i+i+2], xy[i+i+3], ink); call 0 returned 100% -: 801: } 7: 802: draw->line(im, xy[i+i], xy[i+i+1], xy[0], xy[1], ink); call 0 returned 100% -: 803: -: 804: } -: 805: -: 806: return 0; -: 807:} -: 808: -: 809:int function ImagingDrawBitmap called 350 returned 100% blocks executed 100% 350: 810:ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void* ink, -: 811: int op) -: 812:{ 700: 813: return ImagingFill2( call 0 returned 100% -: 814: im, ink, bitmap, 700: 815: x0, y0, x0 + bitmap->xsize, y0 + bitmap->ysize -: 816: ); -: 817:} -: 818: -: 819:/* -------------------------------------------------------------------- */ -: 820:/* standard shapes */ -: 821: -: 822:// Imagine 2D plane and ellipse with center in (0, 0) and semi-major axes a and b. -: 823:// Then quarter_* stuff approximates its top right quarter (x, y >= 0) with integer -: 824:// points from set {(2x+x0, 2y+y0) | x,y in Z} where x0, y0 are from {0, 1} and -: 825:// are such that point (a, b) is in the set. -: 826: -: 827:typedef struct { -: 828: int32_t a, b, cx, cy, ex, ey; -: 829: int64_t a2, b2, a2b2; -: 830: int8_t finished; -: 831:} quarter_state; -: 832: function quarter_init called 4155 returned 100% blocks executed 100% 4155: 833:void quarter_init(quarter_state* s, int32_t a, int32_t b) { 4155: 834: if (a < 0 || b < 0) { branch 0 taken 74% (fallthrough) branch 1 taken 26% branch 2 taken 1% (fallthrough) branch 3 taken 99% 1073: 835: s->finished = 1; -: 836: } else { 3082: 837: s->a = a; 3082: 838: s->b = b; 3082: 839: s->cx = a; 3082: 840: s->cy = b % 2; 3082: 841: s->ex = a % 2; 3082: 842: s->ey = b; 3082: 843: s->a2 = a * a; 3082: 844: s->b2 = b * b; 3082: 845: s->a2b2 = s->a2 * s->b2; 3082: 846: s->finished = 0; -: 847: } 4155: 848:} -: 849: -: 850:// deviation of the point from ellipse curve, basically a substitution -: 851:// of the point into the ellipse equation function quarter_delta called 115722 returned 100% blocks executed 100% 115722: 852:int64_t quarter_delta(quarter_state* s, int64_t x, int64_t y) { 115722: 853: return llabs(s->a2 * y * y + s->b2 * x * x - s->a2b2); -: 854:} -: 855: function quarter_next called 57079 returned 100% blocks executed 100% 57079: 856:int8_t quarter_next(quarter_state* s, int32_t* ret_x, int32_t* ret_y) { 57079: 857: if (s->finished) { branch 0 taken 75% (fallthrough) branch 1 taken 25% -: 858: return -1; -: 859: } 42799: 860: *ret_x = s->cx; 42799: 861: *ret_y = s->cy; 42799: 862: if (s->cx == s->ex && s->cy == s->ey) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 3073: 863: s->finished = 1; -: 864: } else { -: 865: // Bresenham's algorithm, possible optimization: only consider 2 of 3 -: 866: // next points depending on current slope 39726: 867: int32_t nx = s->cx; 39726: 868: int32_t ny = s->cy + 2; 39726: 869: int64_t ndelta = quarter_delta(s, nx, ny); call 0 returned 100% 39726: 870: if (nx > 1) { branch 0 taken 96% (fallthrough) branch 1 taken 4% 37998: 871: int64_t newdelta = quarter_delta(s, s->cx - 2, s->cy + 2); call 0 returned 100% 37998: 872: if (ndelta > newdelta) { branch 0 taken 68% (fallthrough) branch 1 taken 32% 25831: 873: nx = s->cx - 2; 25831: 874: ny = s->cy + 2; 25831: 875: ndelta = newdelta; -: 876: } 37998: 877: newdelta = quarter_delta(s, s->cx - 2, s->cy); call 0 returned 100% 37998: 878: if (ndelta > newdelta) { branch 0 taken 35% (fallthrough) branch 1 taken 65% 13268: 879: nx = s->cx - 2; 13268: 880: ny = s->cy; -: 881: } -: 882: } 39726: 883: s->cx = nx; 39726: 884: s->cy = ny; -: 885: } -: 886: return 0; -: 887:} -: 888: -: 889:// quarter_* stuff can "draw" a quarter of an ellipse with thickness 1, great. -: 890:// Now we use ellipse_* stuff to join all four quarters of two different sized -: 891:// ellipses and receive horizontal segments of a complete ellipse with -: 892:// specified thickness. -: 893:// -: 894:// Still using integer grid with step 2 at this point (like in quarter_*) -: 895:// to ease angle clipping in future. -: 896: -: 897:typedef struct { -: 898: quarter_state st_o, st_i; -: 899: int32_t py, pl, pr; -: 900: int32_t cy[4], cl[4], cr[4]; -: 901: int8_t bufcnt; -: 902: int8_t finished; -: 903: int8_t leftmost; -: 904:} ellipse_state; -: 905: function ellipse_init called 2080 returned 100% blocks executed 100% 2080: 906:void ellipse_init(ellipse_state* s, int32_t a, int32_t b, int32_t w) { 2080: 907: s->bufcnt = 0; 2080: 908: s->leftmost = a % 2; 2080: 909: quarter_init(&s->st_o, a, b); call 0 returned 100% 2080: 910: if (w < 1 || quarter_next(&s->st_o, &s->pr, &s->py) == -1) { branch 0 taken 99% (fallthrough) branch 1 taken 1% call 2 returned 100% branch 3 taken 0% (fallthrough) branch 4 taken 100% 5: 911: s->finished = 1; -: 912: } else { 2075: 913: s->finished = 0; 2075: 914: quarter_init(&s->st_i, a - 2 * (w - 1), b - 2 * (w - 1)); call 0 returned 100% 2075: 915: s->pl = s->leftmost; -: 916: } 2080: 917:} -: 918: function ellipse_next called 79775 returned 100% blocks executed 100% 79775: 919:int8_t ellipse_next(ellipse_state* s, int32_t* ret_x0, int32_t* ret_y, int32_t* ret_x1) { 79775: 920: if (s->bufcnt == 0) { branch 0 taken 28% (fallthrough) branch 1 taken 72% 22446: 921: if (s->finished) { branch 0 taken 9% (fallthrough) branch 1 taken 91% 2078: 922: return -1; -: 923: } 20368: 924: int32_t y = s->py; 20368: 925: int32_t l = s->pl; 20368: 926: int32_t r = s->pr; 20368: 927: int32_t cx = 0, cy = 0; -: 928: int8_t next_ret; 20368: 929: while ((next_ret = quarter_next(&s->st_o, &cx, &cy)) != -1 && cy <= y) { call 0 returned 100% branch 1 taken 93% (fallthrough) branch 2 taken 7% branch 3 taken 33% (fallthrough) branch 4 taken 67% -: 930: } 20368: 931: if (next_ret == -1) { branch 0 taken 10% (fallthrough) branch 1 taken 90% 2073: 932: s->finished = 1; -: 933: } else { 18295: 934: s->pr = cx; 18295: 935: s->py = cy; -: 936: } 25483: 937: while ((next_ret = quarter_next(&s->st_i, &cx, &cy)) != -1 && cy <= y) { call 0 returned 100% branch 1 taken 52% (fallthrough) branch 2 taken 48% branch 3 taken 39% branch 4 taken 61% (fallthrough) 5115: 938: l = cx; -: 939: } 20368: 940: s->pl = next_ret == -1 ? s->leftmost : cx; branch 0 taken 60% (fallthrough) branch 1 taken 40% -: 941: 20368: 942: if ((l > 0 || l < r) && y > 0) { branch 0 taken 37% (fallthrough) branch 1 taken 63% branch 2 taken 90% (fallthrough) branch 3 taken 10% branch 4 taken 94% (fallthrough) branch 5 taken 6% 18496: 943: s->cl[s->bufcnt] = l == 0 ? 2 : l; branch 0 taken 65% (fallthrough) branch 1 taken 35% 18496: 944: s->cy[s->bufcnt] = y; 18496: 945: s->cr[s->bufcnt] = r; 18496: 946: ++s->bufcnt; -: 947: } 20368: 948: if (y > 0) { branch 0 taken 94% (fallthrough) branch 1 taken 6% 19239: 949: s->cl[s->bufcnt] = -r; 19239: 950: s->cy[s->bufcnt] = y; 19239: 951: s->cr[s->bufcnt] = -l; 19239: 952: ++s->bufcnt; -: 953: } 20368: 954: if (l > 0 || l < r) { branch 0 taken 37% (fallthrough) branch 1 taken 63% branch 2 taken 90% (fallthrough) branch 3 taken 10% 19594: 955: s->cl[s->bufcnt] = l == 0 ? 2 : l; branch 0 taken 65% (fallthrough) branch 1 taken 35% 19594: 956: s->cy[s->bufcnt] = -y; 19594: 957: s->cr[s->bufcnt] = r; 19594: 958: ++s->bufcnt; -: 959: } 20368: 960: s->cl[s->bufcnt] = -r; 20368: 961: s->cy[s->bufcnt] = -y; 20368: 962: s->cr[s->bufcnt] = -l; 20368: 963: ++s->bufcnt; -: 964: } 77697: 965: --s->bufcnt; 77697: 966: *ret_x0 = s->cl[s->bufcnt]; 77697: 967: *ret_y = s->cy[s->bufcnt]; 77697: 968: *ret_x1 = s->cr[s->bufcnt]; 77697: 969: return 0; -: 970:} -: 971: -: 972:// Clipping tree consists of half-plane clipping nodes and combining nodes. -: 973:// We can throw a horizontal segment in such a tree and collect an ordered set -: 974:// of resulting disjoint clipped segments organized into a sorted linked list -: 975:// of their end points. -: 976:typedef enum { -: 977: CT_AND, // intersection -: 978: CT_OR, // union -: 979: CT_CLIP // half-plane clipping -: 980:} clip_type; -: 981: -: 982:typedef struct clip_node { -: 983: clip_type type; -: 984: double a, b, c; // half-plane coeffs, only used in clipping nodes -: 985: struct clip_node* l; // child pointers, are only non-NULL in combining nodes -: 986: struct clip_node* r; -: 987:} clip_node; -: 988: -: 989:// Linked list for the ends of the clipped horizontal segments. -: 990:// Since the segment is always horizontal, we don't need to store Y coordinate. -: 991:typedef struct event_list { -: 992: int32_t x; -: 993: int8_t type; // used internally, 1 for the left end (smaller X), -1 for the -: 994: // right end; pointless in output since the output segments -: 995: // are disjoint, therefore the types would always come in pairs -: 996: // and interchange (1 -1 1 -1 ...) -: 997: struct event_list* next; -: 998:} event_list; -: 999: -: 1000:// Mirrors all the clipping nodes of the tree relative to the y = x line. function clip_tree_transpose called 14 returned 100% blocks executed 100% 14: 1001:void clip_tree_transpose(clip_node* root) { 26: 1002: if (root != NULL) { branch 0 taken 46% (fallthrough) branch 1 taken 54% 12: 1003: if (root->type == CT_CLIP) { branch 0 taken 58% (fallthrough) branch 1 taken 42% 7: 1004: double t = root->a; 7: 1005: root->a = root->b; 7: 1006: root->b = t; -: 1007: } 12: 1008: clip_tree_transpose(root->l); call 0 returned 100% 12: 1009: clip_tree_transpose(root->r); -: 1010: } 14: 1011:} -: 1012: -: 1013:// Outputs a sequence of open-close events (types -1 and 1) for -: 1014:// non-intersecting segments sorted by X coordinate. -: 1015:// Combining nodes (AND, OR) may also accept sequences for intersecting -: 1016:// segments, i.e. something like correct bracket sequences. function clip_tree_do_clip called 40224 returned 100% blocks executed 76% 40224: 1017:int clip_tree_do_clip(clip_node* root, int32_t x0, int32_t y, int32_t x1, event_list** ret) { 40224: 1018: if (root == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1019: event_list* start = malloc(sizeof(event_list)); #####: 1020: if (!start) { branch 0 never executed branch 1 never executed #####: 1021: ImagingError_MemoryError(); call 0 never executed #####: 1022: return -1; -: 1023: } #####: 1024: event_list* end = malloc(sizeof(event_list)); #####: 1025: if (!end) { branch 0 never executed branch 1 never executed #####: 1026: free(start); #####: 1027: ImagingError_MemoryError(); call 0 never executed #####: 1028: return -1; -: 1029: } #####: 1030: start->x = x0; #####: 1031: start->type = 1; #####: 1032: start->next = end; #####: 1033: end->x = x1; #####: 1034: end->type = -1; #####: 1035: end->next = NULL; #####: 1036: *ret = start; #####: 1037: return 0; -: 1038: } 40224: 1039: if (root->type == CT_CLIP) { branch 0 taken 66% (fallthrough) branch 1 taken 34% 26452: 1040: double eps = 1e-9; 26452: 1041: double A = root->a; 26452: 1042: double B = root->b; 26452: 1043: double C = root->c; 26452: 1044: if (fabs(A) < eps) { branch 0 taken 19% (fallthrough) branch 1 taken 81% 5154: 1045: if (B * y + C < -eps) { branch 0 taken 49% (fallthrough) branch 1 taken 51% 2518: 1046: x0 = 1; 2518: 1047: x1 = 0; -: 1048: } -: 1049: } else { -: 1050: // X of intersection 21298: 1051: double ix = - (B * y + C) / A; 21298: 1052: if (A * x0 + B * y + C < eps) { branch 0 taken 52% (fallthrough) branch 1 taken 48% 11086: 1053: x0 = lround(fmax(x0, ix)); -: 1054: } 21298: 1055: if (A * x1 + B * y + C < eps) { branch 0 taken 53% (fallthrough) branch 1 taken 47% 11318: 1056: x1 = lround(fmin(x1, ix)); -: 1057: } -: 1058: } 26452: 1059: if (x0 <= x1) { branch 0 taken 59% (fallthrough) branch 1 taken 41% 15530: 1060: event_list* start = malloc(sizeof(event_list)); 15530: 1061: if (!start) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1062: ImagingError_MemoryError(); call 0 never executed #####: 1063: return -1; -: 1064: } 15530: 1065: event_list* end = malloc(sizeof(event_list)); 15530: 1066: if (!end) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1067: free(start); #####: 1068: ImagingError_MemoryError(); call 0 never executed #####: 1069: return -1; -: 1070: } 15530: 1071: start->x = x0; 15530: 1072: start->type = 1; 15530: 1073: start->next = end; 15530: 1074: end->x = x1; 15530: 1075: end->type = -1; 15530: 1076: end->next = NULL; 15530: 1077: *ret = start; -: 1078: } else { 10922: 1079: *ret = NULL; -: 1080: } -: 1081: return 0; -: 1082: } 13772: 1083: if (root->type == CT_OR || root->type == CT_AND) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1084: event_list* l1; -: 1085: event_list* l2; 13772: 1086: if (clip_tree_do_clip(root->l, x0, y, x1, &l1) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1087: return -1; -: 1088: } 13772: 1089: if (clip_tree_do_clip(root->r, x0, y, x1, &l2) < 0) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1090: while (l1) { branch 0 never executed branch 1 never executed #####: 1091: l2 = l1->next; #####: 1092: free(l1); #####: 1093: l1 = l2; -: 1094: } -: 1095: return -1; -: 1096: } 13772: 1097: *ret = NULL; 13772: 1098: event_list* tail = NULL; 13772: 1099: int32_t k1 = 0; 13772: 1100: int32_t k2 = 0; 59014: 1101: while (l1 != NULL || l2 != NULL) { branch 0 taken 53% branch 1 taken 47% (fallthrough) branch 2 taken 36% branch 3 taken 64% (fallthrough) -: 1102: event_list* t; 31470: 1103: if (l2 == NULL || (l1 != NULL && (l1->x < l2->x || (l1->x == l2->x && l1->type > l2->type)))) { branch 0 taken 66% (fallthrough) branch 1 taken 34% branch 2 taken 64% (fallthrough) branch 3 taken 36% branch 4 taken 69% (fallthrough) branch 5 taken 31% branch 6 taken 77% (fallthrough) branch 7 taken 23% branch 8 taken 11% (fallthrough) branch 9 taken 89% 15540: 1104: t = l1; 15540: 1105: k1 += t->type; -: 1106: assert(k1 >= 0); 15540: 1107: l1 = l1->next; -: 1108: } else { 15930: 1109: t = l2; 15930: 1110: k2 += t->type; -: 1111: assert(k2 >= 0); 15930: 1112: l2 = l2->next; -: 1113: } 31470: 1114: t->next = NULL; 36620: 1115: if ((root->type == CT_OR && ( branch 0 taken 16% (fallthrough) branch 1 taken 84% branch 2 taken 50% (fallthrough) branch 3 taken 50% 7725: 1116: (t->type == 1 && (tail == NULL || tail->type == -1)) || branch 0 taken 23% (fallthrough) branch 1 taken 77% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 81% (fallthrough) branch 5 taken 19% 2575: 1117: (t->type == -1 && k1 == 0 && k2 == 0) branch 0 taken 23% (fallthrough) branch 1 taken 77% 27522: 1118: )) || branch 0 taken 96% (fallthrough) branch 1 taken 4% 26320: 1119: (root->type == CT_AND && ( branch 0 taken 50% (fallthrough) branch 1 taken 50% 39480: 1120: (t->type == 1 && (tail == NULL || tail->type == -1) && k1 > 0 && k2 > 0) || branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed branch 4 taken 53% (fallthrough) branch 5 taken 47% branch 6 taken 46% (fallthrough) branch 7 taken 54% branch 8 taken 58% (fallthrough) branch 9 taken 42% 13160: 1121: (t->type == -1 && tail != NULL && tail->type == 1 && (k1 == 0 || k2 == 0)) branch 0 taken 57% (fallthrough) branch 1 taken 43% branch 2 taken 50% (fallthrough) branch 3 taken 50% branch 4 taken 87% (fallthrough) branch 5 taken 13% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 1122: ))) { 11482: 1123: if (tail == NULL) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 5741: 1124: *ret = t; -: 1125: } else { 5741: 1126: tail->next = t; -: 1127: } -: 1128: tail = t; -: 1129: } else { 19988: 1130: free(t); -: 1131: } -: 1132: } -: 1133: return 0; -: 1134: } #####: 1135: *ret = NULL; #####: 1136: return 0; -: 1137:} -: 1138: -: 1139:// One more layer of processing on top of the regular ellipse. -: 1140:// Uses the clipping tree. -: 1141:// Used for producing ellipse derivatives such as arc, chord, pie, etc. -: 1142:typedef struct { -: 1143: ellipse_state st; -: 1144: clip_node* root; -: 1145: clip_node nodes[7]; -: 1146: int32_t node_count; -: 1147: event_list* head; -: 1148: int32_t y; -: 1149:} clip_ellipse_state; -: 1150: -: 1151:typedef void (*clip_ellipse_init)(clip_ellipse_state*, int32_t, int32_t, int32_t, float, float); -: 1152: function debug_clip_tree called 0 returned 0% blocks executed 0% #####: 1153:void debug_clip_tree(clip_node* root, int space) { #####: 1154: if (root == NULL) { branch 0 never executed branch 1 never executed -: 1155: return; -: 1156: } #####: 1157: if (root->type == CT_CLIP) { branch 0 never executed branch 1 never executed -: 1158: int t = space; #####: 1159: while (t--) { branch 0 never executed branch 1 never executed #####: 1160: fputc(' ', stderr); call 0 never executed -: 1161: } #####: 1162: fprintf(stderr, "clip %+fx%+fy%+f > 0\n", root->a, root->b, root->c); -: 1163: } else { #####: 1164: debug_clip_tree(root->l, space + 2); #####: 1165: int t = space; call 0 never executed #####: 1166: while (t--) { branch 0 never executed branch 1 never executed #####: 1167: fputc(' ', stderr); call 0 never executed -: 1168: } #####: 1169: fprintf(stderr, "%s\n", root->type == CT_AND ? "and" : "or"); branch 0 never executed branch 1 never executed #####: 1170: debug_clip_tree(root->r, space + 2); call 0 never executed -: 1171: } #####: 1172: if (space == 0) { branch 0 never executed branch 1 never executed #####: 1173: fputc('\n', stderr); call 0 never executed -: 1174: } -: 1175:} -: 1176: -: 1177:// Resulting angles will satisfy 0 <= al < 360, al <= ar <= al + 360 function normalize_angles called 96 returned 100% blocks executed 100% 96: 1178:void normalize_angles(float* al, float* ar) { 96: 1179: if (*ar - *al >= 360) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 1180: *al = 0; 1: 1181: *ar = 360; -: 1182: } else { 95: 1183: *al = fmod(*al < 0 ? 360 - (fmod(-*al, 360)) : *al, 360); branch 0 taken 20% (fallthrough) branch 1 taken 80% 95: 1184: *ar = *al + fmod(*ar < *al ? 360 - fmod(*al - *ar, 360) : *ar - *al, 360); branch 0 taken 39% (fallthrough) branch 1 taken 61% -: 1185: } 96: 1186:} -: 1187: -: 1188:// An arc with caps orthogonal to the ellipse curve. function arc_init called 13 returned 100% blocks executed 95% 13: 1189:void arc_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float ar) { 13: 1190: if (a < b) { branch 0 taken 15% (fallthrough) branch 1 taken 85% -: 1191: // transpose the coordinate system 2: 1192: arc_init(s, b, a, w, 90 - ar, 90 - al); call 0 returned 100% 2: 1193: ellipse_init(&s->st, a, b, w); call 0 returned 100% 2: 1194: clip_tree_transpose(s->root); call 0 returned 100% -: 1195: } else { -: 1196: // a >= b, based on "wide" ellipse 11: 1197: ellipse_init(&s->st, a, b, w); call 0 returned 100% -: 1198: 11: 1199: s->head = NULL; 11: 1200: s->node_count = 0; 11: 1201: normalize_angles(&al, &ar); call 0 returned 100% -: 1202: -: 1203: // building clipping tree, a lot of different cases 11: 1204: if (ar == al + 360) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1205: s->root = NULL; -: 1206: } else { 11: 1207: clip_node* lc = s->nodes + s->node_count++; 11: 1208: clip_node* rc = s->nodes + s->node_count++; 11: 1209: lc->l = lc->r = rc->l = rc->r = NULL; 11: 1210: lc->type = rc->type = CT_CLIP; 11: 1211: lc->a = -a * sin(al * M_PI / 180.0); 11: 1212: lc->b = b * cos(al * M_PI / 180.0); 11: 1213: lc->c = (a * a - b * b) * sin(al * M_PI / 90.0) / 2.0; 11: 1214: rc->a = a * sin(ar * M_PI / 180.0); 11: 1215: rc->b = -b * cos(ar * M_PI / 180.0); 11: 1216: rc->c = (b * b - a * a) * sin(ar * M_PI / 90.0) / 2.0; 11: 1217: if (fmod(al, 180) == 0 || fmod(ar, 180) == 0) { branch 0 taken 82% (fallthrough) branch 1 taken 18% branch 2 taken 11% (fallthrough) branch 3 taken 89% 3: 1218: s->root = s->nodes + s->node_count++; 3: 1219: s->root->l = lc; 3: 1220: s->root->r = rc; 3: 1221: s->root->type = ar - al < 180 ? CT_AND : CT_OR; 8: 1222: } else if (((int)(al / 180) + (int)(ar / 180)) % 2 == 1) { branch 0 taken 88% (fallthrough) branch 1 taken 13% 7: 1223: s->root = s->nodes + s->node_count++; 7: 1224: s->root->l = s->nodes + s->node_count++; 7: 1225: s->root->l->l = s->nodes + s->node_count++; 7: 1226: s->root->l->r = lc; 7: 1227: s->root->r = s->nodes + s->node_count++; 7: 1228: s->root->r->l = s->nodes + s->node_count++; 7: 1229: s->root->r->r = rc; 7: 1230: s->root->type = CT_OR; 7: 1231: s->root->l->type = CT_AND; 7: 1232: s->root->r->type = CT_AND; 7: 1233: s->root->l->l->type = CT_CLIP; 7: 1234: s->root->r->l->type = CT_CLIP; 7: 1235: s->root->l->l->l = s->root->l->l->r = NULL; 7: 1236: s->root->r->l->l = s->root->r->l->r = NULL; 7: 1237: s->root->l->l->a = s->root->l->l->c = 0; 7: 1238: s->root->r->l->a = s->root->r->l->c = 0; 7: 1239: s->root->l->l->b = (int)(al / 180) % 2 == 0 ? 1 : -1; branch 0 taken 14% (fallthrough) branch 1 taken 86% 7: 1240: s->root->r->l->b = (int)(ar / 180) % 2 == 0 ? 1 : -1; branch 0 taken 86% (fallthrough) branch 1 taken 14% -: 1241: } else { 1: 1242: s->root = s->nodes + s->node_count++; 1: 1243: s->root->l = s->nodes + s->node_count++; 1: 1244: s->root->r = s->nodes + s->node_count++; 1: 1245: s->root->type = s->root->l->type = ar - al < 180 ? CT_AND : CT_OR; 1: 1246: s->root->l->l = lc; 1: 1247: s->root->l->r = rc; 1: 1248: s->root->r->type = CT_CLIP; 1: 1249: s->root->r->l = s->root->r->r = NULL; 1: 1250: s->root->r->a = s->root->r->c = 0; 1: 1251: s->root->r->b = ar < 180 || ar > 540 ? 1 : -1; branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 1252: } -: 1253: } -: 1254: } 13: 1255:} -: 1256: -: 1257:// A chord line. function chord_line_init called 7 returned 100% blocks executed 100% 7: 1258:void chord_line_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float ar) { 7: 1259: ellipse_init(&s->st, a, b, a + b + 1); call 0 returned 100% -: 1260: 7: 1261: s->head = NULL; 7: 1262: s->node_count = 0; -: 1263: -: 1264: // line equation for chord 7: 1265: double xl = a * cos(al * M_PI / 180.0), xr = a * cos(ar * M_PI / 180.0); 7: 1266: double yl = b * sin(al * M_PI / 180.0), yr = b * sin(ar * M_PI / 180.0); 7: 1267: s->root = s->nodes + s->node_count++; 7: 1268: s->root->l = s->nodes + s->node_count++; 7: 1269: s->root->r = s->nodes + s->node_count++; 7: 1270: s->root->type = CT_AND; 7: 1271: s->root->l->type = s->root->r->type = CT_CLIP; 7: 1272: s->root->l->l = s->root->l->r = s->root->r->l = s->root->r->r = NULL; 7: 1273: s->root->l->a = yr - yl; 7: 1274: s->root->l->b = xl - xr; 7: 1275: s->root->l->c = -(s->root->l->a * xl + s->root->l->b * yl); 7: 1276: s->root->r->a = -s->root->l->a; 7: 1277: s->root->r->b = -s->root->l->b; 7: 1278: s->root->r->c = 2 * w * sqrt(pow(s->root->l->a, 2.0) + pow(s->root->l->b, 2.0)) - s->root->l->c; 7: 1279:} -: 1280: -: 1281:// Pie side. function pie_side_init called 14 returned 100% blocks executed 100% 14: 1282:void pie_side_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float _) { 14: 1283: ellipse_init(&s->st, a, b, a + b + 1); call 0 returned 100% -: 1284: 14: 1285: s->head = NULL; 14: 1286: s->node_count = 0; -: 1287: 14: 1288: double xl = a * cos(al * M_PI / 180.0); 14: 1289: double yl = b * sin(al * M_PI / 180.0); 14: 1290: double a1 = -yl; 14: 1291: double b1 = xl; 14: 1292: double c1 = w * sqrt(a1 * a1 + b1 * b1); -: 1293: 14: 1294: s->root = s->nodes + s->node_count++; 14: 1295: s->root->type = CT_AND; 14: 1296: s->root->l = s->nodes + s->node_count++; 14: 1297: s->root->l->type = CT_AND; -: 1298: -: 1299: clip_node* cnode; 14: 1300: cnode = s->nodes + s->node_count++; 14: 1301: cnode->l = cnode->r = NULL; 14: 1302: cnode->type = CT_CLIP; 14: 1303: cnode->a = a1; 14: 1304: cnode->b = b1; 14: 1305: cnode->c = c1; 14: 1306: s->root->l->l = cnode; 14: 1307: cnode = s->nodes + s->node_count++; 14: 1308: cnode->l = cnode->r = NULL; 14: 1309: cnode->type = CT_CLIP; 14: 1310: cnode->a = -a1; 14: 1311: cnode->b = -b1; 14: 1312: cnode->c = c1; 14: 1313: s->root->l->r = cnode; 14: 1314: cnode = s->nodes + s->node_count++; 14: 1315: cnode->l = cnode->r = NULL; 14: 1316: cnode->type = CT_CLIP; 14: 1317: cnode->a = b1; 14: 1318: cnode->b = -a1; 14: 1319: cnode->c = 0; 14: 1320: s->root->r = cnode; 14: 1321:} -: 1322: -: 1323:// A chord. function chord_init called 20 returned 100% blocks executed 100% 20: 1324:void chord_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float ar) { 20: 1325: ellipse_init(&s->st, a, b, w); call 0 returned 100% -: 1326: 20: 1327: s->head = NULL; 20: 1328: s->node_count = 0; -: 1329: -: 1330: // line equation for chord 20: 1331: double xl = a * cos(al * M_PI / 180.0), xr = a * cos(ar * M_PI / 180.0); 20: 1332: double yl = b * sin(al * M_PI / 180.0), yr = b * sin(ar * M_PI / 180.0); 20: 1333: s->root = s->nodes + s->node_count++; 20: 1334: s->root->l = s->root->r = NULL; 20: 1335: s->root->type = CT_CLIP; 20: 1336: s->root->a = yr - yl; 20: 1337: s->root->b = xl - xr; 20: 1338: s->root->c = -(s->root->a * xl + s->root->b * yl); 20: 1339:} -: 1340: -: 1341:// A pie. Can also be used to draw an arc with ugly sharp caps. function pie_init called 53 returned 100% blocks executed 100% 53: 1342:void pie_init(clip_ellipse_state* s, int32_t a, int32_t b, int32_t w, float al, float ar) { 53: 1343: ellipse_init(&s->st, a, b, w); call 0 returned 100% -: 1344: 53: 1345: s->head = NULL; 53: 1346: s->node_count = 0; -: 1347: -: 1348: // line equations for pie sides 53: 1349: double xl = a * cos(al * M_PI / 180.0), xr = a * cos(ar * M_PI / 180.0); 53: 1350: double yl = b * sin(al * M_PI / 180.0), yr = b * sin(ar * M_PI / 180.0); -: 1351: 53: 1352: clip_node* lc = s->nodes + s->node_count++; 53: 1353: clip_node* rc = s->nodes + s->node_count++; 53: 1354: lc->l = lc->r = rc->l = rc->r = NULL; 53: 1355: lc->type = rc->type = CT_CLIP; 53: 1356: lc->a = -yl; 53: 1357: lc->b = xl; 53: 1358: lc->c = 0; 53: 1359: rc->a = yr; 53: 1360: rc->b = -xr; 53: 1361: rc->c = 0; -: 1362: 53: 1363: s->root = s->nodes + s->node_count++; 53: 1364: s->root->l = lc; 53: 1365: s->root->r = rc; 53: 1366: s->root->type = ar - al < 180 ? CT_AND : CT_OR; 53: 1367:} -: 1368: function clip_ellipse_free called 105 returned 100% blocks executed 75% 105: 1369:void clip_ellipse_free(clip_ellipse_state* s) { 210: 1370: while (s->head != NULL) { branch 0 taken 0% branch 1 taken 100% (fallthrough) #####: 1371: event_list* t = s->head; #####: 1372: s->head = s->head->next; #####: 1373: free(t); -: 1374: } 105: 1375:} -: 1376: function clip_ellipse_next called 5641 returned 100% blocks executed 100% 5641: 1377:int8_t clip_ellipse_next(clip_ellipse_state* s, int32_t* ret_x0, int32_t* ret_y, int32_t* ret_x1) { -: 1378: int32_t x0, y, x1; 23962: 1379: while (s->head == NULL && ellipse_next(&s->st, &x0, &y, &x1) >= 0) { branch 0 taken 70% (fallthrough) branch 1 taken 30% call 2 returned 100% branch 3 taken 99% branch 4 taken 1% (fallthrough) 12680: 1380: if (clip_tree_do_clip(s->root, x0, y, x1, &s->head) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1381: return -2; -: 1382: } 12680: 1383: s->y = y; -: 1384: } 5641: 1385: if (s->head != NULL) { branch 0 taken 98% (fallthrough) branch 1 taken 2% 5536: 1386: *ret_y = s->y; 5536: 1387: event_list* t = s->head; 5536: 1388: s->head = s->head->next; 5536: 1389: *ret_x0 = t->x; 5536: 1390: free(t); 5536: 1391: t = s->head; -: 1392: assert(t != NULL); 5536: 1393: s->head = s->head->next; 5536: 1394: *ret_x1 = t->x; 5536: 1395: free(t); 5536: 1396: return 0; -: 1397: } -: 1398: return -1; -: 1399:} -: 1400: -: 1401:static int function ellipseNew called 2099 returned 100% blocks executed 100% 2099: 1402:ellipseNew(Imaging im, int x0, int y0, int x1, int y1, -: 1403: const void* ink_, int fill, -: 1404: int width, int op) -: 1405:{ -: 1406: DRAW* draw; -: 1407: INT32 ink; 2099: 1408: DRAWINIT(); branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 99% (fallthrough) branch 3 taken 1% -: 1409: 2099: 1410: int a = x1 - x0; 2099: 1411: int b = y1 - y0; 2099: 1412: if (a < 0 || b < 0) { branch 0 taken 97% (fallthrough) branch 1 taken 3% branch 2 taken 97% (fallthrough) branch 3 taken 3% -: 1413: return 0; -: 1414: } 1973: 1415: if (fill) { branch 0 taken 51% (fallthrough) branch 1 taken 49% 999: 1416: width = a + b; -: 1417: } -: 1418: -: 1419: ellipse_state st; 1973: 1420: ellipse_init(&st, a, b, width); call 0 returned 100% -: 1421: int32_t X0, Y, X1; 68963: 1422: while (ellipse_next(&st, &X0, &Y, &X1) != -1) { call 0 returned 100% branch 1 taken 97% branch 2 taken 3% (fallthrough) 65017: 1423: draw->hline(im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink); call 0 returned 100% -: 1424: } -: 1425: return 0; -: 1426:} -: 1427: -: 1428:static int function clipEllipseNew called 105 returned 100% blocks executed 94% 105: 1429:clipEllipseNew(Imaging im, int x0, int y0, int x1, int y1, -: 1430: float start, float end, -: 1431: const void* ink_, int width, int op, clip_ellipse_init init) -: 1432:{ -: 1433: DRAW* draw; -: 1434: INT32 ink; 105: 1435: DRAWINIT(); branch 0 taken 11% (fallthrough) branch 1 taken 89% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 1436: 105: 1437: int a = x1 - x0; 105: 1438: int b = y1 - y0; 105: 1439: if (a < 0 || b < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 1440: return 0; -: 1441: } -: 1442: -: 1443: clip_ellipse_state st; 105: 1444: init(&st, a, b, width, start, end); call 0 returned 100% -: 1445: // debug_clip_tree(st.root, 0); -: 1446: int32_t X0, Y, X1; -: 1447: int next_code; 5746: 1448: while ((next_code = clip_ellipse_next(&st, &X0, &Y, &X1)) >= 0) { call 0 returned 100% branch 1 taken 98% branch 2 taken 2% (fallthrough) 5536: 1449: draw->hline(im, x0 + (X0 + a) / 2, y0 + (Y + b) / 2, x0 + (X1 + a) / 2, ink); call 0 returned 100% -: 1450: } 105: 1451: clip_ellipse_free(&st); call 0 returned 100% 105: 1452: return next_code == -1 ? 0 : -1; branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 1453:} -: 1454:static int -: 1455:arcNew(Imaging im, int x0, int y0, int x1, int y1, -: 1456: float start, float end, -: 1457: const void* ink_, int width, int op) -: 1458:{ 11: 1459: return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, arc_init); -: 1460:} -: 1461: -: 1462:static int -: 1463:chordNew(Imaging im, int x0, int y0, int x1, int y1, -: 1464: float start, float end, -: 1465: const void* ink_, int width, int op) -: 1466:{ 20: 1467: return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, chord_init); -: 1468:} -: 1469: -: 1470:static int -: 1471:chordLineNew(Imaging im, int x0, int y0, int x1, int y1, -: 1472: float start, float end, -: 1473: const void* ink_, int width, int op) -: 1474:{ 7: 1475: return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, chord_line_init); call 0 returned 100% -: 1476:} -: 1477: -: 1478:static int -: 1479:pieNew(Imaging im, int x0, int y0, int x1, int y1, -: 1480: float start, float end, -: 1481: const void* ink_, int width, int op) -: 1482:{ 53: 1483: return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, pie_init); -: 1484:} -: 1485: -: 1486:static int -: 1487:pieSideNew(Imaging im, int x0, int y0, int x1, int y1, -: 1488: float start, -: 1489: const void* ink_, int width, int op) -: 1490:{ 14: 1491: return clipEllipseNew(im, x0, y0, x1, y1, start, 0, ink_, width, op, pie_side_init); call 0 returned 100% call 1 returned 100% -: 1492:} -: 1493: -: 1494:int function ImagingDrawEllipse called 2092 returned 100% blocks executed 100% 2092: 1495:ImagingDrawEllipse(Imaging im, int x0, int y0, int x1, int y1, -: 1496: const void* ink, int fill, int width, int op) -: 1497:{ 2092: 1498: return ellipseNew(im, x0, y0, x1, y1, ink, fill, width, op); call 0 returned 100% -: 1499:} -: 1500: -: 1501:int function ImagingDrawArc called 12 returned 100% blocks executed 100% 12: 1502:ImagingDrawArc(Imaging im, int x0, int y0, int x1, int y1, -: 1503: float start, float end, const void* ink, int width, int op) -: 1504:{ 12: 1505: normalize_angles(&start, &end); call 0 returned 100% 12: 1506: if (start + 360 == end) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 1: 1507: return ImagingDrawEllipse(im, x0, y0, x1, y1, ink, 0, width, op); call 0 returned 100% -: 1508: } 11: 1509: if (start == end) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1510: return 0; -: 1511: } 22: 1512: return arcNew(im, x0, y0, x1, y1, start, end, ink, width, op); call 0 returned 100% -: 1513:} -: 1514: -: 1515: -: 1516:int function ImagingDrawChord called 20 returned 100% blocks executed 92% 20: 1517:ImagingDrawChord(Imaging im, int x0, int y0, int x1, int y1, -: 1518: float start, float end, const void* ink, int fill, -: 1519: int width, int op) -: 1520:{ 20: 1521: normalize_angles(&start, &end); call 0 returned 100% 20: 1522: if (start + 360 == end) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1523: return ImagingDrawEllipse(im, x0, y0, x1, y1, ink, fill, width, op); call 0 never executed -: 1524: } 20: 1525: if (start == end) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1526: return 0; -: 1527: } 20: 1528: if (fill) { branch 0 taken 65% (fallthrough) branch 1 taken 35% 26: 1529: return chordNew(im, x0, y0, x1, y1, start, end, ink, x1 - x0 + y1 - y0 + 1, op); call 0 returned 100% -: 1530: } else { 14: 1531: if (chordLineNew(im, x0, y0, x1, y1, start, end, ink, width, op)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1532: return -1; -: 1533: } 14: 1534: return chordNew(im, x0, y0, x1, y1, start, end, ink, width, op); call 0 returned 100% -: 1535: } -: 1536:} -: 1537: -: 1538: -: 1539:int function ImagingDrawPieslice called 53 returned 100% blocks executed 93% 53: 1540:ImagingDrawPieslice(Imaging im, int x0, int y0, int x1, int y1, -: 1541: float start, float end, const void* ink, int fill, -: 1542: int width, int op) -: 1543:{ 53: 1544: normalize_angles(&start, &end); call 0 returned 100% 53: 1545: if (start + 360 == end) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1546: return ellipseNew(im, x0, y0, x1, y1, ink, fill, width, op); call 0 never executed -: 1547: } 53: 1548: if (start == end) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1549: return 0; -: 1550: } 53: 1551: if (fill) { branch 0 taken 87% (fallthrough) branch 1 taken 13% 92: 1552: return pieNew(im, x0, y0, x1, y1, start, end, ink, x1 + y1 - x0 - y0, op); call 0 returned 100% -: 1553: } else { 14: 1554: if (pieSideNew(im, x0, y0, x1, y1, start, ink, width, op)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1555: return -1; -: 1556: } 14: 1557: if (pieSideNew(im, x0, y0, x1, y1, end, ink, width, op)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1558: return -1; -: 1559: } 7: 1560: int xc = lround((x0 + x1 - width) / 2.0), yc = lround((y0 + y1 - width) / 2.0); 7: 1561: ellipseNew(im, xc, yc, xc + width - 1, yc + width - 1, ink, 1, 0, op); call 0 returned 100% 14: 1562: return pieNew(im, x0, y0, x1, y1, start, end, ink, width, op); call 0 returned 100% -: 1563: } -: 1564:} -: 1565: -: 1566: -: 1567:/* -------------------------------------------------------------------- */ -: 1568: -: 1569:/* experimental level 2 ("arrow") graphics stuff. this implements -: 1570: portions of the arrow api on top of the Edge structure. the -: 1571: semantics are ok, except that "curve" flattens the bezier curves by -: 1572: itself */ -: 1573: -: 1574:struct ImagingOutlineInstance { -: 1575: -: 1576: float x0, y0; -: 1577: -: 1578: float x, y; -: 1579: -: 1580: int count; -: 1581: Edge *edges; -: 1582: -: 1583: int size; -: 1584: -: 1585:}; -: 1586: -: 1587: -: 1588:ImagingOutline function ImagingOutlineNew called 3 returned 100% blocks executed 80% 3: 1589:ImagingOutlineNew(void) -: 1590:{ -: 1591: ImagingOutline outline; -: 1592: 3: 1593: outline = calloc(1, sizeof(struct ImagingOutlineInstance)); 3: 1594: if (!outline) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1595: return (ImagingOutline) ImagingError_MemoryError(); call 0 never executed -: 1596: } -: 1597: 3: 1598: outline->edges = NULL; 3: 1599: outline->count = outline->size = 0; -: 1600: 3: 1601: ImagingOutlineMove(outline, 0, 0); call 0 returned 100% -: 1602: 3: 1603: return outline; -: 1604:} -: 1605: -: 1606:void function ImagingOutlineDelete called 3 returned 100% blocks executed 100% 3: 1607:ImagingOutlineDelete(ImagingOutline outline) -: 1608:{ 3: 1609: if (!outline) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1610: return; -: 1611: } -: 1612: 3: 1613: if (outline->edges) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 3: 1614: free(outline->edges); -: 1615: } -: 1616: 3: 1617: free(outline); -: 1618:} -: 1619: -: 1620: -: 1621:static Edge* function allocate called 6 returned 100% blocks executed 78% 6: 1622:allocate(ImagingOutline outline, int extra) -: 1623:{ -: 1624: Edge* e; -: 1625: 6: 1626: if (outline->count + extra > outline->size) { branch 0 taken 50% (fallthrough) branch 1 taken 50% -: 1627: /* expand outline buffer */ 3: 1628: outline->size += extra + 25; 3: 1629: if (!outline->edges) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1630: /* malloc check ok, uses calloc for overflow */ 3: 1631: e = calloc(outline->size, sizeof(Edge)); -: 1632: } else { #####: 1633: if (outline->size > INT_MAX / sizeof(Edge)) { branch 0 never executed branch 1 never executed -: 1634: return NULL; -: 1635: } -: 1636: /* malloc check ok, overflow checked above */ #####: 1637: e = realloc(outline->edges, outline->size * sizeof(Edge)); -: 1638: } 3: 1639: if (!e) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1640: return NULL; -: 1641: } 3: 1642: outline->edges = e; -: 1643: } -: 1644: 6: 1645: e = outline->edges + outline->count; -: 1646: 6: 1647: outline->count += extra; -: 1648: 6: 1649: return e; -: 1650:} -: 1651: -: 1652:int function ImagingOutlineMove called 6 returned 100% blocks executed 100% 6: 1653:ImagingOutlineMove(ImagingOutline outline, float x0, float y0) -: 1654:{ 6: 1655: outline->x = outline->x0 = x0; 6: 1656: outline->y = outline->y0 = y0; -: 1657: 6: 1658: return 0; -: 1659:} -: 1660: -: 1661:int function ImagingOutlineLine called 3 returned 100% blocks executed 100% 3: 1662:ImagingOutlineLine(ImagingOutline outline, float x1, float y1) -: 1663:{ -: 1664: Edge* e; -: 1665: 3: 1666: e = allocate(outline, 1); call 0 returned 100% 3: 1667: if (!e) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1668: return -1; /* out of memory */ -: 1669: } -: 1670: 3: 1671: add_edge(e, (int) outline->x, (int) outline->y, (int) x1, (int) y1); call 0 returned 100% -: 1672: 3: 1673: outline->x = x1; 3: 1674: outline->y = y1; -: 1675: 3: 1676: return 0; -: 1677:} -: 1678: -: 1679:int function ImagingOutlineCurve called 3 returned 100% blocks executed 100% 3: 1680:ImagingOutlineCurve(ImagingOutline outline, float x1, float y1, -: 1681: float x2, float y2, float x3, float y3) -: 1682:{ -: 1683: Edge* e; -: 1684: int i; -: 1685: float xo, yo; -: 1686: -: 1687:#define STEPS 32 -: 1688: 3: 1689: e = allocate(outline, STEPS); call 0 returned 100% 3: 1690: if (!e) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1691: return -1; /* out of memory */ -: 1692: } -: 1693: 3: 1694: xo = outline->x; 3: 1695: yo = outline->y; -: 1696: -: 1697: /* flatten the bezier segment */ -: 1698: 99: 1699: for (i = 1; i <= STEPS; i++) { branch 0 taken 97% branch 1 taken 3% (fallthrough) -: 1700: 96: 1701: float t = ((float) i) / STEPS; 96: 1702: float t2 = t*t; 96: 1703: float t3 = t2*t; -: 1704: 96: 1705: float u = 1.0F - t; 96: 1706: float u2 = u*u; 96: 1707: float u3 = u2*u; -: 1708: 96: 1709: float x = outline->x*u3 + 3*(x1*t*u2 + x2*t2*u) + x3*t3 + 0.5; 96: 1710: float y = outline->y*u3 + 3*(y1*t*u2 + y2*t2*u) + y3*t3 + 0.5; -: 1711: 96: 1712: add_edge(e++, xo, yo, (int) x, (int) y); call 0 returned 100% -: 1713: 96: 1714: xo = x, yo = y; -: 1715: -: 1716: } -: 1717: 3: 1718: outline->x = xo; 3: 1719: outline->y = yo; -: 1720: 3: 1721: return 0; -: 1722:} -: 1723: -: 1724:int function ImagingOutlineClose called 8 returned 100% blocks executed 75% 8: 1725:ImagingOutlineClose(ImagingOutline outline) -: 1726:{ 8: 1727: if (outline->x == outline->x0 && outline->y == outline->y0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 1728: return 0; -: 1729: } #####: 1730: return ImagingOutlineLine(outline, outline->x0, outline->y0); call 0 never executed -: 1731:} -: 1732: -: 1733:int function ImagingOutlineTransform called 0 returned 0% blocks executed 0% #####: 1734:ImagingOutlineTransform(ImagingOutline outline, double a[6]) -: 1735:{ -: 1736: Edge *eIn; -: 1737: Edge *eOut; -: 1738: int i, n; -: 1739: int x0, y0, x1, y1; -: 1740: int X0, Y0, X1, Y1; -: 1741: #####: 1742: double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; #####: 1743: double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; -: 1744: #####: 1745: eIn = outline->edges; #####: 1746: n = outline->count; -: 1747: -: 1748: /* FIXME: ugly! */ #####: 1749: outline->edges = NULL; #####: 1750: outline->count = outline->size = 0; -: 1751: #####: 1752: eOut = allocate(outline, n); call 0 never executed #####: 1753: if (!eOut) { branch 0 never executed branch 1 never executed #####: 1754: outline->edges = eIn; #####: 1755: outline->count = outline->size = n; #####: 1756: ImagingError_MemoryError(); call 0 never executed #####: 1757: return -1; -: 1758: } -: 1759: #####: 1760: for (i = 0; i < n; i++) { branch 0 never executed branch 1 never executed -: 1761: #####: 1762: x0 = eIn->x0; #####: 1763: y0 = eIn->y0; -: 1764: -: 1765: /* FIXME: ouch! */ #####: 1766: if (eIn->x0 == eIn->xmin) { branch 0 never executed branch 1 never executed #####: 1767: x1 = eIn->xmax; -: 1768: } else { -: 1769: x1 = eIn->xmin; -: 1770: } #####: 1771: if (eIn->y0 == eIn->ymin) { branch 0 never executed branch 1 never executed #####: 1772: y1 = eIn->ymax; -: 1773: } else { -: 1774: y1 = eIn->ymin; -: 1775: } -: 1776: -: 1777: /* full moon tonight! if this doesn't work, you may need to -: 1778: upgrade your compiler (make sure you have the right service -: 1779: pack) */ -: 1780: #####: 1781: X0 = (int) (a0*x0 + a1*y0 + a2); #####: 1782: Y0 = (int) (a3*x0 + a4*y0 + a5); #####: 1783: X1 = (int) (a0*x1 + a1*y1 + a2); #####: 1784: Y1 = (int) (a3*x1 + a4*y1 + a5); -: 1785: #####: 1786: add_edge(eOut, X0, Y0, X1, Y1); call 0 never executed -: 1787: #####: 1788: eIn++; #####: 1789: eOut++; -: 1790: -: 1791: } -: 1792: #####: 1793: free(eIn); -: 1794: #####: 1795: return 0; -: 1796:} -: 1797: -: 1798:int function ImagingDrawOutline called 8 returned 100% blocks executed 100% 8: 1799:ImagingDrawOutline(Imaging im, ImagingOutline outline, const void* ink_, -: 1800: int fill, int op) -: 1801:{ -: 1802: DRAW* draw; -: 1803: INT32 ink; -: 1804: 8: 1805: DRAWINIT(); branch 0 taken 38% (fallthrough) branch 1 taken 63% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 1806: 8: 1807: draw->polygon(im, outline->count, outline->edges, ink, 0); call 0 returned 100% -: 1808: 8: 1809: return 0; -: 1810:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Matrix.c.gcov -: 0:Source:src/libImaging/Matrix.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Matrix.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/Matrix.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * colour and luminance matrix transforms -: 6: * -: 7: * history: -: 8: * 1996-05-18 fl: created (brute force implementation) -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1996. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19: -: 20:#define CLIPF(v) ((v <= 0.0) ? 0 : (v >= 255.0F) ? 255 : (UINT8) v) -: 21: -: 22: -: 23:Imaging function ImagingConvertMatrix called 4 returned 100% blocks executed 97% 4: 24:ImagingConvertMatrix(Imaging im, const char *mode, float m[]) -: 25:{ -: 26: Imaging imOut; -: 27: int x, y; -: 28: -: 29: /* Assume there's enough data in the buffer */ 4: 30: if (!im) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 31: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 32: } -: 33: 4: 34: if (strcmp(mode, "L") == 0 && im->bands == 3) { branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 50% (fallthrough) branch 3 taken 50% branch 4 taken 50% (fallthrough) branch 5 taken 50% -: 35: 1: 36: imOut = ImagingNewDirty("L", im->xsize, im->ysize); call 0 returned 100% 1: 37: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 38: return NULL; -: 39: } -: 40: 128: 41: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% branch 1 taken 1% 128: 42: UINT8* in = (UINT8*) im->image[y]; 128: 43: UINT8* out = (UINT8*) imOut->image[y]; -: 44: 16512: 45: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 46: float v = m[0]*in[0] + m[1]*in[1] + m[2]*in[2] + m[3] + 0.5; 16384: 47: out[x] = CLIPF(v); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 16384: 48: in += 4; -: 49: } -: 50: } -: 51: 3: 52: } else if (strlen(mode) == 3 && im->bands == 3) { branch 0 taken 67% (fallthrough) branch 1 taken 33% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 53: 2: 54: imOut = ImagingNewDirty(mode, im->xsize, im->ysize); call 0 returned 100% 2: 55: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 56: return NULL; -: 57: } -: 58: 256: 59: for (y = 0; y < im->ysize; y++) { branch 0 taken 99% branch 1 taken 1% 256: 60: UINT8* in = (UINT8*) im->image[y]; 256: 61: UINT8* out = (UINT8*) imOut->image[y]; -: 62: 33024: 63: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 64: float v0 = m[0]*in[0] + m[1]*in[1] + m[2]*in[2] + m[3] + 0.5; 32768: 65: float v1 = m[4]*in[0] + m[5]*in[1] + m[6]*in[2] + m[7] + 0.5; 32768: 66: float v2 = m[8]*in[0] + m[9]*in[1] + m[10]*in[2] + m[11] + 0.5; 32768: 67: out[0] = CLIPF(v0); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 99% (fallthrough) branch 3 taken 1% 32768: 68: out[1] = CLIPF(v1); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 99% (fallthrough) branch 3 taken 1% 32768: 69: out[2] = CLIPF(v2); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 99% (fallthrough) branch 3 taken 1% 32768: 70: in += 4; out += 4; -: 71: } -: 72: } -: 73: } else { 1: 74: return (Imaging) ImagingError_ModeError(); call 0 returned 100% -: 75: } -: 76: -: 77: return imOut; -: 78:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#_imagingcms.c.gcov -: 0:Source:src/_imagingcms.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imagingcms.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_imagingcms.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * pyCMS -: 3: * a Python / PIL interface to the littleCMS ICC Color Management System -: 4: * Copyright (C) 2002-2003 Kevin Cazabon -: 5: * kevin@cazabon.com -: 6: * http://www.cazabon.com -: 7: * Adapted/reworked for PIL by Fredrik Lundh -: 8: * Copyright (c) 2009 Fredrik Lundh -: 9: * Updated to LCMS2 -: 10: * Copyright (c) 2013 Eric Soroos -: 11: * -: 12: * pyCMS home page: http://www.cazabon.com/pyCMS -: 13: * littleCMS home page: http://www.littlecms.com -: 14: * (littleCMS is Copyright (C) 1998-2001 Marti Maria) -: 15: * -: 16: * Originally released under LGPL. Graciously donated to PIL in -: 17: * March 2009, for distribution under the standard PIL license -: 18: */ -: 19: -: 20:#define COPYRIGHTINFO "\ -: 21:pyCMS\n\ -: 22:a Python / PIL interface to the littleCMS ICC Color Management System\n\ -: 23:Copyright (C) 2002-2003 Kevin Cazabon\n\ -: 24:kevin@cazabon.com\n\ -: 25:http://www.cazabon.com\n\ -: 26:" -: 27: -: 28:#define PY_SSIZE_T_CLEAN -: 29:#include "Python.h" // Include before wchar.h so _GNU_SOURCE is set -: 30:#include "wchar.h" -: 31:#include "datetime.h" -: 32: -: 33:#include "lcms2.h" -: 34:#include "libImaging/Imaging.h" -: 35: -: 36:#define PYCMSVERSION "1.0.0 pil" -: 37: -: 38:/* version history */ -: 39: -: 40:/* -: 41: 1.0.0 pil Integrating littleCMS2 -: 42: 0.1.0 pil integration & refactoring -: 43: 0.0.2 alpha: Minor updates, added interfaces to littleCMS features, Jan 6, 2003 -: 44: - fixed some memory holes in how transforms/profiles were created and passed back to Python -: 45: due to improper destructor setup for PyCObjects -: 46: - added buildProofTransformFromOpenProfiles() function -: 47: - eliminated some code redundancy, centralizing several common tasks with internal functions -: 48: -: 49: 0.0.1 alpha: First public release Dec 26, 2002 -: 50: -: 51:*/ -: 52: -: 53:/* known to-do list with current version: -: 54: -: 55: Verify that PILmode->littleCMStype conversion in findLCMStype is correct for all -: 56: PIL modes (it probably isn't for the more obscure ones) -: 57: -: 58: Add support for creating custom RGB profiles on the fly -: 59: Add support for checking presence of a specific tag in a profile -: 60: Add support for other littleCMS features as required -: 61: -: 62:*/ -: 63: -: 64:/* -: 65: INTENT_PERCEPTUAL 0 -: 66: INTENT_RELATIVE_COLORIMETRIC 1 -: 67: INTENT_SATURATION 2 -: 68: INTENT_ABSOLUTE_COLORIMETRIC 3 -: 69:*/ -: 70: -: 71:/* -------------------------------------------------------------------- */ -: 72:/* wrapper classes */ -: 73: -: 74:/* a profile represents the ICC characteristics for a specific device */ -: 75: -: 76:typedef struct { -: 77: PyObject_HEAD -: 78: cmsHPROFILE profile; -: 79:} CmsProfileObject; -: 80: -: 81:static PyTypeObject CmsProfile_Type; -: 82: -: 83:#define CmsProfile_Check(op) (Py_TYPE(op) == &CmsProfile_Type) -: 84: -: 85:static PyObject* -: 86:cms_profile_new(cmsHPROFILE profile) -: 87:{ -: 88: CmsProfileObject* self; -: 89: 73: 90: self = PyObject_New(CmsProfileObject, &CmsProfile_Type); call 0 returned 100% call 1 returned 100% call 2 returned 100% 73: 91: if (!self) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% -: 92: return NULL; -: 93: } -: 94: 73: 95: self->profile = profile; -: 96: -: 97: return (PyObject*) self; -: 98:} -: 99: -: 100:static PyObject* function cms_profile_open called 25 returned 100% blocks executed 100% 25: 101:cms_profile_open(PyObject* self, PyObject* args) -: 102:{ -: 103: cmsHPROFILE hProfile; -: 104: -: 105: char* sProfile; 25: 106: if (!PyArg_ParseTuple(args, "s:profile_open", &sProfile)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 107: return NULL; -: 108: } -: 109: 25: 110: hProfile = cmsOpenProfileFromFile(sProfile, "r"); call 0 returned 100% 25: 111: if (!hProfile) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 2: 112: PyErr_SetString(PyExc_OSError, "cannot open profile file"); call 0 returned 100% 2: 113: return NULL; -: 114: } -: 115: 23: 116: return cms_profile_new(hProfile); -: 117:} -: 118: -: 119:static PyObject* function cms_profile_fromstring called 4 returned 100% blocks executed 82% 4: 120:cms_profile_fromstring(PyObject* self, PyObject* args) -: 121:{ -: 122: cmsHPROFILE hProfile; -: 123: -: 124: char* pProfile; -: 125: Py_ssize_t nProfile; 4: 126: if (!PyArg_ParseTuple(args, "y#:profile_frombytes", &pProfile, &nProfile)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 127: return NULL; -: 128: } -: 129: 4: 130: hProfile = cmsOpenProfileFromMem(pProfile, nProfile); call 0 returned 100% 4: 131: if (!hProfile) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 132: PyErr_SetString(PyExc_OSError, "cannot open profile from string"); call 0 never executed #####: 133: return NULL; -: 134: } -: 135: 4: 136: return cms_profile_new(hProfile); -: 137:} -: 138: -: 139:static PyObject* function cms_profile_tobytes called 44 returned 100% blocks executed 63% 44: 140:cms_profile_tobytes(PyObject* self, PyObject* args) -: 141:{ 44: 142: char *pProfile =NULL; -: 143: cmsUInt32Number nProfile; -: 144: PyObject* CmsProfile; -: 145: -: 146: cmsHPROFILE *profile; -: 147: -: 148: PyObject* ret; 44: 149: if (!PyArg_ParseTuple(args, "O", &CmsProfile)){ call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 150: return NULL; -: 151: } -: 152: 44: 153: profile = ((CmsProfileObject*)CmsProfile)->profile; -: 154: 44: 155: if (!cmsSaveProfileToMem(profile, pProfile, &nProfile)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 156: PyErr_SetString(PyExc_OSError, "Could not determine profile size"); call 0 never executed #####: 157: return NULL; -: 158: } -: 159: 44: 160: pProfile = (char*)malloc(nProfile); 44: 161: if (!pProfile) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 162: PyErr_SetString(PyExc_OSError, "Out of Memory"); call 0 never executed #####: 163: return NULL; -: 164: } -: 165: 44: 166: if (!cmsSaveProfileToMem(profile, pProfile, &nProfile)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 167: PyErr_SetString(PyExc_OSError, "Could not get profile"); call 0 never executed #####: 168: free(pProfile); #####: 169: return NULL; -: 170: } -: 171: 44: 172: ret = PyBytes_FromStringAndSize(pProfile, (Py_ssize_t)nProfile); call 0 returned 100% -: 173: 44: 174: free(pProfile); 44: 175: return ret; -: 176:} -: 177: -: 178:static void function cms_profile_dealloc called 73 returned 100% blocks executed 100% 73: 179:cms_profile_dealloc(CmsProfileObject* self) -: 180:{ 73: 181: (void) cmsCloseProfile(self->profile); call 0 returned 100% 73: 182: PyObject_Del(self); call 0 returned 100% 73: 183:} -: 184: -: 185:/* a transform represents the mapping between two profiles */ -: 186: -: 187:typedef struct { -: 188: PyObject_HEAD -: 189: char mode_in[8]; -: 190: char mode_out[8]; -: 191: cmsHTRANSFORM transform; -: 192:} CmsTransformObject; -: 193: -: 194:static PyTypeObject CmsTransform_Type; -: 195: -: 196:#define CmsTransform_Check(op) (Py_TYPE(op) == &CmsTransform_Type) -: 197: -: 198:static PyObject* function cms_transform_new called 40 returned 100% blocks executed 100% 40: 199:cms_transform_new(cmsHTRANSFORM transform, char* mode_in, char* mode_out) -: 200:{ -: 201: CmsTransformObject* self; -: 202: 40: 203: self = PyObject_New(CmsTransformObject, &CmsTransform_Type); call 0 returned 100% 40: 204: if (!self) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 205: return NULL; -: 206: } -: 207: 40: 208: self->transform = transform; -: 209: 80: 210: strcpy(self->mode_in, mode_in); 80: 211: strcpy(self->mode_out, mode_out); -: 212: 40: 213: return (PyObject*) self; -: 214:} -: 215: -: 216:static void function cms_transform_dealloc called 40 returned 100% blocks executed 100% 40: 217:cms_transform_dealloc(CmsTransformObject* self) -: 218:{ 40: 219: cmsDeleteTransform(self->transform); call 0 returned 100% 40: 220: PyObject_Del(self); call 0 returned 100% 40: 221:} -: 222: -: 223:/* -------------------------------------------------------------------- */ -: 224:/* internal functions */ -: 225: -: 226:static cmsUInt32Number function findLCMStype called 80 returned 100% blocks executed 85% 80: 227:findLCMStype(char* PILmode) -: 228:{ 80: 229: if (strcmp(PILmode, "RGB") == 0) { branch 0 taken 73% (fallthrough) branch 1 taken 28% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 58% (fallthrough) branch 7 taken 43% -: 230: return TYPE_RGBA_8; -: 231: } 46: 232: else if (strcmp(PILmode, "RGBA") == 0) { branch 0 taken 74% (fallthrough) branch 1 taken 26% -: 233: return TYPE_RGBA_8; -: 234: } 34: 235: else if (strcmp(PILmode, "RGBX") == 0) { branch 0 taken 65% (fallthrough) branch 1 taken 35% -: 236: return TYPE_RGBA_8; -: 237: } 22: 238: else if (strcmp(PILmode, "RGBA;16B") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 239: return TYPE_RGBA_16; -: 240: } 22: 241: else if (strcmp(PILmode, "CMYK") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 242: return TYPE_CMYK_8; -: 243: } 22: 244: else if (strcmp(PILmode, "L") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 245: return TYPE_GRAY_8; -: 246: } 22: 247: else if (strcmp(PILmode, "L;16") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 248: return TYPE_GRAY_16; -: 249: } 22: 250: else if (strcmp(PILmode, "L;16B") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 251: return TYPE_GRAY_16_SE; -: 252: } 22: 253: else if (strcmp(PILmode, "YCCA") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 254: return TYPE_YCbCr_8; -: 255: } 22: 256: else if (strcmp(PILmode, "YCC") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 257: return TYPE_YCbCr_8; -: 258: } 22: 259: else if (strcmp(PILmode, "LAB") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% -: 260: // LabX equivalent like ALab, but not reversed -- no #define in lcms2 -: 261: return (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)); -: 262: } -: 263: -: 264: else { -: 265: /* take a wild guess... but you probably should fail instead. */ #####: 266: return TYPE_GRAY_8; /* so there's no buffer overrun... */ -: 267: } -: 268:} -: 269: -: 270:#define Cms_Min(a, b) ((a) < (b) ? (a) : (b)) -: 271: -: 272:static int function pyCMSgetAuxChannelChannel called 66 returned 100% blocks executed 45% 66: 273:pyCMSgetAuxChannelChannel (cmsUInt32Number format, int auxChannelNdx) -: 274:{ 66: 275: int numColors = T_CHANNELS(format); 66: 276: int numExtras = T_EXTRA(format); -: 277: 66: 278: if (T_SWAPFIRST(format) && T_DOSWAP(format)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 279: // reverse order, before anything but last extra is shifted last #####: 280: if (auxChannelNdx == numExtras - 1) { branch 0 never executed branch 1 never executed #####: 281: return numColors + numExtras - 1; -: 282: } else { #####: 283: return numExtras - 2 - auxChannelNdx; -: 284: } -: 285: } 66: 286: else if (T_SWAPFIRST(format)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 287: // in order, after color channels, but last extra is shifted to first #####: 288: if (auxChannelNdx == numExtras - 1) { branch 0 never executed branch 1 never executed -: 289: return 0; -: 290: } else { #####: 291: return numColors + 1 + auxChannelNdx; -: 292: } -: 293: } 66: 294: else if (T_DOSWAP(format)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 295: // reverse order, before anything #####: 296: return numExtras - 1 - auxChannelNdx; -: 297: } -: 298: else { -: 299: // in order, after color channels 66: 300: return numColors + auxChannelNdx; -: 301: } -: 302:} -: 303: -: 304:static void function pyCMScopyAux called 40 returned 100% blocks executed 100% 40: 305:pyCMScopyAux (cmsHTRANSFORM hTransform, Imaging imDst, const Imaging imSrc) -: 306:{ -: 307: cmsUInt32Number dstLCMSFormat; -: 308: cmsUInt32Number srcLCMSFormat; -: 309: int numSrcExtras; -: 310: int numDstExtras; -: 311: int numExtras; -: 312: int ySize; -: 313: int xSize; -: 314: int channelSize; -: 315: int srcChunkSize; -: 316: int dstChunkSize; -: 317: int e; -: 318: -: 319: // trivially copied 40: 320: if (imDst == imSrc) { branch 0 taken 83% (fallthrough) branch 1 taken 18% -: 321: return; -: 322: } -: 323: 33: 324: dstLCMSFormat = cmsGetTransformOutputFormat(hTransform); call 0 returned 100% 33: 325: srcLCMSFormat = cmsGetTransformInputFormat(hTransform); call 0 returned 100% -: 326: -: 327: // currently, all Pillow formats are chunky formats, but check it anyway 33: 328: if (T_PLANAR(dstLCMSFormat) || T_PLANAR(srcLCMSFormat)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 329: return; -: 330: } -: 331: -: 332: // copy only if channel format is identical, except OPTIMIZED is ignored as it -: 333: // does not affect the aux channel 33: 334: if (T_FLOAT(dstLCMSFormat) != T_FLOAT(srcLCMSFormat) branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 335: || T_FLAVOR(dstLCMSFormat) != T_FLAVOR(srcLCMSFormat) branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 336: || T_ENDIAN16(dstLCMSFormat) != T_ENDIAN16(srcLCMSFormat) branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 337: || T_BYTES(dstLCMSFormat) != T_BYTES(srcLCMSFormat)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 338: return; -: 339: } -: 340: 33: 341: numSrcExtras = T_EXTRA(srcLCMSFormat); 33: 342: numDstExtras = T_EXTRA(dstLCMSFormat); 33: 343: numExtras = Cms_Min(numSrcExtras, numDstExtras); 33: 344: ySize = Cms_Min(imSrc->ysize, imDst->ysize); 33: 345: xSize = Cms_Min(imSrc->xsize, imDst->xsize); 33: 346: channelSize = T_BYTES(dstLCMSFormat); 33: 347: srcChunkSize = (T_CHANNELS(srcLCMSFormat) + T_EXTRA(srcLCMSFormat)) * channelSize; 33: 348: dstChunkSize = (T_CHANNELS(dstLCMSFormat) + T_EXTRA(dstLCMSFormat)) * channelSize; -: 349: 66: 350: for (e = 0; e < numExtras; ++e) { branch 0 taken 50% branch 1 taken 50% (fallthrough) -: 351: int y; 33: 352: int dstChannel = pyCMSgetAuxChannelChannel(dstLCMSFormat, e); call 0 returned 100% 33: 353: int srcChannel = pyCMSgetAuxChannelChannel(srcLCMSFormat, e); -: 354: 4139: 355: for (y = 0; y < ySize; y++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) -: 356: int x; 4106: 357: char* pDstExtras = imDst->image[y] + dstChannel * channelSize; 4106: 358: const char* pSrcExtras = imSrc->image[y] + srcChannel * channelSize; -: 359: 528494: 360: for (x = 0; x < xSize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1048776: 361: memcpy(pDstExtras + x * dstChunkSize, pSrcExtras + x * srcChunkSize, channelSize); -: 362: } -: 363: } -: 364: } -: 365:} -: 366: -: 367:static int function pyCMSdoTransform called 40 returned 100% blocks executed 100% 40: 368:pyCMSdoTransform(Imaging im, Imaging imOut, cmsHTRANSFORM hTransform) -: 369:{ -: 370: int i; -: 371: 40: 372: if (im->xsize > imOut->xsize || im->ysize > imOut->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 373: return -1; -: 374: } -: 375: 40: 376: Py_BEGIN_ALLOW_THREADS -: 377: -: 378: // transform color channels only 5042: 379: for (i = 0; i < im->ysize; i++) { call 0 returned 100% branch 1 taken 99% branch 2 taken 1% (fallthrough) 5002: 380: cmsDoTransform(hTransform, im->image[i], imOut->image[i], im->xsize); call 0 returned 100% -: 381: } -: 382: -: 383: // lcms by default does nothing to the auxiliary channels leaving those -: 384: // unchanged. To do "the right thing" here, i.e. maintain identical results -: 385: // with and without inPlace, we replicate those channels to the output. -: 386: // -: 387: // As of lcms 2.8, a new cmsFLAGS_COPY_ALPHA flag is introduced which would -: 388: // do the same thing automagically. Unfortunately, lcms2.8 is not yet widely -: 389: // enough available on all platforms, so we polyfill it here for now. 40: 390: pyCMScopyAux(hTransform, imOut, im); call 0 returned 100% -: 391: 40: 392: Py_END_ALLOW_THREADS call 0 returned 100% -: 393: 40: 394: return 0; -: 395:} -: 396: -: 397:static cmsHTRANSFORM function _buildTransform called 39 returned 100% blocks executed 88% 39: 398:_buildTransform(cmsHPROFILE hInputProfile, cmsHPROFILE hOutputProfile, char *sInMode, char *sOutMode, int iRenderingIntent, cmsUInt32Number cmsFLAGS) -: 399:{ -: 400: cmsHTRANSFORM hTransform; -: 401: 39: 402: Py_BEGIN_ALLOW_THREADS call 0 returned 100% -: 403: -: 404: /* create the transform */ 39: 405: hTransform = cmsCreateTransform(hInputProfile, call 0 returned 100% call 1 returned 100% call 2 returned 100% -: 406: findLCMStype(sInMode), -: 407: hOutputProfile, -: 408: findLCMStype(sOutMode), -: 409: iRenderingIntent, cmsFLAGS); -: 410: 39: 411: Py_END_ALLOW_THREADS call 0 returned 100% -: 412: 39: 413: if (!hTransform) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 414: PyErr_SetString(PyExc_ValueError, "cannot build transform"); call 0 never executed -: 415: } -: 416: 39: 417: return hTransform; /* if NULL, an exception is set */ -: 418:} -: 419: -: 420:static cmsHTRANSFORM function _buildProofTransform called 1 returned 100% blocks executed 88% 1: 421:_buildProofTransform(cmsHPROFILE hInputProfile, cmsHPROFILE hOutputProfile, cmsHPROFILE hProofProfile, char *sInMode, char *sOutMode, int iRenderingIntent, int iProofIntent, cmsUInt32Number cmsFLAGS) -: 422:{ -: 423: cmsHTRANSFORM hTransform; -: 424: 1: 425: Py_BEGIN_ALLOW_THREADS call 0 returned 100% -: 426: -: 427: /* create the transform */ 1: 428: hTransform = cmsCreateProofingTransform(hInputProfile, call 0 returned 100% call 1 returned 100% call 2 returned 100% -: 429: findLCMStype(sInMode), -: 430: hOutputProfile, -: 431: findLCMStype(sOutMode), -: 432: hProofProfile, -: 433: iRenderingIntent, -: 434: iProofIntent, -: 435: cmsFLAGS); -: 436: 1: 437: Py_END_ALLOW_THREADS call 0 returned 100% -: 438: 1: 439: if (!hTransform) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 440: PyErr_SetString(PyExc_ValueError, "cannot build proof transform"); call 0 never executed -: 441: } -: 442: 1: 443: return hTransform; /* if NULL, an exception is set */ -: 444:} -: 445: -: 446:/* -------------------------------------------------------------------- */ -: 447:/* Python callable functions */ -: 448: -: 449:static PyObject * function buildTransform called 39 returned 100% blocks executed 100% 39: 450:buildTransform(PyObject *self, PyObject *args) { -: 451: CmsProfileObject *pInputProfile; -: 452: CmsProfileObject *pOutputProfile; -: 453: char *sInMode; -: 454: char *sOutMode; 39: 455: int iRenderingIntent = 0; 39: 456: int cmsFLAGS = 0; -: 457: 39: 458: cmsHTRANSFORM transform = NULL; -: 459: 39: 460: if (!PyArg_ParseTuple(args, "O!O!ss|ii:buildTransform", &CmsProfile_Type, &pInputProfile, &CmsProfile_Type, &pOutputProfile, &sInMode, &sOutMode, &iRenderingIntent, &cmsFLAGS)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 461: return NULL; -: 462: } -: 463: 39: 464: transform = _buildTransform(pInputProfile->profile, pOutputProfile->profile, sInMode, sOutMode, iRenderingIntent, cmsFLAGS); call 0 returned 100% -: 465: 39: 466: if (!transform) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 467: return NULL; -: 468: } -: 469: 39: 470: return cms_transform_new(transform, sInMode, sOutMode); call 0 returned 100% -: 471:} -: 472: -: 473:static PyObject * function buildProofTransform called 1 returned 100% blocks executed 100% 1: 474:buildProofTransform(PyObject *self, PyObject *args) -: 475:{ -: 476: CmsProfileObject *pInputProfile; -: 477: CmsProfileObject *pOutputProfile; -: 478: CmsProfileObject *pProofProfile; -: 479: char *sInMode; -: 480: char *sOutMode; 1: 481: int iRenderingIntent = 0; 1: 482: int iProofIntent = 0; 1: 483: int cmsFLAGS = 0; -: 484: 1: 485: cmsHTRANSFORM transform = NULL; -: 486: 1: 487: if (!PyArg_ParseTuple(args, "O!O!O!ss|iii:buildProofTransform", &CmsProfile_Type, &pInputProfile, &CmsProfile_Type, &pOutputProfile, &CmsProfile_Type, &pProofProfile, &sInMode, &sOutMode, &iRenderingIntent, &iProofIntent, &cmsFLAGS)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 488: return NULL; -: 489: } -: 490: 1: 491: transform = _buildProofTransform(pInputProfile->profile, pOutputProfile->profile, pProofProfile->profile, sInMode, sOutMode, iRenderingIntent, iProofIntent, cmsFLAGS); call 0 returned 100% -: 492: 1: 493: if (!transform) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 494: return NULL; -: 495: } -: 496: 1: 497: return cms_transform_new(transform, sInMode, sOutMode); call 0 returned 100% -: 498: -: 499:} -: 500: -: 501:static PyObject * function cms_transform_apply called 40 returned 100% blocks executed 100% 40: 502:cms_transform_apply(CmsTransformObject *self, PyObject *args) -: 503:{ -: 504: Py_ssize_t idIn; -: 505: Py_ssize_t idOut; -: 506: Imaging im; -: 507: Imaging imOut; -: 508: -: 509: int result; -: 510: 40: 511: if (!PyArg_ParseTuple(args, "nn:apply", &idIn, &idOut)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 512: return NULL; -: 513: } -: 514: 40: 515: im = (Imaging) idIn; 40: 516: imOut = (Imaging) idOut; -: 517: 40: 518: result = pyCMSdoTransform(im, imOut, self->transform); call 0 returned 100% -: 519: 40: 520: return Py_BuildValue("i", result); call 0 returned 100% -: 521:} -: 522: -: 523:/* -------------------------------------------------------------------- */ -: 524:/* Python-Callable On-The-Fly profile creation functions */ -: 525: -: 526:static PyObject * function createProfile called 46 returned 100% blocks executed 73% 46: 527:createProfile(PyObject *self, PyObject *args) -: 528:{ -: 529: char *sColorSpace; -: 530: cmsHPROFILE hProfile; 46: 531: cmsFloat64Number dColorTemp = 0.0; -: 532: cmsCIExyY whitePoint; -: 533: cmsBool result; -: 534: 46: 535: if (!PyArg_ParseTuple(args, "s|d:createProfile", &sColorSpace, &dColorTemp)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 536: return NULL; -: 537: } -: 538: 46: 539: if (strcmp(sColorSpace, "LAB") == 0) { branch 0 taken 33% (fallthrough) branch 1 taken 67% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 33% (fallthrough) branch 7 taken 67% 15: 540: if (dColorTemp > 0.0) { branch 0 taken 13% (fallthrough) branch 1 taken 87% 2: 541: result = cmsWhitePointFromTemp(&whitePoint, dColorTemp); call 0 returned 100% 2: 542: if (!result) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 543: PyErr_SetString(PyExc_ValueError, "ERROR: Could not calculate white point from color temperature provided, must be float in degrees Kelvin"); call 0 never executed #####: 544: return NULL; -: 545: } 2: 546: hProfile = cmsCreateLab2Profile(&whitePoint); call 0 returned 100% -: 547: } else { 13: 548: hProfile = cmsCreateLab2Profile(NULL); call 0 returned 100% -: 549: } -: 550: } 31: 551: else if (strcmp(sColorSpace, "XYZ") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 552: hProfile = cmsCreateXYZProfile(); call 0 never executed -: 553: } 31: 554: else if (strcmp(sColorSpace, "sRGB") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 31: 555: hProfile = cmsCreate_sRGBProfile(); call 0 returned 100% -: 556: } -: 557: else { -: 558: hProfile = NULL; -: 559: } -: 560: 46: 561: if (!hProfile) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 562: PyErr_SetString(PyExc_ValueError, "failed to create requested color space"); call 0 never executed #####: 563: return NULL; -: 564: } -: 565: 46: 566: return cms_profile_new(hProfile); -: 567:} -: 568: -: 569:/* -------------------------------------------------------------------- */ -: 570:/* profile methods */ -: 571: -: 572:static PyObject * function cms_profile_is_intent_supported called 3 returned 100% blocks executed 100% 3: 573:cms_profile_is_intent_supported(CmsProfileObject *self, PyObject *args) -: 574:{ -: 575: cmsBool result; -: 576: -: 577: int intent; -: 578: int direction; 3: 579: if (!PyArg_ParseTuple(args, "ii:is_intent_supported", &intent, &direction)) { call 0 returned 100% branch 1 taken 67% (fallthrough) branch 2 taken 33% -: 580: return NULL; -: 581: } -: 582: 2: 583: result = cmsIsIntentSupported(self->profile, intent, direction); call 0 returned 100% -: 584: -: 585: /* printf("cmsIsIntentSupported(%p, %d, %d) => %d\n", self->profile, intent, direction, result); */ -: 586: 2: 587: return PyLong_FromLong(result != 0); call 0 returned 100% -: 588:} -: 589: -: 590:#ifdef _WIN32 -: 591: -: 592:#ifdef _WIN64 -: 593:#define F_HANDLE "K" -: 594:#else -: 595:#define F_HANDLE "k" -: 596:#endif -: 597: -: 598:static PyObject * -: 599:cms_get_display_profile_win32(PyObject* self, PyObject* args) -: 600:{ -: 601: char filename[MAX_PATH]; -: 602: cmsUInt32Number filename_size; -: 603: BOOL ok; -: 604: -: 605: HANDLE handle = 0; -: 606: int is_dc = 0; -: 607: if (!PyArg_ParseTuple(args, "|" F_HANDLE "i:get_display_profile", &handle, &is_dc)) { -: 608: return NULL; -: 609: } -: 610: -: 611: filename_size = sizeof(filename); -: 612: -: 613: if (is_dc) { -: 614: ok = GetICMProfile((HDC) handle, &filename_size, filename); -: 615: } else { -: 616: HDC dc = GetDC((HWND) handle); -: 617: ok = GetICMProfile(dc, &filename_size, filename); -: 618: ReleaseDC((HWND) handle, dc); -: 619: } -: 620: -: 621: if (ok) { -: 622: return PyUnicode_FromStringAndSize(filename, filename_size-1); -: 623: } -: 624: -: 625: Py_INCREF(Py_None); -: 626: return Py_None; -: 627:} -: 628:#endif -: 629: -: 630:/* -------------------------------------------------------------------- */ -: 631:/* Helper functions. */ -: 632: -: 633:static PyObject* function _profile_read_mlu.isra.6 called 25 returned 100% blocks executed 81% 25: 634:_profile_read_mlu(CmsProfileObject* self, cmsTagSignature info) -: 635:{ -: 636: PyObject *uni; 25: 637: char *lc = "en"; 25: 638: char *cc = cmsNoCountry; -: 639: cmsMLU *mlu; -: 640: cmsUInt32Number len; -: 641: wchar_t *buf; -: 642: 25: 643: if (!cmsIsTag(self->profile, info)) { call 0 returned 100% branch 1 taken 20% (fallthrough) branch 2 taken 80% 5: 644: Py_INCREF(Py_None); -: 645: return Py_None; -: 646: } -: 647: 20: 648: mlu = cmsReadTag(self->profile, info); call 0 returned 100% 20: 649: if (!mlu) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 650: Py_INCREF(Py_None); -: 651: return Py_None; -: 652: } -: 653: 20: 654: len = cmsMLUgetWide(mlu, lc, cc, NULL, 0); call 0 returned 100% 20: 655: if (len == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 656: Py_INCREF(Py_None); -: 657: return Py_None; -: 658: } -: 659: 20: 660: buf = malloc(len); 20: 661: if (!buf) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 662: PyErr_SetString(PyExc_OSError, "Out of Memory"); call 0 never executed -: 663: return NULL; -: 664: } -: 665: /* Just in case the next call fails. */ 20: 666: buf[0] = '\0'; -: 667: 20: 668: cmsMLUgetWide(mlu, lc, cc, buf, len); call 0 returned 100% -: 669: // buf contains additional junk after \0 20: 670: uni = PyUnicode_FromWideChar(buf, wcslen(buf)); call 0 returned 100% call 1 returned 100% 20: 671: free(buf); -: 672: -: 673: return uni; -: 674:} -: 675: -: 676: -: 677:static PyObject* function _profile_read_int_as_string called 6 returned 100% blocks executed 100% 6: 678:_profile_read_int_as_string(cmsUInt32Number nr) -: 679:{ -: 680: PyObject* ret; -: 681: char buf[5]; 6: 682: buf[0] = (char) ((nr >> 24) & 0xff); 6: 683: buf[1] = (char) ((nr >> 16) & 0xff); 6: 684: buf[2] = (char) ((nr >> 8) & 0xff); 6: 685: buf[3] = (char) (nr & 0xff); 6: 686: buf[4] = 0; -: 687: 6: 688: ret = PyUnicode_DecodeASCII(buf, 4, NULL); call 0 returned 100% 6: 689: return ret; -: 690:} -: 691: -: 692: -: 693:static PyObject* function _profile_read_signature.isra.5 called 4 returned 100% blocks executed 89% 4: 694:_profile_read_signature(CmsProfileObject* self, cmsTagSignature info) -: 695:{ -: 696: unsigned int *sig; -: 697: 4: 698: if (!cmsIsTag(self->profile, info)) { call 0 returned 100% branch 1 taken 75% (fallthrough) branch 2 taken 25% 3: 699: Py_INCREF(Py_None); -: 700: return Py_None; -: 701: } -: 702: 1: 703: sig = (unsigned int *) cmsReadTag(self->profile, info); call 0 returned 100% 1: 704: if (!sig) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 705: Py_INCREF(Py_None); -: 706: return Py_None; -: 707: } -: 708: 1: 709: return _profile_read_int_as_string(*sig); call 0 returned 100% -: 710:} -: 711: -: 712:static PyObject* function _xyz_py called 9 returned 100% blocks executed 100% 9: 713:_xyz_py(cmsCIEXYZ* XYZ) -: 714:{ -: 715: cmsCIExyY xyY; 9: 716: cmsXYZ2xyY(&xyY, XYZ); call 0 returned 100% 9: 717: return Py_BuildValue("((d,d,d),(d,d,d))", XYZ->X, XYZ->Y, XYZ->Z, xyY.x, xyY.y, xyY.Y); call 0 returned 100% -: 718:} -: 719: -: 720:static PyObject* function _xyz3_py called 1 returned 100% blocks executed 100% 1: 721:_xyz3_py(cmsCIEXYZ* XYZ) -: 722:{ -: 723: cmsCIExyY xyY[3]; 1: 724: cmsXYZ2xyY(&xyY[0], &XYZ[0]); call 0 returned 100% 1: 725: cmsXYZ2xyY(&xyY[1], &XYZ[1]); call 0 returned 100% 1: 726: cmsXYZ2xyY(&xyY[2], &XYZ[2]); call 0 returned 100% -: 727: 1: 728: return Py_BuildValue("(((d,d,d),(d,d,d),(d,d,d)),((d,d,d),(d,d,d),(d,d,d)))", call 0 returned 100% -: 729: XYZ[0].X, XYZ[0].Y, XYZ[0].Z, -: 730: XYZ[1].X, XYZ[1].Y, XYZ[1].Z, -: 731: XYZ[2].X, XYZ[2].Y, XYZ[2].Z, -: 732: xyY[0].x, xyY[0].y, xyY[0].Y, -: 733: xyY[1].x, xyY[1].y, xyY[1].Y, -: 734: xyY[2].x, xyY[2].y, xyY[2].Y); -: 735:} -: 736: -: 737:static PyObject* function _profile_read_ciexyz.isra.3 called 7 returned 100% blocks executed 82% 7: 738:_profile_read_ciexyz(CmsProfileObject* self, cmsTagSignature info, int multi) -: 739:{ -: 740: cmsCIEXYZ* XYZ; -: 741: 7: 742: if (!cmsIsTag(self->profile, info)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 743: Py_INCREF(Py_None); -: 744: return Py_None; -: 745: } -: 746: 7: 747: XYZ = (cmsCIEXYZ*) cmsReadTag(self->profile, info); call 0 returned 100% 7: 748: if (!XYZ) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 749: Py_INCREF(Py_None); -: 750: return Py_None; -: 751: } 7: 752: if (multi) { branch 0 taken 14% (fallthrough) branch 1 taken 86% 1: 753: return _xyz3_py(XYZ); call 0 returned 100% -: 754: } else { 6: 755: return _xyz_py(XYZ); call 0 returned 100% -: 756: } -: 757:} -: 758: -: 759:static PyObject* function _profile_read_ciexyy_triple.isra.0 called 1 returned 100% blocks executed 56% 1: 760:_profile_read_ciexyy_triple(CmsProfileObject* self, cmsTagSignature info) -: 761:{ -: 762: cmsCIExyYTRIPLE* triple; -: 763: 1: 764: if (!cmsIsTag(self->profile, info)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 1: 765: Py_INCREF(Py_None); -: 766: return Py_None; -: 767: } -: 768: #####: 769: triple = (cmsCIExyYTRIPLE*) cmsReadTag(self->profile, info); call 0 never executed #####: 770: if (!triple) { branch 0 never executed branch 1 never executed #####: 771: Py_INCREF(Py_None); -: 772: return Py_None; -: 773: } -: 774: -: 775: /* Note: lcms does all the heavy lifting and error checking (nr of -: 776: channels == 3). */ #####: 777: return Py_BuildValue("((d,d,d),(d,d,d),(d,d,d)),", call 0 never executed -: 778: triple->Red.x, triple->Red.y, triple->Red.Y, -: 779: triple->Green.x, triple->Green.y, triple->Green.Y, -: 780: triple->Blue.x, triple->Blue.y, triple->Blue.Y); -: 781:} -: 782: -: 783:static PyObject* function _profile_read_named_color_list.isra.2 called 2 returned 100% blocks executed 24% 2: 784:_profile_read_named_color_list(CmsProfileObject* self, cmsTagSignature info) -: 785:{ -: 786: cmsNAMEDCOLORLIST* ncl; -: 787: int i, n; -: 788: char name[cmsMAX_PATH]; -: 789: PyObject* result; -: 790: 2: 791: if (!cmsIsTag(self->profile, info)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 2: 792: Py_INCREF(Py_None); -: 793: return Py_None; -: 794: } -: 795: #####: 796: ncl = (cmsNAMEDCOLORLIST*) cmsReadTag(self->profile, info); call 0 never executed #####: 797: if (ncl == NULL) { branch 0 never executed branch 1 never executed #####: 798: Py_INCREF(Py_None); -: 799: return Py_None; -: 800: } -: 801: #####: 802: n = cmsNamedColorCount(ncl); call 0 never executed #####: 803: result = PyList_New(n); call 0 never executed #####: 804: if (!result) { branch 0 never executed branch 1 never executed #####: 805: Py_INCREF(Py_None); -: 806: return Py_None; -: 807: } -: 808: #####: 809: for (i = 0; i < n; i++) { branch 0 never executed branch 1 never executed -: 810: PyObject* str; #####: 811: cmsNamedColorInfo(ncl, i, name, NULL, NULL, NULL, NULL); call 0 never executed #####: 812: str = PyUnicode_FromString(name); call 0 never executed #####: 813: if (str == NULL) { branch 0 never executed branch 1 never executed #####: 814: Py_DECREF(result); branch 0 never executed branch 1 never executed call 2 never executed #####: 815: Py_INCREF(Py_None); -: 816: return Py_None; -: 817: } #####: 818: PyList_SET_ITEM(result, i, str); -: 819: } -: 820: -: 821: return result; -: 822:} -: 823: function _calculate_rgb_primaries.isra.4 called 3 returned 100% blocks executed 100% 3: 824:static cmsBool _calculate_rgb_primaries(CmsProfileObject* self, cmsCIEXYZTRIPLE* result) -: 825:{ 3: 826: double input[3][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }; -: 827: cmsHPROFILE hXYZ; -: 828: cmsHTRANSFORM hTransform; -: 829: -: 830: /* https://littlecms2.blogspot.com/2009/07/less-is-more.html */ -: 831: -: 832: // double array of RGB values with max on each identity 3: 833: hXYZ = cmsCreateXYZProfile(); call 0 returned 100% 3: 834: if (hXYZ == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 835: return 0; -: 836: } -: 837: -: 838: // transform from our profile to XYZ using doubles for highest precision 3: 839: hTransform = cmsCreateTransform(self->profile, TYPE_RGB_DBL, call 0 returned 100% -: 840: hXYZ, TYPE_XYZ_DBL, -: 841: INTENT_RELATIVE_COLORIMETRIC, -: 842: cmsFLAGS_NOCACHE | cmsFLAGS_NOOPTIMIZE); 3: 843: cmsCloseProfile(hXYZ); call 0 returned 100% 3: 844: if (hTransform == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 845: return 0; -: 846: } -: 847: 3: 848: cmsDoTransform(hTransform, (void*) input, result, 3); call 0 returned 100% 3: 849: cmsDeleteTransform(hTransform); call 0 returned 100% -: 850: return 1; -: 851:} -: 852: function _check_intent called 24 returned 100% blocks executed 100% 24: 853:static cmsBool _check_intent(int clut, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection) -: 854:{ 24: 855: if (clut) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 12: 856: return cmsIsCLUT(hProfile, Intent, UsedDirection); call 0 returned 100% -: 857: } -: 858: else { 12: 859: return cmsIsIntentSupported(hProfile, Intent, UsedDirection); call 0 returned 100% -: 860: } -: 861:} -: 862: -: 863:#define INTENTS 200 -: 864: -: 865:static PyObject* function _is_intent_supported.isra.1 called 2 returned 100% blocks executed 66% 2: 866:_is_intent_supported(CmsProfileObject* self, int clut) -: 867:{ -: 868: PyObject* result; -: 869: int n; -: 870: int i; -: 871: cmsUInt32Number intent_ids[INTENTS]; -: 872: char *intent_descs[INTENTS]; -: 873: 2: 874: result = PyDict_New(); call 0 returned 100% 2: 875: if (result == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 876: Py_INCREF(Py_None); -: 877: return Py_None; -: 878: } -: 879: -: 880: 2: 881: n = cmsGetSupportedIntents(INTENTS, call 0 returned 100% -: 882: intent_ids, -: 883: intent_descs); 22: 884: for (i = 0; i < n; i++) { branch 0 taken 91% branch 1 taken 9% (fallthrough) 20: 885: int intent = (int) intent_ids[i]; -: 886: PyObject* id; -: 887: PyObject* entry; -: 888: -: 889: /* Only valid for ICC Intents (otherwise we read invalid memory in lcms cmsio1.c). */ 20: 890: if (!(intent == INTENT_PERCEPTUAL || intent == INTENT_RELATIVE_COLORIMETRIC branch 0 taken 60% (fallthrough) branch 1 taken 40% -: 891: || intent == INTENT_SATURATION || intent == INTENT_ABSOLUTE_COLORIMETRIC)) { 12: 892: continue; -: 893: } -: 894: 8: 895: id = PyLong_FromLong((long) intent); call 0 returned 100% 24: 896: entry = Py_BuildValue("(OOO)", branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 50% (fallthrough) branch 3 taken 50% branch 4 taken 0% (fallthrough) branch 5 taken 100% call 6 returned 100% 8: 897: _check_intent(clut, self->profile, intent, LCMS_USED_AS_INPUT) ? Py_True : Py_False, call 0 returned 100% 8: 898: _check_intent(clut, self->profile, intent, LCMS_USED_AS_OUTPUT) ? Py_True : Py_False, call 0 returned 100% 8: 899: _check_intent(clut, self->profile, intent, LCMS_USED_AS_PROOF) ? Py_True : Py_False); call 0 returned 100% 8: 900: if (id == NULL || entry == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 901: Py_XDECREF(id); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed call 4 never executed #####: 902: Py_XDECREF(entry); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed call 4 never executed #####: 903: Py_XDECREF(result); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed call 4 never executed #####: 904: Py_INCREF(Py_None); -: 905: return Py_None; -: 906: } 8: 907: PyDict_SetItem(result, id, entry); call 0 returned 100% -: 908: } -: 909: return result; -: 910:} -: 911: -: 912:/* -------------------------------------------------------------------- */ -: 913:/* Python interface setup */ -: 914: -: 915:static PyMethodDef pyCMSdll_methods[] = { -: 916: -: 917: {"profile_open", cms_profile_open, 1}, -: 918: {"profile_frombytes", cms_profile_fromstring, 1}, -: 919: {"profile_fromstring", cms_profile_fromstring, 1}, -: 920: {"profile_tobytes", cms_profile_tobytes, 1}, -: 921: -: 922: /* profile and transform functions */ -: 923: {"buildTransform", buildTransform, 1}, -: 924: {"buildProofTransform", buildProofTransform, 1}, -: 925: {"createProfile", createProfile, 1}, -: 926: -: 927: /* platform specific tools */ -: 928:#ifdef _WIN32 -: 929: {"get_display_profile_win32", cms_get_display_profile_win32, 1}, -: 930:#endif -: 931: -: 932: {NULL, NULL} -: 933:}; -: 934: -: 935:static struct PyMethodDef cms_profile_methods[] = { -: 936: {"is_intent_supported", (PyCFunction) cms_profile_is_intent_supported, 1}, -: 937: {NULL, NULL} /* sentinel */ -: 938:}; -: 939: -: 940:static PyObject* function cms_profile_getattr_rendering_intent called 3 returned 100% blocks executed 100% 3: 941:cms_profile_getattr_rendering_intent(CmsProfileObject* self, void* closure) -: 942:{ 3: 943: return PyLong_FromLong(cmsGetHeaderRenderingIntent(self->profile)); call 0 returned 100% call 1 returned 100% -: 944:} -: 945: -: 946:/* New-style unicode interfaces. */ -: 947:static PyObject* function cms_profile_getattr_copyright called 3 returned 100% blocks executed 100% 3: 948:cms_profile_getattr_copyright(CmsProfileObject* self, void* closure) -: 949:{ 3: 950: return _profile_read_mlu(self, cmsSigCopyrightTag); call 0 returned 100% -: 951:} -: 952: -: 953:static PyObject* function cms_profile_getattr_target called 1 returned 100% blocks executed 100% 1: 954:cms_profile_getattr_target(CmsProfileObject* self, void* closure) -: 955:{ 1: 956: return _profile_read_mlu(self, cmsSigCharTargetTag); call 0 returned 100% -: 957:} -: 958: -: 959:static PyObject* function cms_profile_getattr_manufacturer called 6 returned 100% blocks executed 100% 6: 960:cms_profile_getattr_manufacturer(CmsProfileObject* self, void* closure) -: 961:{ 6: 962: return _profile_read_mlu(self, cmsSigDeviceMfgDescTag); call 0 returned 100% -: 963:} -: 964: -: 965:static PyObject* function cms_profile_getattr_model called 7 returned 100% blocks executed 100% 7: 966:cms_profile_getattr_model(CmsProfileObject* self, void* closure) -: 967:{ 7: 968: return _profile_read_mlu(self, cmsSigDeviceModelDescTag); call 0 returned 100% -: 969:} -: 970: -: 971:static PyObject* function cms_profile_getattr_profile_description called 6 returned 100% blocks executed 100% 6: 972:cms_profile_getattr_profile_description(CmsProfileObject* self, void* closure) -: 973:{ 6: 974: return _profile_read_mlu(self, cmsSigProfileDescriptionTag); call 0 returned 100% -: 975:} -: 976: -: 977:static PyObject* function cms_profile_getattr_screening_description called 1 returned 100% blocks executed 100% 1: 978:cms_profile_getattr_screening_description(CmsProfileObject* self, void* closure) -: 979:{ 1: 980: return _profile_read_mlu(self, cmsSigScreeningDescTag); call 0 returned 100% -: 981:} -: 982: -: 983:static PyObject* function cms_profile_getattr_viewing_condition called 1 returned 100% blocks executed 100% 1: 984:cms_profile_getattr_viewing_condition(CmsProfileObject* self, void* closure) -: 985:{ 1: 986: return _profile_read_mlu(self, cmsSigViewingCondDescTag); call 0 returned 100% -: 987:} -: 988: -: 989:static PyObject* function cms_profile_getattr_creation_date called 1 returned 100% blocks executed 80% 1: 990:cms_profile_getattr_creation_date(CmsProfileObject* self, void* closure) -: 991:{ -: 992: cmsBool result; -: 993: struct tm ct; -: 994: 1: 995: result = cmsGetHeaderCreationDateTime(self->profile, &ct); call 0 returned 100% 1: 996: if (! result) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 997: Py_INCREF(Py_None); #####: 998: return Py_None; -: 999: } -: 1000: 1: 1001: return PyDateTime_FromDateAndTime(1900 + ct.tm_year, ct.tm_mon, ct.tm_mday, call 0 returned 100% -: 1002: ct.tm_hour, ct.tm_min, ct.tm_sec, 0); -: 1003:} -: 1004: -: 1005:static PyObject* function cms_profile_getattr_version called 1 returned 100% blocks executed 100% 1: 1006:cms_profile_getattr_version(CmsProfileObject* self, void* closure) -: 1007:{ 1: 1008: cmsFloat64Number version = cmsGetProfileVersion(self->profile); call 0 returned 100% 1: 1009: return PyFloat_FromDouble(version); call 0 returned 100% -: 1010:} -: 1011: -: 1012:static PyObject* function cms_profile_getattr_icc_version called 1 returned 100% blocks executed 100% 1: 1013:cms_profile_getattr_icc_version(CmsProfileObject* self, void* closure) -: 1014:{ 1: 1015: return PyLong_FromLong((long) cmsGetEncodedICCversion(self->profile)); call 0 returned 100% call 1 returned 100% -: 1016:} -: 1017: -: 1018:static PyObject* function cms_profile_getattr_attributes called 1 returned 100% blocks executed 100% 1: 1019:cms_profile_getattr_attributes(CmsProfileObject* self, void* closure) -: 1020:{ -: 1021: cmsUInt64Number attr; 1: 1022: cmsGetHeaderAttributes(self->profile, &attr); call 0 returned 100% -: 1023: /* This works just as well on Windows (LLP64), 32-bit Linux -: 1024: (ILP32) and 64-bit Linux (LP64) systems. */ 1: 1025: return PyLong_FromUnsignedLongLong((unsigned long long) attr); call 0 returned 100% -: 1026:} -: 1027: -: 1028:static PyObject* function cms_profile_getattr_header_flags called 1 returned 100% blocks executed 100% 1: 1029:cms_profile_getattr_header_flags(CmsProfileObject* self, void* closure) -: 1030:{ 1: 1031: cmsUInt32Number flags = cmsGetHeaderFlags(self->profile); call 0 returned 100% 1: 1032: return PyLong_FromLong(flags); call 0 returned 100% -: 1033:} -: 1034: -: 1035:static PyObject* function cms_profile_getattr_header_manufacturer called 1 returned 100% blocks executed 100% 1: 1036:cms_profile_getattr_header_manufacturer(CmsProfileObject* self, void* closure) -: 1037:{ 1: 1038: return _profile_read_int_as_string(cmsGetHeaderManufacturer(self->profile)); call 0 returned 100% call 1 returned 100% -: 1039:} -: 1040: -: 1041:static PyObject* function cms_profile_getattr_header_model called 1 returned 100% blocks executed 100% 1: 1042:cms_profile_getattr_header_model(CmsProfileObject* self, void* closure) -: 1043:{ 1: 1044: return _profile_read_int_as_string(cmsGetHeaderModel(self->profile)); call 0 returned 100% call 1 returned 100% -: 1045:} -: 1046: -: 1047:static PyObject* function cms_profile_getattr_device_class called 1 returned 100% blocks executed 100% 1: 1048:cms_profile_getattr_device_class(CmsProfileObject* self, void* closure) -: 1049:{ 1: 1050: return _profile_read_int_as_string(cmsGetDeviceClass(self->profile)); call 0 returned 100% call 1 returned 100% -: 1051:} -: 1052: -: 1053:static PyObject* function cms_profile_getattr_connection_space called 1 returned 100% blocks executed 100% 1: 1054:cms_profile_getattr_connection_space(CmsProfileObject* self, void* closure) -: 1055:{ 1: 1056: return _profile_read_int_as_string(cmsGetPCS(self->profile)); call 0 returned 100% call 1 returned 100% -: 1057:} -: 1058: -: 1059:static PyObject* function cms_profile_getattr_xcolor_space called 1 returned 100% blocks executed 100% 1: 1060:cms_profile_getattr_xcolor_space(CmsProfileObject* self, void* closure) -: 1061:{ 1: 1062: return _profile_read_int_as_string(cmsGetColorSpace(self->profile)); call 0 returned 100% call 1 returned 100% -: 1063:} -: 1064: -: 1065:static PyObject* function cms_profile_getattr_profile_id called 1 returned 100% blocks executed 100% 1: 1066:cms_profile_getattr_profile_id(CmsProfileObject* self, void* closure) -: 1067:{ -: 1068: cmsUInt8Number id[16]; 1: 1069: cmsGetHeaderProfileID(self->profile, id); call 0 returned 100% 1: 1070: return PyBytes_FromStringAndSize((char *) id, 16); call 0 returned 100% -: 1071:} -: 1072: -: 1073:static PyObject* function cms_profile_getattr_is_matrix_shaper called 1 returned 100% blocks executed 100% 1: 1074:cms_profile_getattr_is_matrix_shaper(CmsProfileObject* self, void* closure) -: 1075:{ 1: 1076: return PyBool_FromLong((long) cmsIsMatrixShaper(self->profile)); call 0 returned 100% call 1 returned 100% -: 1077:} -: 1078: -: 1079:static PyObject* function cms_profile_getattr_technology called 1 returned 100% blocks executed 100% 1: 1080:cms_profile_getattr_technology(CmsProfileObject* self, void* closure) -: 1081:{ 1: 1082: return _profile_read_signature(self, cmsSigTechnologyTag); call 0 returned 100% -: 1083:} -: 1084: -: 1085:static PyObject* function cms_profile_getattr_colorimetric_intent called 1 returned 100% blocks executed 100% 1: 1086:cms_profile_getattr_colorimetric_intent(CmsProfileObject* self, void* closure) -: 1087:{ 1: 1088: return _profile_read_signature(self, cmsSigColorimetricIntentImageStateTag); call 0 returned 100% -: 1089:} -: 1090: -: 1091:static PyObject* function cms_profile_getattr_perceptual_rendering_intent_gamut called 1 returned 100% blocks executed 100% 1: 1092:cms_profile_getattr_perceptual_rendering_intent_gamut(CmsProfileObject* self, void* closure) -: 1093:{ 1: 1094: return _profile_read_signature(self, cmsSigPerceptualRenderingIntentGamutTag); call 0 returned 100% -: 1095:} -: 1096: -: 1097:static PyObject* function cms_profile_getattr_saturation_rendering_intent_gamut called 1 returned 100% blocks executed 100% 1: 1098:cms_profile_getattr_saturation_rendering_intent_gamut(CmsProfileObject* self, void* closure) -: 1099:{ 1: 1100: return _profile_read_signature(self, cmsSigSaturationRenderingIntentGamutTag); call 0 returned 100% -: 1101:} -: 1102: -: 1103:static PyObject* function cms_profile_getattr_red_colorant called 1 returned 100% blocks executed 80% 1: 1104:cms_profile_getattr_red_colorant(CmsProfileObject* self, void* closure) -: 1105:{ 1: 1106: if (!cmsIsMatrixShaper(self->profile)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1107: Py_INCREF(Py_None); #####: 1108: return Py_None; -: 1109: } 1: 1110: return _profile_read_ciexyz(self, cmsSigRedColorantTag, 0); call 0 returned 100% -: 1111:} -: 1112: -: 1113: -: 1114:static PyObject* function cms_profile_getattr_green_colorant called 1 returned 100% blocks executed 80% 1: 1115:cms_profile_getattr_green_colorant(CmsProfileObject* self, void* closure) -: 1116:{ 1: 1117: if (!cmsIsMatrixShaper(self->profile)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1118: Py_INCREF(Py_None); #####: 1119: return Py_None; -: 1120: } 1: 1121: return _profile_read_ciexyz(self, cmsSigGreenColorantTag, 0); call 0 returned 100% -: 1122:} -: 1123: -: 1124: -: 1125:static PyObject* function cms_profile_getattr_blue_colorant called 1 returned 100% blocks executed 80% 1: 1126:cms_profile_getattr_blue_colorant(CmsProfileObject* self, void* closure) -: 1127:{ 1: 1128: if (!cmsIsMatrixShaper(self->profile)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1129: Py_INCREF(Py_None); #####: 1130: return Py_None; -: 1131: } 1: 1132: return _profile_read_ciexyz(self, cmsSigBlueColorantTag, 0); call 0 returned 100% -: 1133:} -: 1134: -: 1135:static PyObject* function cms_profile_getattr_media_white_point_temperature called 1 returned 100% blocks executed 73% 1: 1136:cms_profile_getattr_media_white_point_temperature(CmsProfileObject *self, void* closure) -: 1137:{ -: 1138: cmsCIEXYZ* XYZ; -: 1139: cmsCIExyY xyY; -: 1140: cmsFloat64Number tempK; 1: 1141: cmsTagSignature info = cmsSigMediaWhitePointTag; -: 1142: cmsBool result; -: 1143: 1: 1144: if (!cmsIsTag(self->profile, info)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1145: Py_INCREF(Py_None); #####: 1146: return Py_None; -: 1147: } -: 1148: 1: 1149: XYZ = (cmsCIEXYZ*) cmsReadTag(self->profile, info); call 0 returned 100% 1: 1150: if (!XYZ) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1151: Py_INCREF(Py_None); #####: 1152: return Py_None; -: 1153: } 1: 1154: if (XYZ == NULL || XYZ->X == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 1155: Py_INCREF(Py_None); #####: 1156: return Py_None; -: 1157: } -: 1158: 1: 1159: cmsXYZ2xyY(&xyY, XYZ); call 0 returned 100% 1: 1160: result = cmsTempFromWhitePoint(&tempK, &xyY); call 0 returned 100% 1: 1161: if (!result) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1162: Py_INCREF(Py_None); #####: 1163: return Py_None; -: 1164: } 1: 1165: return PyFloat_FromDouble(tempK); call 0 returned 100% -: 1166:} -: 1167: -: 1168:static PyObject* function cms_profile_getattr_media_white_point called 1 returned 100% blocks executed 100% 1: 1169:cms_profile_getattr_media_white_point(CmsProfileObject* self, void* closure) -: 1170:{ 1: 1171: return _profile_read_ciexyz(self, cmsSigMediaWhitePointTag, 0); call 0 returned 100% -: 1172:} -: 1173: -: 1174: -: 1175:static PyObject* function cms_profile_getattr_media_black_point called 1 returned 100% blocks executed 100% 1: 1176:cms_profile_getattr_media_black_point(CmsProfileObject* self, void* closure) -: 1177:{ 1: 1178: return _profile_read_ciexyz(self, cmsSigMediaBlackPointTag, 0); call 0 returned 100% -: 1179:} -: 1180: -: 1181:static PyObject* function cms_profile_getattr_luminance called 1 returned 100% blocks executed 100% 1: 1182:cms_profile_getattr_luminance(CmsProfileObject* self, void* closure) -: 1183:{ 1: 1184: return _profile_read_ciexyz(self, cmsSigLuminanceTag, 0); call 0 returned 100% -: 1185:} -: 1186: -: 1187:static PyObject* function cms_profile_getattr_chromatic_adaptation called 1 returned 100% blocks executed 100% 1: 1188:cms_profile_getattr_chromatic_adaptation(CmsProfileObject* self, void* closure) -: 1189:{ 1: 1190: return _profile_read_ciexyz(self, cmsSigChromaticAdaptationTag, 1); call 0 returned 100% -: 1191:} -: 1192: -: 1193:static PyObject* function cms_profile_getattr_chromaticity called 1 returned 100% blocks executed 100% 1: 1194:cms_profile_getattr_chromaticity(CmsProfileObject* self, void* closure) -: 1195:{ 1: 1196: return _profile_read_ciexyy_triple(self, cmsSigChromaticityTag); call 0 returned 100% -: 1197:} -: 1198: -: 1199:static PyObject* function cms_profile_getattr_red_primary called 1 returned 100% blocks executed 86% 1: 1200:cms_profile_getattr_red_primary(CmsProfileObject* self, void* closure) -: 1201:{ 1: 1202: cmsBool result = 0; -: 1203: cmsCIEXYZTRIPLE primaries; -: 1204: 1: 1205: if (cmsIsMatrixShaper(self->profile)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 1: 1206: result = _calculate_rgb_primaries(self, &primaries); call 0 returned 100% -: 1207: } 1: 1208: if (! result) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1209: Py_INCREF(Py_None); #####: 1210: return Py_None; -: 1211: } -: 1212: 1: 1213: return _xyz_py(&primaries.Red); call 0 returned 100% -: 1214:} -: 1215: -: 1216:static PyObject* function cms_profile_getattr_green_primary called 1 returned 100% blocks executed 86% 1: 1217:cms_profile_getattr_green_primary(CmsProfileObject* self, void* closure) -: 1218:{ 1: 1219: cmsBool result = 0; -: 1220: cmsCIEXYZTRIPLE primaries; -: 1221: 1: 1222: if (cmsIsMatrixShaper(self->profile)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 1: 1223: result = _calculate_rgb_primaries(self, &primaries); call 0 returned 100% -: 1224: } 1: 1225: if (! result) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1226: Py_INCREF(Py_None); #####: 1227: return Py_None; -: 1228: } -: 1229: 1: 1230: return _xyz_py(&primaries.Green); call 0 returned 100% -: 1231:} -: 1232: -: 1233:static PyObject* function cms_profile_getattr_blue_primary called 1 returned 100% blocks executed 86% 1: 1234:cms_profile_getattr_blue_primary(CmsProfileObject* self, void* closure) -: 1235:{ 1: 1236: cmsBool result = 0; -: 1237: cmsCIEXYZTRIPLE primaries; -: 1238: 1: 1239: if (cmsIsMatrixShaper(self->profile)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 1: 1240: result = _calculate_rgb_primaries(self, &primaries); call 0 returned 100% -: 1241: } 1: 1242: if (! result) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1243: Py_INCREF(Py_None); #####: 1244: return Py_None; -: 1245: } -: 1246: 1: 1247: return _xyz_py(&primaries.Blue); call 0 returned 100% -: 1248:} -: 1249: -: 1250:static PyObject* function cms_profile_getattr_colorant_table called 1 returned 100% blocks executed 100% 1: 1251:cms_profile_getattr_colorant_table(CmsProfileObject* self, void* closure) -: 1252:{ 1: 1253: return _profile_read_named_color_list(self, cmsSigColorantTableTag); call 0 returned 100% -: 1254:} -: 1255: -: 1256:static PyObject* function cms_profile_getattr_colorant_table_out called 1 returned 100% blocks executed 100% 1: 1257:cms_profile_getattr_colorant_table_out(CmsProfileObject* self, void* closure) -: 1258:{ 1: 1259: return _profile_read_named_color_list(self, cmsSigColorantTableOutTag); call 0 returned 100% -: 1260:} -: 1261: -: 1262:static PyObject* function cms_profile_getattr_is_intent_supported called 1 returned 100% blocks executed 100% 1: 1263:cms_profile_getattr_is_intent_supported (CmsProfileObject* self, void* closure) -: 1264:{ 1: 1265: return _is_intent_supported(self, 0); call 0 returned 100% -: 1266:} -: 1267: -: 1268:static PyObject* function cms_profile_getattr_is_clut called 1 returned 100% blocks executed 100% 1: 1269:cms_profile_getattr_is_clut (CmsProfileObject* self, void* closure) -: 1270:{ 1: 1271: return _is_intent_supported(self, 1); call 0 returned 100% -: 1272:} -: 1273: -: 1274:static const char* function _illu_map called 1 returned 100% blocks executed 27% 1: 1275:_illu_map(int i) -: 1276:{ 1: 1277: switch(i) { branch 0 taken 0% branch 1 taken 100% branch 2 taken 0% branch 3 taken 0% branch 4 taken 0% branch 5 taken 0% branch 6 taken 0% branch 7 taken 0% branch 8 taken 0% branch 9 taken 0% -: 1278: case 0: -: 1279: return "unknown"; -: 1280: case 1: #####: 1281: return "D50"; -: 1282: case 2: 1: 1283: return "D65"; -: 1284: case 3: #####: 1285: return "D93"; -: 1286: case 4: #####: 1287: return "F2"; -: 1288: case 5: #####: 1289: return "D55"; -: 1290: case 6: #####: 1291: return "A"; -: 1292: case 7: #####: 1293: return "E"; -: 1294: case 8: #####: 1295: return "F8"; -: 1296: default: #####: 1297: return NULL; -: 1298: } -: 1299:} -: 1300: -: 1301:static PyObject* function cms_profile_getattr_icc_measurement_condition called 1 returned 100% blocks executed 83% 1: 1302:cms_profile_getattr_icc_measurement_condition (CmsProfileObject* self, void* closure) -: 1303:{ -: 1304: cmsICCMeasurementConditions* mc; 1: 1305: cmsTagSignature info = cmsSigMeasurementTag; -: 1306: const char *geo; -: 1307: 1: 1308: if (!cmsIsTag(self->profile, info)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1309: Py_INCREF(Py_None); #####: 1310: return Py_None; -: 1311: } -: 1312: 1: 1313: mc = (cmsICCMeasurementConditions*) cmsReadTag(self->profile, info); call 0 returned 100% 1: 1314: if (!mc) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1315: Py_INCREF(Py_None); #####: 1316: return Py_None; -: 1317: } -: 1318: 1: 1319: if (mc->Geometry == 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1320: geo = "45/0, 0/45"; 1: 1321: } else if (mc->Geometry == 2) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1322: geo = "0d, d/0"; -: 1323: } else { 1: 1324: geo = "unknown"; -: 1325: } -: 1326: 2: 1327: return Py_BuildValue("{s:i,s:(ddd),s:s,s:d,s:s}", call 0 returned 100% call 1 returned 100% -: 1328: "observer", mc->Observer, -: 1329: "backing", mc->Backing.X, mc->Backing.Y, mc->Backing.Z, -: 1330: "geo", geo, -: 1331: "flare", mc->Flare, 1: 1332: "illuminant_type", _illu_map(mc->IlluminantType)); -: 1333:} -: 1334: -: 1335:static PyObject* function cms_profile_getattr_icc_viewing_condition called 1 returned 100% blocks executed 44% 1: 1336:cms_profile_getattr_icc_viewing_condition (CmsProfileObject* self, void* closure) -: 1337:{ -: 1338: cmsICCViewingConditions* vc; 1: 1339: cmsTagSignature info = cmsSigViewingConditionsTag; -: 1340: 1: 1341: if (!cmsIsTag(self->profile, info)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 1: 1342: Py_INCREF(Py_None); 1: 1343: return Py_None; -: 1344: } -: 1345: #####: 1346: vc = (cmsICCViewingConditions*) cmsReadTag(self->profile, info); call 0 never executed #####: 1347: if (!vc) { branch 0 never executed branch 1 never executed #####: 1348: Py_INCREF(Py_None); #####: 1349: return Py_None; -: 1350: } -: 1351: #####: 1352: return Py_BuildValue("{s:(ddd),s:(ddd),s:s}", call 0 never executed call 1 never executed -: 1353: "illuminant", vc->IlluminantXYZ.X, vc->IlluminantXYZ.Y, vc->IlluminantXYZ.Z, -: 1354: "surround", vc->SurroundXYZ.X, vc->SurroundXYZ.Y, vc->SurroundXYZ.Z, #####: 1355: "illuminant_type", _illu_map(vc->IlluminantType)); -: 1356:} -: 1357: -: 1358: -: 1359:static struct PyGetSetDef cms_profile_getsetters[] = { -: 1360: /* New style interfaces. */ -: 1361: { "rendering_intent", (getter) cms_profile_getattr_rendering_intent }, -: 1362: { "creation_date", (getter) cms_profile_getattr_creation_date }, -: 1363: { "copyright", (getter) cms_profile_getattr_copyright }, -: 1364: { "target", (getter) cms_profile_getattr_target }, -: 1365: { "manufacturer", (getter) cms_profile_getattr_manufacturer }, -: 1366: { "model", (getter) cms_profile_getattr_model }, -: 1367: { "profile_description", (getter) cms_profile_getattr_profile_description }, -: 1368: { "screening_description", (getter) cms_profile_getattr_screening_description }, -: 1369: { "viewing_condition", (getter) cms_profile_getattr_viewing_condition }, -: 1370: { "version", (getter) cms_profile_getattr_version }, -: 1371: { "icc_version", (getter) cms_profile_getattr_icc_version }, -: 1372: { "attributes", (getter) cms_profile_getattr_attributes }, -: 1373: { "header_flags", (getter) cms_profile_getattr_header_flags }, -: 1374: { "header_manufacturer", (getter) cms_profile_getattr_header_manufacturer }, -: 1375: { "header_model", (getter) cms_profile_getattr_header_model }, -: 1376: { "device_class", (getter) cms_profile_getattr_device_class }, -: 1377: { "connection_space", (getter) cms_profile_getattr_connection_space }, -: 1378: { "xcolor_space", (getter) cms_profile_getattr_xcolor_space }, -: 1379: { "profile_id", (getter) cms_profile_getattr_profile_id }, -: 1380: { "is_matrix_shaper", (getter) cms_profile_getattr_is_matrix_shaper }, -: 1381: { "technology", (getter) cms_profile_getattr_technology }, -: 1382: { "colorimetric_intent", (getter) cms_profile_getattr_colorimetric_intent }, -: 1383: { "perceptual_rendering_intent_gamut", (getter) cms_profile_getattr_perceptual_rendering_intent_gamut }, -: 1384: { "saturation_rendering_intent_gamut", (getter) cms_profile_getattr_saturation_rendering_intent_gamut }, -: 1385: { "red_colorant", (getter) cms_profile_getattr_red_colorant }, -: 1386: { "green_colorant", (getter) cms_profile_getattr_green_colorant }, -: 1387: { "blue_colorant", (getter) cms_profile_getattr_blue_colorant }, -: 1388: { "red_primary", (getter) cms_profile_getattr_red_primary }, -: 1389: { "green_primary", (getter) cms_profile_getattr_green_primary }, -: 1390: { "blue_primary", (getter) cms_profile_getattr_blue_primary }, -: 1391: { "media_white_point_temperature", (getter) cms_profile_getattr_media_white_point_temperature }, -: 1392: { "media_white_point", (getter) cms_profile_getattr_media_white_point }, -: 1393: { "media_black_point", (getter) cms_profile_getattr_media_black_point }, -: 1394: { "luminance", (getter) cms_profile_getattr_luminance }, -: 1395: { "chromatic_adaptation", (getter) cms_profile_getattr_chromatic_adaptation }, -: 1396: { "chromaticity", (getter) cms_profile_getattr_chromaticity }, -: 1397: { "colorant_table", (getter) cms_profile_getattr_colorant_table }, -: 1398: { "colorant_table_out", (getter) cms_profile_getattr_colorant_table_out }, -: 1399: { "intent_supported", (getter) cms_profile_getattr_is_intent_supported }, -: 1400: { "clut", (getter) cms_profile_getattr_is_clut }, -: 1401: { "icc_measurement_condition", (getter) cms_profile_getattr_icc_measurement_condition }, -: 1402: { "icc_viewing_condition", (getter) cms_profile_getattr_icc_viewing_condition }, -: 1403: -: 1404: { NULL } -: 1405:}; -: 1406: -: 1407: -: 1408:static PyTypeObject CmsProfile_Type = { -: 1409: PyVarObject_HEAD_INIT(NULL, 0) -: 1410: "PIL._imagingcms.CmsProfile", /*tp_name */ -: 1411: sizeof(CmsProfileObject), 0,/*tp_basicsize, tp_itemsize */ -: 1412: /* methods */ -: 1413: (destructor) cms_profile_dealloc, /*tp_dealloc*/ -: 1414: 0, /*tp_print*/ -: 1415: 0, /*tp_getattr*/ -: 1416: 0, /*tp_setattr*/ -: 1417: 0, /*tp_compare*/ -: 1418: 0, /*tp_repr*/ -: 1419: 0, /*tp_as_number */ -: 1420: 0, /*tp_as_sequence */ -: 1421: 0, /*tp_as_mapping */ -: 1422: 0, /*tp_hash*/ -: 1423: 0, /*tp_call*/ -: 1424: 0, /*tp_str*/ -: 1425: 0, /*tp_getattro*/ -: 1426: 0, /*tp_setattro*/ -: 1427: 0, /*tp_as_buffer*/ -: 1428: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 1429: 0, /*tp_doc*/ -: 1430: 0, /*tp_traverse*/ -: 1431: 0, /*tp_clear*/ -: 1432: 0, /*tp_richcompare*/ -: 1433: 0, /*tp_weaklistoffset*/ -: 1434: 0, /*tp_iter*/ -: 1435: 0, /*tp_iternext*/ -: 1436: cms_profile_methods, /*tp_methods*/ -: 1437: 0, /*tp_members*/ -: 1438: cms_profile_getsetters, /*tp_getset*/ -: 1439:}; -: 1440: -: 1441:static struct PyMethodDef cms_transform_methods[] = { -: 1442: {"apply", (PyCFunction) cms_transform_apply, 1}, -: 1443: {NULL, NULL} /* sentinel */ -: 1444:}; -: 1445: -: 1446:static PyObject* function cms_transform_getattr_inputMode called 0 returned 0% blocks executed 0% #####: 1447:cms_transform_getattr_inputMode(CmsTransformObject* self, void* closure) -: 1448:{ #####: 1449: return PyUnicode_FromString(self->mode_in); call 0 never executed -: 1450:} -: 1451: -: 1452:static PyObject* function cms_transform_getattr_outputMode called 0 returned 0% blocks executed 0% #####: 1453:cms_transform_getattr_outputMode(CmsTransformObject* self, void* closure) -: 1454:{ #####: 1455: return PyUnicode_FromString(self->mode_out); call 0 never executed -: 1456:} -: 1457: -: 1458:static struct PyGetSetDef cms_transform_getsetters[] = { -: 1459: { "inputMode", (getter) cms_transform_getattr_inputMode }, -: 1460: { "outputMode", (getter) cms_transform_getattr_outputMode }, -: 1461: { NULL } -: 1462:}; -: 1463: -: 1464:static PyTypeObject CmsTransform_Type = { -: 1465: PyVarObject_HEAD_INIT(NULL, 0) -: 1466: "CmsTransform", sizeof(CmsTransformObject), 0, -: 1467: /* methods */ -: 1468: (destructor) cms_transform_dealloc, /*tp_dealloc*/ -: 1469: 0, /*tp_print*/ -: 1470: 0, /*tp_getattr*/ -: 1471: 0, /*tp_setattr*/ -: 1472: 0, /*tp_compare*/ -: 1473: 0, /*tp_repr*/ -: 1474: 0, /*tp_as_number */ -: 1475: 0, /*tp_as_sequence */ -: 1476: 0, /*tp_as_mapping */ -: 1477: 0, /*tp_hash*/ -: 1478: 0, /*tp_call*/ -: 1479: 0, /*tp_str*/ -: 1480: 0, /*tp_getattro*/ -: 1481: 0, /*tp_setattro*/ -: 1482: 0, /*tp_as_buffer*/ -: 1483: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 1484: 0, /*tp_doc*/ -: 1485: 0, /*tp_traverse*/ -: 1486: 0, /*tp_clear*/ -: 1487: 0, /*tp_richcompare*/ -: 1488: 0, /*tp_weaklistoffset*/ -: 1489: 0, /*tp_iter*/ -: 1490: 0, /*tp_iternext*/ -: 1491: cms_transform_methods, /*tp_methods*/ -: 1492: 0, /*tp_members*/ -: 1493: cms_transform_getsetters, /*tp_getset*/ -: 1494:}; -: 1495: -: 1496:static int function setup_module called 3 returned 100% blocks executed 100% 3: 1497:setup_module(PyObject* m) { -: 1498: PyObject *d; -: 1499: PyObject *v; -: 1500: int vn; -: 1501: 3: 1502: d = PyModule_GetDict(m); call 0 returned 100% -: 1503: 3: 1504: CmsProfile_Type.tp_new = PyType_GenericNew; -: 1505: -: 1506: /* Ready object types */ 3: 1507: PyType_Ready(&CmsProfile_Type); call 0 returned 100% 3: 1508: PyType_Ready(&CmsTransform_Type); call 0 returned 100% -: 1509: 3: 1510: Py_INCREF(&CmsProfile_Type); 3: 1511: PyModule_AddObject(m, "CmsProfile", (PyObject *)&CmsProfile_Type); call 0 returned 100% -: 1512: 3: 1513: d = PyModule_GetDict(m); call 0 returned 100% -: 1514: -: 1515: /* this check is also in PIL.features.pilinfo() */ -: 1516:#if LCMS_VERSION < 2070 3: 1517: vn = LCMS_VERSION; -: 1518:#else -: 1519: vn = cmsGetEncodedCMMversion(); -: 1520:#endif -: 1521: if (vn % 10) { -: 1522: v = PyUnicode_FromFormat("%d.%d.%d", vn / 1000, (vn / 10) % 100, vn % 10); -: 1523: } else { 3: 1524: v = PyUnicode_FromFormat("%d.%d", vn / 1000, (vn / 10) % 100); call 0 returned 100% -: 1525: } 3: 1526: PyDict_SetItemString(d, "littlecms_version", v); call 0 returned 100% -: 1527: 3: 1528: return 0; -: 1529:} -: 1530: -: 1531:PyMODINIT_FUNC function PyInit__imagingcms called 3 returned 100% blocks executed 100% 3: 1532:PyInit__imagingcms(void) { -: 1533: PyObject* m; -: 1534: -: 1535: static PyModuleDef module_def = { -: 1536: PyModuleDef_HEAD_INIT, -: 1537: "_imagingcms", /* m_name */ -: 1538: NULL, /* m_doc */ -: 1539: -1, /* m_size */ -: 1540: pyCMSdll_methods, /* m_methods */ -: 1541: }; -: 1542: 3: 1543: m = PyModule_Create(&module_def); call 0 returned 100% -: 1544: 3: 1545: if (setup_module(m) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1546: return NULL; -: 1547: } -: 1548: 3: 1549: PyDateTime_IMPORT; call 0 returned 100% -: 1550: 3: 1551: return m; -: 1552:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#QuantPngQuant.c.gcov -: 0:Source:src/libImaging/QuantPngQuant.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/QuantPngQuant.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/QuantPngQuant.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * quantization using libimagequant, a part of pngquant. -: 6: * -: 7: * Copyright (c) 2016 Marcin Kurczewski -: 8: * -: 9: */ -: 10: -: 11:#include -: 12:#include -: 13:#include -: 14: -: 15:#include "QuantPngQuant.h" -: 16: -: 17:#ifdef HAVE_LIBIMAGEQUANT -: 18:#include "libimagequant.h" -: 19: -: 20:int function quantize_pngquant called 1 returned 100% blocks executed 97% 1: 21:quantize_pngquant( -: 22: Pixel *pixelData, -: 23: unsigned int width, -: 24: unsigned int height, -: 25: uint32_t quantPixels, -: 26: Pixel **palette, -: 27: uint32_t *paletteLength, -: 28: uint32_t **quantizedPixels, -: 29: int withAlpha) -: 30:{ 1: 31: int result = 0; 1: 32: liq_image *image = NULL; 1: 33: liq_attr *attr = NULL; 1: 34: liq_result *remap = NULL; 1: 35: unsigned char *charMatrix = NULL; 1: 36: unsigned char **charMatrixRows = NULL; -: 37: unsigned int i, y; 1: 38: *palette = NULL; 1: 39: *paletteLength = 0; 1: 40: *quantizedPixels = NULL; -: 41: -: 42: /* configure pngquant */ 1: 43: attr = liq_attr_create(); call 0 returned 100% 1: 44: if (!attr) { goto err; } branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 45: if (quantPixels) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 46: liq_set_max_colors(attr, quantPixels); call 0 returned 100% -: 47: } -: 48: -: 49: /* prepare input image */ 1: 50: image = liq_image_create_rgba( call 0 returned 100% -: 51: attr, -: 52: pixelData, -: 53: width, -: 54: height, -: 55: 0.45455 /* gamma */); 1: 56: if (!image) { goto err; } branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 57: -: 58: /* quantize the image */ 1: 59: remap = liq_quantize_image(attr, image); call 0 returned 100% 1: 60: if (!remap) { goto err; } branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 61: liq_set_output_gamma(remap, 0.45455); call 0 returned 100% 1: 62: liq_set_dithering_level(remap, 1); call 0 returned 100% -: 63: -: 64: /* write output palette */ 1: 65: const liq_palette *l_palette = liq_get_palette(remap); call 0 returned 100% 1: 66: *paletteLength = l_palette->count; 1: 67: *palette = malloc(sizeof(Pixel) * l_palette->count); 1: 68: if (!*palette) { goto err; } branch 0 taken 100% (fallthrough) branch 1 taken 0% 100: 69: for (i = 0; i < l_palette->count; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 100: 70: (*palette)[i].c.b = l_palette->entries[i].b; 100: 71: (*palette)[i].c.g = l_palette->entries[i].g; 100: 72: (*palette)[i].c.r = l_palette->entries[i].r; 100: 73: (*palette)[i].c.a = l_palette->entries[i].a; -: 74: } -: 75: -: 76: /* write output pixels (pngquant uses char array) */ 1: 77: charMatrix = malloc(width * height); 1: 78: if (!charMatrix) { goto err; } branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 79: charMatrixRows = malloc(height * sizeof(unsigned char*)); 1: 80: if (!charMatrixRows) { goto err; } branch 0 taken 100% (fallthrough) branch 1 taken 0% 128: 81: for (y = 0; y < height; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 128: 82: charMatrixRows[y] = &charMatrix[y * width]; -: 83: } 1: 84: if (LIQ_OK != liq_write_remapped_image_rows(remap, image, charMatrixRows)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 85: goto err; -: 86: } -: 87: -: 88: /* transcribe output pixels (pillow uses uint32_t array) */ 1: 89: *quantizedPixels = malloc(sizeof(uint32_t) * width * height); 1: 90: if (!*quantizedPixels) { goto err; } branch 0 taken 100% (fallthrough) branch 1 taken 0% 16384: 91: for (i = 0; i < width * height; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 92: (*quantizedPixels)[i] = charMatrix[i]; -: 93: } -: 94: -: 95: result = 1; -: 96: -: 97:err: 1: 98: if (attr) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 99: liq_attr_destroy(attr); call 0 returned 100% -: 100: } 1: 101: if (image) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 102: liq_image_destroy(image); call 0 returned 100% -: 103: } 1: 104: if (remap) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 105: liq_result_destroy(remap); call 0 returned 100% -: 106: } 1: 107: free(charMatrix); 1: 108: free(charMatrixRows); 1: 109: if (!result) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 110: free(*quantizedPixels); #####: 111: free(*palette); -: 112: } 1: 113: return result; -: 114:} -: 115: -: 116:const char* function ImagingImageQuantVersion called 3 returned 100% blocks executed 100% 3: 117:ImagingImageQuantVersion(void) -: 118:{ -: 119: static char version[20]; 3: 120: int number = liq_version(); call 0 returned 100% 6: 121: sprintf(version, "%d.%d.%d", number / 10000, (number / 100) % 100, number % 100); 3: 122: return version; -: 123:} -: 124: -: 125:#endif <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#PcdDecode.c.gcov -: 0:Source:src/libImaging/PcdDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/PcdDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/libImaging/PcdDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for uncompressed PCD image data. -: 6: * -: 7: * history: -: 8: * 96-05-10 fl Created -: 9: * 96-05-18 fl New tables -: 10: * 97-01-25 fl Use PhotoYCC unpacker -: 11: * -: 12: * notes: -: 13: * This driver supports uncompressed PCD modes only -: 14: * (resolutions up to 768x512). -: 15: * -: 16: * Copyright (c) Fredrik Lundh 1996-97. -: 17: * Copyright (c) Secret Labs AB 1997. -: 18: * -: 19: * See the README file for information on usage and redistribution. -: 20: */ -: 21: -: 22: -: 23:#include "Imaging.h" -: 24: -: 25: -: 26:int function ImagingPcdDecode called 9 returned 100% blocks executed 100% 9: 27:ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 28:{ -: 29: int x; -: 30: int chunk; -: 31: UINT8* out; -: 32: UINT8* ptr; -: 33: 9: 34: ptr = buf; -: 35: 9: 36: chunk = 3 * state->xsize; -: 37: -: 38: for (;;) { -: 39: -: 40: /* We need data for two full lines before we can do anything */ 264: 41: if (bytes < chunk) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 8: 42: return ptr - buf; -: 43: } -: 44: -: 45: /* Unpack first line */ 256: 46: out = state->buffer; 196864: 47: for (x = 0; x < state->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 196608: 48: out[0] = ptr[x]; 196608: 49: out[1] = ptr[(x+4*state->xsize)/2]; 196608: 50: out[2] = ptr[(x+5*state->xsize)/2]; 196608: 51: out += 3; -: 52: } -: 53: 512: 54: state->shuffle((UINT8*) im->image[state->y], call 0 returned 100% 256: 55: state->buffer, state->xsize); -: 56: 256: 57: if (++state->y >= state->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 58: return -1; /* This can hardly happen */ -: 59: } -: 60: -: 61: /* Unpack second line */ 256: 62: out = state->buffer; 196864: 63: for (x = 0; x < state->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 196608: 64: out[0] = ptr[x+state->xsize]; 196608: 65: out[1] = ptr[(x+4*state->xsize)/2]; 196608: 66: out[2] = ptr[(x+5*state->xsize)/2]; 196608: 67: out += 3; -: 68: } -: 69: 512: 70: state->shuffle((UINT8*) im->image[state->y], call 0 returned 100% 256: 71: state->buffer, state->xsize); -: 72: 256: 73: if (++state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 74: return -1; -: 75: } -: 76: 255: 77: ptr += chunk; 255: 78: bytes -= chunk; -: 79: 255: 80: } -: 81:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/#usr#include#webp#mux.h.gcov -: 0:Source:/usr/include/webp/mux.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-ppc64le-3.7/src/_webp.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:// Copyright 2011 Google Inc. All Rights Reserved. -: 2:// -: 3:// Use of this source code is governed by a BSD-style license -: 4:// that can be found in the COPYING file in the root of the source -: 5:// tree. An additional intellectual property rights grant can be found -: 6:// in the file PATENTS. All contributing project authors may -: 7:// be found in the AUTHORS file in the root of the source tree. -: 8:// ----------------------------------------------------------------------------- -: 9:// -: 10:// RIFF container manipulation and encoding for WebP images. -: 11:// -: 12:// Authors: Urvang (urvang@google.com) -: 13:// Vikas (vikasa@google.com) -: 14: -: 15:#ifndef WEBP_WEBP_MUX_H_ -: 16:#define WEBP_WEBP_MUX_H_ -: 17: -: 18:#include "./mux_types.h" -: 19: -: 20:#ifdef __cplusplus -: 21:extern "C" { -: 22:#endif -: 23: -: 24:#define WEBP_MUX_ABI_VERSION 0x0108 // MAJOR(8b) + MINOR(8b) -: 25: -: 26://------------------------------------------------------------------------------ -: 27:// Mux API -: 28:// -: 29:// This API allows manipulation of WebP container images containing features -: 30:// like color profile, metadata, animation. -: 31:// -: 32:// Code Example#1: Create a WebPMux object with image data, color profile and -: 33:// XMP metadata. -: 34:/* -: 35: int copy_data = 0; -: 36: WebPMux* mux = WebPMuxNew(); -: 37: // ... (Prepare image data). -: 38: WebPMuxSetImage(mux, &image, copy_data); -: 39: // ... (Prepare ICCP color profile data). -: 40: WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data); -: 41: // ... (Prepare XMP metadata). -: 42: WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data); -: 43: // Get data from mux in WebP RIFF format. -: 44: WebPMuxAssemble(mux, &output_data); -: 45: WebPMuxDelete(mux); -: 46: // ... (Consume output_data; e.g. write output_data.bytes to file). -: 47: WebPDataClear(&output_data); -: 48:*/ -: 49: -: 50:// Code Example#2: Get image and color profile data from a WebP file. -: 51:/* -: 52: int copy_data = 0; -: 53: // ... (Read data from file). -: 54: WebPMux* mux = WebPMuxCreate(&data, copy_data); -: 55: WebPMuxGetFrame(mux, 1, &image); -: 56: // ... (Consume image; e.g. call WebPDecode() to decode the data). -: 57: WebPMuxGetChunk(mux, "ICCP", &icc_profile); -: 58: // ... (Consume icc_data). -: 59: WebPMuxDelete(mux); -: 60: WebPFree(data); -: 61:*/ -: 62: -: 63:// Note: forward declaring enumerations is not allowed in (strict) C and C++, -: 64:// the types are left here for reference. -: 65:// typedef enum WebPMuxError WebPMuxError; -: 66:// typedef enum WebPChunkId WebPChunkId; -: 67:typedef struct WebPMux WebPMux; // main opaque object. -: 68:typedef struct WebPMuxFrameInfo WebPMuxFrameInfo; -: 69:typedef struct WebPMuxAnimParams WebPMuxAnimParams; -: 70:typedef struct WebPAnimEncoderOptions WebPAnimEncoderOptions; -: 71: -: 72:// Error codes -: 73:typedef enum WebPMuxError { -: 74: WEBP_MUX_OK = 1, -: 75: WEBP_MUX_NOT_FOUND = 0, -: 76: WEBP_MUX_INVALID_ARGUMENT = -1, -: 77: WEBP_MUX_BAD_DATA = -2, -: 78: WEBP_MUX_MEMORY_ERROR = -3, -: 79: WEBP_MUX_NOT_ENOUGH_DATA = -4 -: 80:} WebPMuxError; -: 81: -: 82:// IDs for different types of chunks. -: 83:typedef enum WebPChunkId { -: 84: WEBP_CHUNK_VP8X, // VP8X -: 85: WEBP_CHUNK_ICCP, // ICCP -: 86: WEBP_CHUNK_ANIM, // ANIM -: 87: WEBP_CHUNK_ANMF, // ANMF -: 88: WEBP_CHUNK_DEPRECATED, // (deprecated from FRGM) -: 89: WEBP_CHUNK_ALPHA, // ALPH -: 90: WEBP_CHUNK_IMAGE, // VP8/VP8L -: 91: WEBP_CHUNK_EXIF, // EXIF -: 92: WEBP_CHUNK_XMP, // XMP -: 93: WEBP_CHUNK_UNKNOWN, // Other chunks. -: 94: WEBP_CHUNK_NIL -: 95:} WebPChunkId; -: 96: -: 97://------------------------------------------------------------------------------ -: 98: -: 99:// Returns the version number of the mux library, packed in hexadecimal using -: 100:// 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507. -: 101:WEBP_EXTERN int WebPGetMuxVersion(void); -: 102: -: 103://------------------------------------------------------------------------------ -: 104:// Life of a Mux object -: 105: -: 106:// Internal, version-checked, entry point -: 107:WEBP_EXTERN WebPMux* WebPNewInternal(int); -: 108: -: 109:// Creates an empty mux object. -: 110:// Returns: -: 111:// A pointer to the newly created empty mux object. -: 112:// Or NULL in case of memory error. -: 113:static WEBP_INLINE WebPMux* WebPMuxNew(void) { 16: 114: return WebPNewInternal(WEBP_MUX_ABI_VERSION); call 0 returned 100% -: 115:} -: 116: -: 117:// Deletes the mux object. -: 118:// Parameters: -: 119:// mux - (in/out) object to be deleted -: 120:WEBP_EXTERN void WebPMuxDelete(WebPMux* mux); -: 121: -: 122://------------------------------------------------------------------------------ -: 123:// Mux creation. -: 124: -: 125:// Internal, version-checked, entry point -: 126:WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int, int); -: 127: -: 128:// Creates a mux object from raw data given in WebP RIFF format. -: 129:// Parameters: -: 130:// bitstream - (in) the bitstream data in WebP RIFF format -: 131:// copy_data - (in) value 1 indicates given data WILL be copied to the mux -: 132:// object and value 0 indicates data will NOT be copied. -: 133:// Returns: -: 134:// A pointer to the mux object created from given data - on success. -: 135:// NULL - In case of invalid data or memory error. -: 136:static WEBP_INLINE WebPMux* WebPMuxCreate(const WebPData* bitstream, -: 137: int copy_data) { 1: 138: return WebPMuxCreateInternal(bitstream, copy_data, WEBP_MUX_ABI_VERSION); call 0 never executed call 1 returned 100% -: 139:} -: 140: -: 141://------------------------------------------------------------------------------ -: 142:// Non-image chunks. -: 143: -: 144:// Note: Only non-image related chunks should be managed through chunk APIs. -: 145:// (Image related chunks are: "ANMF", "VP8 ", "VP8L" and "ALPH"). -: 146:// To add, get and delete images, use WebPMuxSetImage(), WebPMuxPushFrame(), -: 147:// WebPMuxGetFrame() and WebPMuxDeleteFrame(). -: 148: -: 149:// Adds a chunk with id 'fourcc' and data 'chunk_data' in the mux object. -: 150:// Any existing chunk(s) with the same id will be removed. -: 151:// Parameters: -: 152:// mux - (in/out) object to which the chunk is to be added -: 153:// fourcc - (in) a character array containing the fourcc of the given chunk; -: 154:// e.g., "ICCP", "XMP ", "EXIF" etc. -: 155:// chunk_data - (in) the chunk data to be added -: 156:// copy_data - (in) value 1 indicates given data WILL be copied to the mux -: 157:// object and value 0 indicates data will NOT be copied. -: 158:// Returns: -: 159:// WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL -: 160:// or if fourcc corresponds to an image chunk. -: 161:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 162:// WEBP_MUX_OK - on success. -: 163:WEBP_EXTERN WebPMuxError WebPMuxSetChunk( -: 164: WebPMux* mux, const char fourcc[4], const WebPData* chunk_data, -: 165: int copy_data); -: 166: -: 167:// Gets a reference to the data of the chunk with id 'fourcc' in the mux object. -: 168:// The caller should NOT free the returned data. -: 169:// Parameters: -: 170:// mux - (in) object from which the chunk data is to be fetched -: 171:// fourcc - (in) a character array containing the fourcc of the chunk; -: 172:// e.g., "ICCP", "XMP ", "EXIF" etc. -: 173:// chunk_data - (out) returned chunk data -: 174:// Returns: -: 175:// WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL -: 176:// or if fourcc corresponds to an image chunk. -: 177:// WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given id. -: 178:// WEBP_MUX_OK - on success. -: 179:WEBP_EXTERN WebPMuxError WebPMuxGetChunk( -: 180: const WebPMux* mux, const char fourcc[4], WebPData* chunk_data); -: 181: -: 182:// Deletes the chunk with the given 'fourcc' from the mux object. -: 183:// Parameters: -: 184:// mux - (in/out) object from which the chunk is to be deleted -: 185:// fourcc - (in) a character array containing the fourcc of the chunk; -: 186:// e.g., "ICCP", "XMP ", "EXIF" etc. -: 187:// Returns: -: 188:// WEBP_MUX_INVALID_ARGUMENT - if mux or fourcc is NULL -: 189:// or if fourcc corresponds to an image chunk. -: 190:// WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given fourcc. -: 191:// WEBP_MUX_OK - on success. -: 192:WEBP_EXTERN WebPMuxError WebPMuxDeleteChunk( -: 193: WebPMux* mux, const char fourcc[4]); -: 194: -: 195://------------------------------------------------------------------------------ -: 196:// Images. -: 197: -: 198:// Encapsulates data about a single frame. -: 199:struct WebPMuxFrameInfo { -: 200: WebPData bitstream; // image data: can be a raw VP8/VP8L bitstream -: 201: // or a single-image WebP file. -: 202: int x_offset; // x-offset of the frame. -: 203: int y_offset; // y-offset of the frame. -: 204: int duration; // duration of the frame (in milliseconds). -: 205: -: 206: WebPChunkId id; // frame type: should be one of WEBP_CHUNK_ANMF -: 207: // or WEBP_CHUNK_IMAGE -: 208: WebPMuxAnimDispose dispose_method; // Disposal method for the frame. -: 209: WebPMuxAnimBlend blend_method; // Blend operation for the frame. -: 210: uint32_t pad[1]; // padding for later use -: 211:}; -: 212: -: 213:// Sets the (non-animated) image in the mux object. -: 214:// Note: Any existing images (including frames) will be removed. -: 215:// Parameters: -: 216:// mux - (in/out) object in which the image is to be set -: 217:// bitstream - (in) can be a raw VP8/VP8L bitstream or a single-image -: 218:// WebP file (non-animated) -: 219:// copy_data - (in) value 1 indicates given data WILL be copied to the mux -: 220:// object and value 0 indicates data will NOT be copied. -: 221:// Returns: -: 222:// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or bitstream is NULL. -: 223:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 224:// WEBP_MUX_OK - on success. -: 225:WEBP_EXTERN WebPMuxError WebPMuxSetImage( -: 226: WebPMux* mux, const WebPData* bitstream, int copy_data); -: 227: -: 228:// Adds a frame at the end of the mux object. -: 229:// Notes: (1) frame.id should be WEBP_CHUNK_ANMF -: 230:// (2) For setting a non-animated image, use WebPMuxSetImage() instead. -: 231:// (3) Type of frame being pushed must be same as the frames in mux. -: 232:// (4) As WebP only supports even offsets, any odd offset will be snapped -: 233:// to an even location using: offset &= ~1 -: 234:// Parameters: -: 235:// mux - (in/out) object to which the frame is to be added -: 236:// frame - (in) frame data. -: 237:// copy_data - (in) value 1 indicates given data WILL be copied to the mux -: 238:// object and value 0 indicates data will NOT be copied. -: 239:// Returns: -: 240:// WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL -: 241:// or if content of 'frame' is invalid. -: 242:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 243:// WEBP_MUX_OK - on success. -: 244:WEBP_EXTERN WebPMuxError WebPMuxPushFrame( -: 245: WebPMux* mux, const WebPMuxFrameInfo* frame, int copy_data); -: 246: -: 247:// Gets the nth frame from the mux object. -: 248:// The content of 'frame->bitstream' is allocated using WebPMalloc(), and NOT -: 249:// owned by the 'mux' object. It MUST be deallocated by the caller by calling -: 250:// WebPDataClear(). -: 251:// nth=0 has a special meaning - last position. -: 252:// Parameters: -: 253:// mux - (in) object from which the info is to be fetched -: 254:// nth - (in) index of the frame in the mux object -: 255:// frame - (out) data of the returned frame -: 256:// Returns: -: 257:// WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL. -: 258:// WEBP_MUX_NOT_FOUND - if there are less than nth frames in the mux object. -: 259:// WEBP_MUX_BAD_DATA - if nth frame chunk in mux is invalid. -: 260:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 261:// WEBP_MUX_OK - on success. -: 262:WEBP_EXTERN WebPMuxError WebPMuxGetFrame( -: 263: const WebPMux* mux, uint32_t nth, WebPMuxFrameInfo* frame); -: 264: -: 265:// Deletes a frame from the mux object. -: 266:// nth=0 has a special meaning - last position. -: 267:// Parameters: -: 268:// mux - (in/out) object from which a frame is to be deleted -: 269:// nth - (in) The position from which the frame is to be deleted -: 270:// Returns: -: 271:// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL. -: 272:// WEBP_MUX_NOT_FOUND - If there are less than nth frames in the mux object -: 273:// before deletion. -: 274:// WEBP_MUX_OK - on success. -: 275:WEBP_EXTERN WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth); -: 276: -: 277://------------------------------------------------------------------------------ -: 278:// Animation. -: 279: -: 280:// Animation parameters. -: 281:struct WebPMuxAnimParams { -: 282: uint32_t bgcolor; // Background color of the canvas stored (in MSB order) as: -: 283: // Bits 00 to 07: Alpha. -: 284: // Bits 08 to 15: Red. -: 285: // Bits 16 to 23: Green. -: 286: // Bits 24 to 31: Blue. -: 287: int loop_count; // Number of times to repeat the animation [0 = infinite]. -: 288:}; -: 289: -: 290:// Sets the animation parameters in the mux object. Any existing ANIM chunks -: 291:// will be removed. -: 292:// Parameters: -: 293:// mux - (in/out) object in which ANIM chunk is to be set/added -: 294:// params - (in) animation parameters. -: 295:// Returns: -: 296:// WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL. -: 297:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 298:// WEBP_MUX_OK - on success. -: 299:WEBP_EXTERN WebPMuxError WebPMuxSetAnimationParams( -: 300: WebPMux* mux, const WebPMuxAnimParams* params); -: 301: -: 302:// Gets the animation parameters from the mux object. -: 303:// Parameters: -: 304:// mux - (in) object from which the animation parameters to be fetched -: 305:// params - (out) animation parameters extracted from the ANIM chunk -: 306:// Returns: -: 307:// WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL. -: 308:// WEBP_MUX_NOT_FOUND - if ANIM chunk is not present in mux object. -: 309:// WEBP_MUX_OK - on success. -: 310:WEBP_EXTERN WebPMuxError WebPMuxGetAnimationParams( -: 311: const WebPMux* mux, WebPMuxAnimParams* params); -: 312: -: 313://------------------------------------------------------------------------------ -: 314:// Misc Utilities. -: 315: -: 316:// Sets the canvas size for the mux object. The width and height can be -: 317:// specified explicitly or left as zero (0, 0). -: 318:// * When width and height are specified explicitly, then this frame bound is -: 319:// enforced during subsequent calls to WebPMuxAssemble() and an error is -: 320:// reported if any animated frame does not completely fit within the canvas. -: 321:// * When unspecified (0, 0), the constructed canvas will get the frame bounds -: 322:// from the bounding-box over all frames after calling WebPMuxAssemble(). -: 323:// Parameters: -: 324:// mux - (in) object to which the canvas size is to be set -: 325:// width - (in) canvas width -: 326:// height - (in) canvas height -: 327:// Returns: -: 328:// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL; or -: 329:// width or height are invalid or out of bounds -: 330:// WEBP_MUX_OK - on success. -: 331:WEBP_EXTERN WebPMuxError WebPMuxSetCanvasSize(WebPMux* mux, -: 332: int width, int height); -: 333: -: 334:// Gets the canvas size from the mux object. -: 335:// Note: This method assumes that the VP8X chunk, if present, is up-to-date. -: 336:// That is, the mux object hasn't been modified since the last call to -: 337:// WebPMuxAssemble() or WebPMuxCreate(). -: 338:// Parameters: -: 339:// mux - (in) object from which the canvas size is to be fetched -: 340:// width - (out) canvas width -: 341:// height - (out) canvas height -: 342:// Returns: -: 343:// WEBP_MUX_INVALID_ARGUMENT - if mux, width or height is NULL. -: 344:// WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid. -: 345:// WEBP_MUX_OK - on success. -: 346:WEBP_EXTERN WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux, -: 347: int* width, int* height); -: 348: -: 349:// Gets the feature flags from the mux object. -: 350:// Note: This method assumes that the VP8X chunk, if present, is up-to-date. -: 351:// That is, the mux object hasn't been modified since the last call to -: 352:// WebPMuxAssemble() or WebPMuxCreate(). -: 353:// Parameters: -: 354:// mux - (in) object from which the features are to be fetched -: 355:// flags - (out) the flags specifying which features are present in the -: 356:// mux object. This will be an OR of various flag values. -: 357:// Enum 'WebPFeatureFlags' can be used to test individual flag values. -: 358:// Returns: -: 359:// WEBP_MUX_INVALID_ARGUMENT - if mux or flags is NULL. -: 360:// WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid. -: 361:// WEBP_MUX_OK - on success. -: 362:WEBP_EXTERN WebPMuxError WebPMuxGetFeatures(const WebPMux* mux, -: 363: uint32_t* flags); -: 364: -: 365:// Gets number of chunks with the given 'id' in the mux object. -: 366:// Parameters: -: 367:// mux - (in) object from which the info is to be fetched -: 368:// id - (in) chunk id specifying the type of chunk -: 369:// num_elements - (out) number of chunks with the given chunk id -: 370:// Returns: -: 371:// WEBP_MUX_INVALID_ARGUMENT - if mux, or num_elements is NULL. -: 372:// WEBP_MUX_OK - on success. -: 373:WEBP_EXTERN WebPMuxError WebPMuxNumChunks(const WebPMux* mux, -: 374: WebPChunkId id, int* num_elements); -: 375: -: 376:// Assembles all chunks in WebP RIFF format and returns in 'assembled_data'. -: 377:// This function also validates the mux object. -: 378:// Note: The content of 'assembled_data' will be ignored and overwritten. -: 379:// Also, the content of 'assembled_data' is allocated using WebPMalloc(), and -: 380:// NOT owned by the 'mux' object. It MUST be deallocated by the caller by -: 381:// calling WebPDataClear(). It's always safe to call WebPDataClear() upon -: 382:// return, even in case of error. -: 383:// Parameters: -: 384:// mux - (in/out) object whose chunks are to be assembled -: 385:// assembled_data - (out) assembled WebP data -: 386:// Returns: -: 387:// WEBP_MUX_BAD_DATA - if mux object is invalid. -: 388:// WEBP_MUX_INVALID_ARGUMENT - if mux or assembled_data is NULL. -: 389:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 390:// WEBP_MUX_OK - on success. -: 391:WEBP_EXTERN WebPMuxError WebPMuxAssemble(WebPMux* mux, -: 392: WebPData* assembled_data); -: 393: -: 394://------------------------------------------------------------------------------ -: 395:// WebPAnimEncoder API -: 396:// -: 397:// This API allows encoding (possibly) animated WebP images. -: 398:// -: 399:// Code Example: -: 400:/* -: 401: WebPAnimEncoderOptions enc_options; -: 402: WebPAnimEncoderOptionsInit(&enc_options); -: 403: // Tune 'enc_options' as needed. -: 404: WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options); -: 405: while() { -: 406: WebPConfig config; -: 407: WebPConfigInit(&config); -: 408: // Tune 'config' as needed. -: 409: WebPAnimEncoderAdd(enc, frame, timestamp_ms, &config); -: 410: } -: 411: WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL); -: 412: WebPAnimEncoderAssemble(enc, webp_data); -: 413: WebPAnimEncoderDelete(enc); -: 414: // Write the 'webp_data' to a file, or re-mux it further. -: 415:*/ -: 416: -: 417:typedef struct WebPAnimEncoder WebPAnimEncoder; // Main opaque object. -: 418: -: 419:// Forward declarations. Defined in encode.h. -: 420:struct WebPPicture; -: 421:struct WebPConfig; -: 422: -: 423:// Global options. -: 424:struct WebPAnimEncoderOptions { -: 425: WebPMuxAnimParams anim_params; // Animation parameters. -: 426: int minimize_size; // If true, minimize the output size (slow). Implicitly -: 427: // disables key-frame insertion. -: 428: int kmin; -: 429: int kmax; // Minimum and maximum distance between consecutive key -: 430: // frames in the output. The library may insert some key -: 431: // frames as needed to satisfy this criteria. -: 432: // Note that these conditions should hold: kmax > kmin -: 433: // and kmin >= kmax / 2 + 1. Also, if kmax <= 0, then -: 434: // key-frame insertion is disabled; and if kmax == 1, -: 435: // then all frames will be key-frames (kmin value does -: 436: // not matter for these special cases). -: 437: int allow_mixed; // If true, use mixed compression mode; may choose -: 438: // either lossy and lossless for each frame. -: 439: int verbose; // If true, print info and warning messages to stderr. -: 440: -: 441: uint32_t padding[4]; // Padding for later use. -: 442:}; -: 443: -: 444:// Internal, version-checked, entry point. -: 445:WEBP_EXTERN int WebPAnimEncoderOptionsInitInternal( -: 446: WebPAnimEncoderOptions*, int); -: 447: -: 448:// Should always be called, to initialize a fresh WebPAnimEncoderOptions -: 449:// structure before modification. Returns false in case of version mismatch. -: 450:// WebPAnimEncoderOptionsInit() must have succeeded before using the -: 451:// 'enc_options' object. -: 452:static WEBP_INLINE int WebPAnimEncoderOptionsInit( -: 453: WebPAnimEncoderOptions* enc_options) { 7: 454: return WebPAnimEncoderOptionsInitInternal(enc_options, WEBP_MUX_ABI_VERSION); call 0 returned 100% -: 455:} -: 456: -: 457:// Internal, version-checked, entry point. -: 458:WEBP_EXTERN WebPAnimEncoder* WebPAnimEncoderNewInternal( -: 459: int, int, const WebPAnimEncoderOptions*, int); -: 460: -: 461:// Creates and initializes a WebPAnimEncoder object. -: 462:// Parameters: -: 463:// width/height - (in) canvas width and height of the animation. -: 464:// enc_options - (in) encoding options; can be passed NULL to pick -: 465:// reasonable defaults. -: 466:// Returns: -: 467:// A pointer to the newly created WebPAnimEncoder object. -: 468:// Or NULL in case of memory error. -: 469:static WEBP_INLINE WebPAnimEncoder* WebPAnimEncoderNew( -: 470: int width, int height, const WebPAnimEncoderOptions* enc_options) { 7: 471: return WebPAnimEncoderNewInternal(width, height, enc_options, call 0 returned 100% -: 472: WEBP_MUX_ABI_VERSION); -: 473:} -: 474: -: 475:// Optimize the given frame for WebP, encode it and add it to the -: 476:// WebPAnimEncoder object. -: 477:// The last call to 'WebPAnimEncoderAdd' should be with frame = NULL, which -: 478:// indicates that no more frames are to be added. This call is also used to -: 479:// determine the duration of the last frame. -: 480:// Parameters: -: 481:// enc - (in/out) object to which the frame is to be added. -: 482:// frame - (in/out) frame data in ARGB or YUV(A) format. If it is in YUV(A) -: 483:// format, it will be converted to ARGB, which incurs a small loss. -: 484:// timestamp_ms - (in) timestamp of this frame in milliseconds. -: 485:// Duration of a frame would be calculated as -: 486:// "timestamp of next frame - timestamp of this frame". -: 487:// Hence, timestamps should be in non-decreasing order. -: 488:// config - (in) encoding options; can be passed NULL to pick -: 489:// reasonable defaults. -: 490:// Returns: -: 491:// On error, returns false and frame->error_code is set appropriately. -: 492:// Otherwise, returns true. -: 493:WEBP_EXTERN int WebPAnimEncoderAdd( -: 494: WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms, -: 495: const struct WebPConfig* config); -: 496: -: 497:// Assemble all frames added so far into a WebP bitstream. -: 498:// This call should be preceded by a call to 'WebPAnimEncoderAdd' with -: 499:// frame = NULL; if not, the duration of the last frame will be internally -: 500:// estimated. -: 501:// Parameters: -: 502:// enc - (in/out) object from which the frames are to be assembled. -: 503:// webp_data - (out) generated WebP bitstream. -: 504:// Returns: -: 505:// True on success. -: 506:WEBP_EXTERN int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, -: 507: WebPData* webp_data); -: 508: -: 509:// Get error string corresponding to the most recent call using 'enc'. The -: 510:// returned string is owned by 'enc' and is valid only until the next call to -: 511:// WebPAnimEncoderAdd() or WebPAnimEncoderAssemble() or WebPAnimEncoderDelete(). -: 512:// Parameters: -: 513:// enc - (in/out) object from which the error string is to be fetched. -: 514:// Returns: -: 515:// NULL if 'enc' is NULL. Otherwise, returns the error string if the last call -: 516:// to 'enc' had an error, or an empty string if the last call was a success. -: 517:WEBP_EXTERN const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc); -: 518: -: 519:// Deletes the WebPAnimEncoder object. -: 520:// Parameters: -: 521:// enc - (in/out) object to be deleted -: 522:WEBP_EXTERN void WebPAnimEncoderDelete(WebPAnimEncoder* enc); -: 523: -: 524://------------------------------------------------------------------------------ -: 525: -: 526:#ifdef __cplusplus -: 527:} // extern "C" -: 528:#endif -: 529: -: 530:#endif // WEBP_WEBP_MUX_H_ <<<<<< EOF