TRAVIS_OS_NAME=linux TRAVIS_PYTHON_VERSION=3.7 <<<<<< 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#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#_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/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#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#_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#_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_idxdib = 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#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#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/#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/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:/* 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:{ 11495: 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 -: 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#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#_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#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#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#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#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#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#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/#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#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/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#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#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#_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#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#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#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#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#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#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#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#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#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#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#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#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/#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#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#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