TRAVIS_PYTHON_VERSION=3.6 TRAVIS_OS_NAME=linux <<<<<< ENV .appveyor.yml .ci/after_success.sh .ci/build.sh .ci/install.sh .ci/test.sh .coveragerc .editorconfig .gitattributes .github/CONTRIBUTING.md .github/FUNDING.yml .github/ISSUE_TEMPLATE/ISSUE_REPORT.md .github/PULL_REQUEST_TEMPLATE.md .github/SECURITY.md .github/mergify.yml .github/workflows/lint.yml .github/workflows/macos-install.sh .github/workflows/system-info.py .github/workflows/test-docker.yml .github/workflows/test-windows.yml .github/workflows/test.yml .gitignore .pre-commit-config.yaml .readthedocs.yml .travis.yml CHANGES.rst LICENSE MANIFEST.in Makefile README.md RELEASING.md Tests/32bit_segfault_check.py Tests/README.rst Tests/__init__.py Tests/bench_cffi_access.py Tests/check_fli_oob.py Tests/check_fli_overflow.py Tests/check_icns_dos.py Tests/check_imaging_leaks.py Tests/check_j2k_dos.py Tests/check_j2k_leaks.py Tests/check_j2k_overflow.py Tests/check_jp2_overflow.py Tests/check_jpeg_leaks.py Tests/check_large_memory.py Tests/check_large_memory_numpy.py Tests/check_libtiff_segfault.py Tests/check_png_dos.py Tests/conftest.py Tests/createfontdatachunk.py Tests/fonts/10x20-ISO8859-1.pcf Tests/fonts/10x20.pbm Tests/fonts/10x20.pil Tests/fonts/AdobeVFPrototype.ttf Tests/fonts/ArefRuqaa-Regular.ttf Tests/fonts/BungeeColor-Regular_colr_Windows.ttf Tests/fonts/DejaVuSans-24-1-stripped.ttf Tests/fonts/DejaVuSans-24-2-stripped.ttf Tests/fonts/DejaVuSans-24-4-stripped.ttf Tests/fonts/DejaVuSans-24-8-stripped.ttf Tests/fonts/DejaVuSans.ttf Tests/fonts/FreeMono.ttf Tests/fonts/KhmerOSBattambang-Regular.ttf Tests/fonts/LICENSE.txt Tests/fonts/NotoColorEmoji.ttf Tests/fonts/NotoNastaliqUrdu-Regular.ttf Tests/fonts/NotoSans-Regular.ttf Tests/fonts/NotoSansJP-Regular.otf Tests/fonts/NotoSansSymbols-Regular.ttf Tests/fonts/OpenSansCondensed-LightItalic.ttf Tests/fonts/TINY5x3GX.ttf Tests/fonts/ter-x20b-cp1250.pbm Tests/fonts/ter-x20b-cp1250.pil Tests/fonts/ter-x20b-iso8859-1.pbm Tests/fonts/ter-x20b-iso8859-1.pil Tests/fonts/ter-x20b-iso8859-2.pbm Tests/fonts/ter-x20b-iso8859-2.pil Tests/fonts/ter-x20b.pcf Tests/helper.py Tests/icc/LICENSE.txt Tests/icc/sRGB_IEC61966-2-1_black_scaled.icc Tests/icc/sRGB_v4_ICC_preference.icc Tests/images/00r0_gray_l.jp2 Tests/images/00r1_graya_la.jp2 Tests/images/01r_00.pcx Tests/images/10ct_32bit_128.tiff Tests/images/12bit.cropped.tif Tests/images/12in16bit.tif Tests/images/16_bit_binary.pgm Tests/images/16_bit_binary_pgm.png Tests/images/16_bit_noise.tif Tests/images/16bit.MM.cropped.tif Tests/images/16bit.MM.deflate.tif Tests/images/16bit.cropped.j2k Tests/images/16bit.cropped.jp2 Tests/images/16bit.cropped.tif Tests/images/16bit.deflate.tif Tests/images/16bit.s.tif Tests/images/1_trns.png Tests/images/7x13.png Tests/images/DXGI_FORMAT_BC7_UNORM_SRGB.dds Tests/images/DXGI_FORMAT_BC7_UNORM_SRGB.png Tests/images/DXGI_FORMAT_R8G8B8A8_UNORM_SRGB.dds Tests/images/DXGI_FORMAT_R8G8B8A8_UNORM_SRGB.png Tests/images/WAlaska.wind.7days.grb Tests/images/a.fli Tests/images/a_fli.png Tests/images/anim_frame1.webp Tests/images/anim_frame2.webp Tests/images/apng/blend_op_over.png Tests/images/apng/blend_op_over_near_transparent.png Tests/images/apng/blend_op_source_near_transparent.png Tests/images/apng/blend_op_source_solid.png Tests/images/apng/blend_op_source_transparent.png Tests/images/apng/chunk_actl_after_idat.png Tests/images/apng/chunk_multi_actl.png Tests/images/apng/chunk_no_actl.png Tests/images/apng/chunk_no_fctl.png Tests/images/apng/chunk_no_fdat.png Tests/images/apng/chunk_repeat_fctl.png Tests/images/apng/delay.png Tests/images/apng/delay_round.png Tests/images/apng/delay_short_max.png Tests/images/apng/delay_zero_denom.png Tests/images/apng/delay_zero_numer.png Tests/images/apng/dispose_op_background.png Tests/images/apng/dispose_op_background_before_region.png Tests/images/apng/dispose_op_background_final.png Tests/images/apng/dispose_op_background_p_mode.png Tests/images/apng/dispose_op_background_region.png Tests/images/apng/dispose_op_none.png Tests/images/apng/dispose_op_none_region.png Tests/images/apng/dispose_op_previous.png Tests/images/apng/dispose_op_previous_final.png Tests/images/apng/dispose_op_previous_first.png Tests/images/apng/dispose_op_previous_region.png Tests/images/apng/fctl_actl.png Tests/images/apng/mode_16bit.png Tests/images/apng/mode_greyscale.png Tests/images/apng/mode_greyscale_alpha.png Tests/images/apng/mode_palette.png Tests/images/apng/mode_palette_1bit_alpha.png Tests/images/apng/mode_palette_alpha.png Tests/images/apng/num_plays.png Tests/images/apng/num_plays_1.png Tests/images/apng/sequence_fdat_fctl.png Tests/images/apng/sequence_gap.png Tests/images/apng/sequence_reorder.png Tests/images/apng/sequence_reorder_chunk.png Tests/images/apng/sequence_repeat.png Tests/images/apng/sequence_repeat_chunk.png Tests/images/apng/sequence_start.png Tests/images/apng/single_frame.png Tests/images/apng/single_frame_default.png Tests/images/apng/split_fdat.png Tests/images/apng/split_fdat_zero_chunk.png Tests/images/apng/syntax_num_frames_high.png Tests/images/apng/syntax_num_frames_invalid.png Tests/images/apng/syntax_num_frames_low.png Tests/images/apng/syntax_num_frames_zero.png Tests/images/apng/syntax_num_frames_zero_default.png Tests/images/app13-multiple.jpg Tests/images/app13.jpg Tests/images/argb-32bpp_MipMaps-1.dds Tests/images/argb-32bpp_MipMaps-1.png Tests/images/bad_palette_entry.gpl Tests/images/bad_palette_file.gpl Tests/images/balloon.jpf Tests/images/bc7-argb-8bpp_MipMaps-1.dds Tests/images/bc7-argb-8bpp_MipMaps-1.png Tests/images/binary_preview_map.eps Tests/images/bitmap_font_1_basic.png Tests/images/bitmap_font_1_raqm.png Tests/images/bitmap_font_2_basic.png Tests/images/bitmap_font_2_raqm.png Tests/images/bitmap_font_4_basic.png Tests/images/bitmap_font_4_raqm.png Tests/images/bitmap_font_8_basic.png Tests/images/bitmap_font_8_raqm.png Tests/images/blp/blp1_jpeg.blp Tests/images/blp/blp2_dxt1.blp Tests/images/blp/blp2_dxt1.png Tests/images/blp/blp2_dxt1a.blp Tests/images/blp/blp2_dxt1a.png Tests/images/blp/blp2_raw.blp Tests/images/blp/blp2_raw.png Tests/images/bmp/README.txt Tests/images/bmp/b/badbitcount.bmp Tests/images/bmp/b/badbitssize.bmp Tests/images/bmp/b/baddens1.bmp Tests/images/bmp/b/baddens2.bmp Tests/images/bmp/b/badfilesize.bmp Tests/images/bmp/b/badheadersize.bmp Tests/images/bmp/b/badpalettesize.bmp Tests/images/bmp/b/badplanes.bmp Tests/images/bmp/b/badrle.bmp Tests/images/bmp/b/badwidth.bmp Tests/images/bmp/b/pal8badindex.bmp Tests/images/bmp/b/reallybig.bmp Tests/images/bmp/b/rletopdown.bmp Tests/images/bmp/b/shortfile.bmp Tests/images/bmp/g/pal1.bmp Tests/images/bmp/g/pal1bg.bmp Tests/images/bmp/g/pal1wb.bmp Tests/images/bmp/g/pal4.bmp Tests/images/bmp/g/pal4rle.bmp Tests/images/bmp/g/pal8-0.bmp Tests/images/bmp/g/pal8.bmp Tests/images/bmp/g/pal8nonsquare.bmp Tests/images/bmp/g/pal8os2.bmp Tests/images/bmp/g/pal8rle.bmp Tests/images/bmp/g/pal8topdown.bmp Tests/images/bmp/g/pal8v4.bmp Tests/images/bmp/g/pal8v5.bmp Tests/images/bmp/g/pal8w124.bmp Tests/images/bmp/g/pal8w125.bmp Tests/images/bmp/g/pal8w126.bmp Tests/images/bmp/g/rgb16-565.bmp Tests/images/bmp/g/rgb16-565pal.bmp Tests/images/bmp/g/rgb16.bmp Tests/images/bmp/g/rgb24.bmp Tests/images/bmp/g/rgb24pal.bmp Tests/images/bmp/g/rgb32.bmp Tests/images/bmp/g/rgb32bf.bmp Tests/images/bmp/html/bkgd.png Tests/images/bmp/html/bmpsuite.html Tests/images/bmp/html/fakealpha.png Tests/images/bmp/html/pal1.png Tests/images/bmp/html/pal1bg.png Tests/images/bmp/html/pal1p1.png Tests/images/bmp/html/pal2.png Tests/images/bmp/html/pal4.png Tests/images/bmp/html/pal4rletrns-0.png Tests/images/bmp/html/pal4rletrns-b.png Tests/images/bmp/html/pal4rletrns.png Tests/images/bmp/html/pal8.png Tests/images/bmp/html/pal8nonsquare-e.png Tests/images/bmp/html/pal8nonsquare-v.png Tests/images/bmp/html/pal8rletrns-0.png Tests/images/bmp/html/pal8rletrns-b.png Tests/images/bmp/html/pal8rletrns.png Tests/images/bmp/html/pal8w124.png Tests/images/bmp/html/pal8w125.png Tests/images/bmp/html/pal8w126.png Tests/images/bmp/html/rgb16-231.png Tests/images/bmp/html/rgb16-565.png Tests/images/bmp/html/rgb16.png Tests/images/bmp/html/rgb24.jpg Tests/images/bmp/html/rgb24.png Tests/images/bmp/html/rgba16-4444.png Tests/images/bmp/html/rgba32.png Tests/images/bmp/q/pal1p1.bmp Tests/images/bmp/q/pal2.bmp Tests/images/bmp/q/pal4rletrns.bmp Tests/images/bmp/q/pal8offs.bmp Tests/images/bmp/q/pal8os2sp.bmp Tests/images/bmp/q/pal8os2v2-16.bmp Tests/images/bmp/q/pal8os2v2.bmp Tests/images/bmp/q/pal8oversizepal.bmp Tests/images/bmp/q/pal8rletrns.bmp Tests/images/bmp/q/rgb16-231.bmp Tests/images/bmp/q/rgb24jpeg.bmp Tests/images/bmp/q/rgb24largepal.bmp Tests/images/bmp/q/rgb24lprof.bmp Tests/images/bmp/q/rgb24png.bmp Tests/images/bmp/q/rgb24prof.bmp Tests/images/bmp/q/rgb32-111110.bmp Tests/images/bmp/q/rgb32bf-xbgr.bmp Tests/images/bmp/q/rgb32fakealpha.bmp Tests/images/bmp/q/rgba16-4444.bmp Tests/images/bmp/q/rgba32.bmp Tests/images/bmp/q/rgba32abf.bmp Tests/images/broken.png Tests/images/broken_data_stream.png Tests/images/bw_gradient.png Tests/images/caption_6_33_22.png Tests/images/cbdt_notocoloremoji.png Tests/images/cbdt_notocoloremoji_mask.png Tests/images/chi.gif Tests/images/clipboard.dib Tests/images/clipboard_target.png Tests/images/cmx3g8_wv_1998.260_0745_mcidas.ara Tests/images/cmx3g8_wv_1998.260_0745_mcidas.png Tests/images/color_snakes.png Tests/images/colr_bungee.png Tests/images/colr_bungee_mask.png Tests/images/combined_larger_than_size.psd Tests/images/compression.tif Tests/images/copyleft.png Tests/images/copyleft.tiff Tests/images/corner.lut Tests/images/courB08.bdf Tests/images/courB08.pbm Tests/images/courB08.pil Tests/images/create_eps.gnuplot Tests/images/custom_gimp_palette.gpl Tests/images/decompression_bomb.gif Tests/images/decompression_bomb.ico Tests/images/deerstalker.cur Tests/images/default_font.png Tests/images/dilation4.lut Tests/images/dilation8.lut Tests/images/dispose_bgnd.gif Tests/images/dispose_none.gif Tests/images/dispose_prev.gif Tests/images/drawing.emf Tests/images/drawing.wmf Tests/images/drawing_emf_ref.png Tests/images/drawing_roundDown.emf Tests/images/drawing_wmf_ref.png Tests/images/drawing_wmf_ref_144.png Tests/images/dummy.container Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.dds Tests/images/dxt1-rgb-4bbp-noalpha_MipMaps-1.png Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.dds Tests/images/dxt3-argb-8bbp-explicitalpha_MipMaps-1.png Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.dds Tests/images/dxt5-argb-8bbp-interpolatedalpha_MipMaps-1.png Tests/images/edge.lut Tests/images/effect_mandelbrot.png Tests/images/effect_spread.png Tests/images/empty_gps_ifd.jpg Tests/images/erosion4.lut Tests/images/erosion8.lut Tests/images/exif-200dpcm.jpg Tests/images/exif-72dpi-int.jpg Tests/images/exif-dpi-zerodivision.jpg Tests/images/exif-ifd-offset.jpg Tests/images/exif.png Tests/images/exif_gps.jpg Tests/images/exif_gps_typeerror.jpg Tests/images/exif_imagemagick.png Tests/images/exif_text.png Tests/images/exif_typeerror.jpg Tests/images/fli_oob/02r/02r00.fli Tests/images/fli_oob/02r/notes Tests/images/fli_oob/02r/others/02r01.fli Tests/images/fli_oob/02r/others/02r02.fli Tests/images/fli_oob/02r/others/02r03.fli Tests/images/fli_oob/02r/others/02r04.fli Tests/images/fli_oob/02r/reproducing Tests/images/fli_oob/03r/03r00.fli Tests/images/fli_oob/03r/notes Tests/images/fli_oob/03r/others/03r01.fli Tests/images/fli_oob/03r/others/03r02.fli Tests/images/fli_oob/03r/others/03r03.fli Tests/images/fli_oob/03r/others/03r04.fli Tests/images/fli_oob/03r/others/03r05.fli Tests/images/fli_oob/03r/others/03r06.fli Tests/images/fli_oob/03r/others/03r07.fli Tests/images/fli_oob/03r/others/03r08.fli Tests/images/fli_oob/03r/others/03r09.fli Tests/images/fli_oob/03r/others/03r10.fli Tests/images/fli_oob/03r/others/03r11.fli Tests/images/fli_oob/03r/reproducing Tests/images/fli_oob/04r/04r00.fli Tests/images/fli_oob/04r/initial.fli Tests/images/fli_oob/04r/notes Tests/images/fli_oob/04r/others/04r01.fli Tests/images/fli_oob/04r/others/04r02.fli Tests/images/fli_oob/04r/others/04r03.fli Tests/images/fli_oob/04r/others/04r04.fli Tests/images/fli_oob/04r/others/04r05.fli Tests/images/fli_oob/04r/reproducing Tests/images/fli_oob/05r/05r00.fli Tests/images/fli_oob/05r/notes Tests/images/fli_oob/05r/others/05r01.fli Tests/images/fli_oob/05r/others/05r02.fli Tests/images/fli_oob/05r/others/05r03.fli Tests/images/fli_oob/05r/others/05r04.fli Tests/images/fli_oob/05r/others/05r05.fli Tests/images/fli_oob/05r/others/05r06.fli Tests/images/fli_oob/05r/others/05r07.fli Tests/images/fli_oob/05r/reproducing Tests/images/fli_oob/06r/06r00.fli Tests/images/fli_oob/06r/notes Tests/images/fli_oob/06r/others/06r01.fli Tests/images/fli_oob/06r/others/06r02.fli Tests/images/fli_oob/06r/others/06r03.fli Tests/images/fli_oob/06r/others/06r04.fli Tests/images/fli_oob/06r/reproducing Tests/images/fli_oob/patch0/000000 Tests/images/fli_oob/patch0/000001 Tests/images/fli_oob/patch0/000002 Tests/images/fli_oob/patch0/000003 Tests/images/fli_overflow.fli Tests/images/fli_overrun.bin Tests/images/fli_overrun2.bin Tests/images/flower.jpg Tests/images/flower.webp Tests/images/flower2.jpg Tests/images/flower2.webp Tests/images/frozenpond.mpo Tests/images/ftex_dxt1.ftc Tests/images/ftex_dxt1.png Tests/images/ftex_uncompressed.ftu Tests/images/ftex_uncompressed.png Tests/images/fujifilm.mpo Tests/images/g4-fillorder-test.png Tests/images/g4-fillorder-test.tif Tests/images/g4-multi.tiff Tests/images/g4_orientation_1.tif Tests/images/g4_orientation_2.tif Tests/images/g4_orientation_3.tif Tests/images/g4_orientation_4.tif Tests/images/g4_orientation_5.tif Tests/images/g4_orientation_6.tif Tests/images/g4_orientation_7.tif Tests/images/g4_orientation_8.tif Tests/images/gbr.gbr Tests/images/gbr.png Tests/images/gfs.t06z.rassda.tm00.bufr_d Tests/images/gif_header_data.pkl Tests/images/gimp_gradient.ggr Tests/images/gimp_gradient_with_name.ggr Tests/images/hdf5.h5 Tests/images/high_ascii_chars.png Tests/images/hopper-XYZ.png Tests/images/hopper.Lab.tif Tests/images/hopper.bmp Tests/images/hopper.bw Tests/images/hopper.dcx Tests/images/hopper.fits Tests/images/hopper.fli Tests/images/hopper.gd Tests/images/hopper.gif Tests/images/hopper.iccprofile.tif Tests/images/hopper.iccprofile_binary.tif Tests/images/hopper.ico Tests/images/hopper.im Tests/images/hopper.jpg Tests/images/hopper.mic Tests/images/hopper.msp Tests/images/hopper.p7 Tests/images/hopper.pcd Tests/images/hopper.png Tests/images/hopper.pnm Tests/images/hopper.ppm Tests/images/hopper.psd Tests/images/hopper.pxr Tests/images/hopper.ras Tests/images/hopper.rgb Tests/images/hopper.sgi Tests/images/hopper.spider Tests/images/hopper.tar Tests/images/hopper.tif Tests/images/hopper.wal Tests/images/hopper.webp Tests/images/hopper.xbm Tests/images/hopper.xpm Tests/images/hopper16.rgb Tests/images/hopper_16bit_qtables.jpg Tests/images/hopper_256x256.ico Tests/images/hopper_45.png Tests/images/hopper_bad.p7 Tests/images/hopper_bad_checksum.msp Tests/images/hopper_bad_exif.jpg Tests/images/hopper_bw_500.png Tests/images/hopper_draw.ico Tests/images/hopper_emboss.bmp Tests/images/hopper_emboss_more.bmp Tests/images/hopper_g4.tif Tests/images/hopper_g4_500.tif Tests/images/hopper_gray.jpg Tests/images/hopper_gray_4bpp.tif Tests/images/hopper_idat_after_image_end.png Tests/images/hopper_jpg.tif Tests/images/hopper_long_name.im Tests/images/hopper_lzw.tif Tests/images/hopper_merged.psd Tests/images/hopper_orientation_2.jpg Tests/images/hopper_orientation_2.webp Tests/images/hopper_orientation_3.jpg Tests/images/hopper_orientation_3.webp Tests/images/hopper_orientation_4.jpg Tests/images/hopper_orientation_4.webp Tests/images/hopper_orientation_5.jpg Tests/images/hopper_orientation_5.webp Tests/images/hopper_orientation_6.jpg Tests/images/hopper_orientation_6.webp Tests/images/hopper_orientation_7.jpg Tests/images/hopper_orientation_7.webp Tests/images/hopper_orientation_8.jpg Tests/images/hopper_orientation_8.webp Tests/images/hopper_roundDown.bmp Tests/images/hopper_roundDown_2.tif Tests/images/hopper_roundDown_3.tif Tests/images/hopper_roundDown_None.tif Tests/images/hopper_roundUp_2.tif Tests/images/hopper_roundUp_3.tif Tests/images/hopper_roundUp_None.tif Tests/images/hopper_underscore.xbm Tests/images/hopper_unexpected.ico Tests/images/hopper_unknown_pixel_mode.tif Tests/images/hopper_webp_bits.ppm Tests/images/hopper_webp_write.ppm Tests/images/hopper_zero_comment_subblocks.gif Tests/images/i_trns.png Tests/images/icc-after-SOF.jpg Tests/images/icc_profile.png Tests/images/icc_profile_big.jpg Tests/images/icc_profile_none.png Tests/images/ifd_tag_type.tiff Tests/images/illu10_no_preview.eps Tests/images/illu10_preview.eps Tests/images/illuCS6_no_preview.eps Tests/images/illuCS6_preview.eps Tests/images/imagedraw/line_horizontal_slope1px_w2px.png Tests/images/imagedraw/line_horizontal_w101px.png Tests/images/imagedraw/line_horizontal_w2px_inverted.png Tests/images/imagedraw/line_horizontal_w2px_normal.png Tests/images/imagedraw/line_horizontal_w3px.png Tests/images/imagedraw/line_oblique_45_w3px_a.png Tests/images/imagedraw/line_oblique_45_w3px_b.png Tests/images/imagedraw/line_vertical_slope1px_w2px.png Tests/images/imagedraw/line_vertical_w101px.png Tests/images/imagedraw/line_vertical_w2px_inverted.png Tests/images/imagedraw/line_vertical_w2px_normal.png Tests/images/imagedraw/line_vertical_w3px.png Tests/images/imagedraw/square.png Tests/images/imagedraw/triangle_right.png Tests/images/imagedraw2_text.png Tests/images/imagedraw_arc.png Tests/images/imagedraw_arc_end_le_start.png Tests/images/imagedraw_arc_high.png Tests/images/imagedraw_arc_no_loops.png Tests/images/imagedraw_arc_width.png Tests/images/imagedraw_arc_width_fill.png Tests/images/imagedraw_arc_width_non_whole_angle.png Tests/images/imagedraw_arc_width_pieslice.png Tests/images/imagedraw_big_rectangle.png Tests/images/imagedraw_bitmap.png Tests/images/imagedraw_chord_L.png Tests/images/imagedraw_chord_RGB.png Tests/images/imagedraw_chord_too_fat.png Tests/images/imagedraw_chord_width.png Tests/images/imagedraw_chord_width_fill.png Tests/images/imagedraw_chord_zero_width.png Tests/images/imagedraw_ellipse_L.png Tests/images/imagedraw_ellipse_RGB.png Tests/images/imagedraw_ellipse_edge.png Tests/images/imagedraw_ellipse_translucent.png Tests/images/imagedraw_ellipse_various_sizes.png Tests/images/imagedraw_ellipse_various_sizes_filled.png Tests/images/imagedraw_ellipse_width.png Tests/images/imagedraw_ellipse_width_fill.png Tests/images/imagedraw_ellipse_width_large.png Tests/images/imagedraw_ellipse_zero_width.png Tests/images/imagedraw_floodfill2.png Tests/images/imagedraw_floodfill_L.png Tests/images/imagedraw_floodfill_RGB.png Tests/images/imagedraw_floodfill_RGBA.png Tests/images/imagedraw_floodfill_not_negative.png Tests/images/imagedraw_line.png Tests/images/imagedraw_line_joint_curve.png Tests/images/imagedraw_outline_chord_L.png Tests/images/imagedraw_outline_chord_RGB.png Tests/images/imagedraw_outline_ellipse_L.png Tests/images/imagedraw_outline_ellipse_RGB.png Tests/images/imagedraw_outline_pieslice_L.png Tests/images/imagedraw_outline_pieslice_RGB.png Tests/images/imagedraw_outline_polygon_L.png Tests/images/imagedraw_outline_polygon_RGB.png Tests/images/imagedraw_outline_rectangle_L.png Tests/images/imagedraw_outline_rectangle_RGB.png Tests/images/imagedraw_outline_shape_L.png Tests/images/imagedraw_outline_shape_RGB.png Tests/images/imagedraw_pieslice.png Tests/images/imagedraw_pieslice_wide.png Tests/images/imagedraw_pieslice_width.png Tests/images/imagedraw_pieslice_width_fill.png Tests/images/imagedraw_pieslice_zero_width.png Tests/images/imagedraw_point.png Tests/images/imagedraw_polygon.png Tests/images/imagedraw_polygon_1px_high.png Tests/images/imagedraw_polygon_kite_L.png Tests/images/imagedraw_polygon_kite_RGB.png Tests/images/imagedraw_rectangle.png Tests/images/imagedraw_rectangle_I.png Tests/images/imagedraw_rectangle_width.png Tests/images/imagedraw_rectangle_width_fill.png Tests/images/imagedraw_rectangle_zero_width.png Tests/images/imagedraw_regular_octagon.png Tests/images/imagedraw_shape1.png Tests/images/imagedraw_shape2.png Tests/images/imagedraw_square.png Tests/images/imagedraw_square_rotate_45.png Tests/images/imagedraw_stroke_descender.png Tests/images/imagedraw_stroke_different.png Tests/images/imagedraw_stroke_multiline.png Tests/images/imagedraw_stroke_same.png Tests/images/imagedraw_wide_line_dot.png Tests/images/imagedraw_wide_line_larger_than_int.png Tests/images/imageops_pad_h_0.jpg Tests/images/imageops_pad_h_1.jpg Tests/images/imageops_pad_h_2.jpg Tests/images/imageops_pad_v_0.jpg Tests/images/imageops_pad_v_1.jpg Tests/images/imageops_pad_v_2.jpg Tests/images/input_bw_five_bands.fpx Tests/images/invalid-exif-without-x-resolution.jpg Tests/images/invalid-exif.jpg Tests/images/invalid.spider Tests/images/iptc.jpg Tests/images/iptc_roundDown.jpg Tests/images/iptc_roundUp.jpg Tests/images/iss634.apng Tests/images/iss634.gif Tests/images/iss634.webp Tests/images/issue_2278.tif Tests/images/issue_2811.gif Tests/images/itxt_chunks.png Tests/images/jpeg_ff00_header.jpg Tests/images/junk_jpeg_header.jpg Tests/images/l2rgb_read.bmp Tests/images/l_trns.png Tests/images/la.tga Tests/images/lab-green.tif Tests/images/lab-red.tif Tests/images/lab.tif Tests/images/libtiff_segfault.tif Tests/images/linear_gradient.png Tests/images/morph_a.png Tests/images/multiline_text.png Tests/images/multiline_text_center.png Tests/images/multiline_text_right.png Tests/images/multiline_text_spacing.png Tests/images/multipage-lastframe.tif Tests/images/multipage-mmap.tiff Tests/images/multipage.tiff Tests/images/negative_size.ppm Tests/images/no-dpi-in-exif.jpg Tests/images/no_cursors.cur Tests/images/no_rows_per_strip.tif Tests/images/non_zero_bb.eps Tests/images/non_zero_bb.png Tests/images/non_zero_bb_scale2.png Tests/images/old-style-jpeg-compression.png Tests/images/old-style-jpeg-compression.tif Tests/images/p_trns_single.png Tests/images/pcx_overrun.bin Tests/images/pcx_overrun2.bin Tests/images/photoshop-200dpi-broken.jpg Tests/images/photoshop-200dpi.jpg Tests/images/pil123p.png Tests/images/pil123rgba.png Tests/images/pil136.png Tests/images/pil136.tiff Tests/images/pil168.png Tests/images/pil168.tif Tests/images/pil184.pcx Tests/images/pil_sample_cmyk.eps Tests/images/pil_sample_cmyk.jpg Tests/images/pil_sample_rgb.jpg Tests/images/pillow.icns Tests/images/pillow.ico Tests/images/pillow2.icns Tests/images/pillow3.icns Tests/images/png_decompression_dos.png Tests/images/pngtest_bad.png.bin Tests/images/pport_g4.tif Tests/images/python.ico Tests/images/radial_gradient.png Tests/images/radial_gradients.png Tests/images/raw_negative_stride.bin Tests/images/rdf.tif Tests/images/rectangle_surrounding_text.png Tests/images/reqd_showpage.eps Tests/images/reqd_showpage.png Tests/images/rgb.jpg Tests/images/rgb32bf-rgba.bmp Tests/images/rgb32rle.tga Tests/images/rgb_trns.png Tests/images/rgb_trns_ycbc.j2k Tests/images/rgb_trns_ycbc.jp2 Tests/images/rotate_45_no_fill.png Tests/images/rotate_45_with_fill.png Tests/images/sgi_crash.bin Tests/images/sgi_overrun.bin Tests/images/sgi_overrun_expandrow.bin Tests/images/sgi_overrun_expandrow2.bin Tests/images/sgi_overrun_expandrowF04.bin Tests/images/standard_embedded.png Tests/images/sugarshack.mpo Tests/images/sugarshack_bad_mpo_header.jpg Tests/images/sugarshack_frame_size.mpo Tests/images/sugarshack_ifd_offset.mpo Tests/images/sugarshack_no_data.mpo Tests/images/sunraster.im1 Tests/images/sunraster.im1.png Tests/images/tRNS_null_1x1.png Tests/images/test-card-lossless.jp2 Tests/images/test-card-lossy-tiled.jp2 Tests/images/test-card.png Tests/images/test-ole-file.doc Tests/images/test.colors.gif Tests/images/test.gpl Tests/images/test_Nastalifont_text.png Tests/images/test_anchor_multiline_lm_center.png Tests/images/test_anchor_multiline_lm_left.png Tests/images/test_anchor_multiline_lm_right.png Tests/images/test_anchor_multiline_ma_center.png Tests/images/test_anchor_multiline_md_center.png Tests/images/test_anchor_multiline_mm_center.png Tests/images/test_anchor_multiline_mm_left.png Tests/images/test_anchor_multiline_mm_right.png Tests/images/test_anchor_multiline_rm_center.png Tests/images/test_anchor_multiline_rm_left.png Tests/images/test_anchor_multiline_rm_right.png Tests/images/test_anchor_quick_ls.png Tests/images/test_anchor_quick_ma.png Tests/images/test_anchor_quick_mb.png Tests/images/test_anchor_quick_md.png Tests/images/test_anchor_quick_mm.png Tests/images/test_anchor_quick_ms.png Tests/images/test_anchor_quick_mt.png Tests/images/test_anchor_quick_rs.png Tests/images/test_anchor_ttb_f_lt.png Tests/images/test_anchor_ttb_f_mm.png Tests/images/test_anchor_ttb_f_rb.png Tests/images/test_anchor_ttb_f_sm.png Tests/images/test_arabictext_features.png Tests/images/test_combine_caron.png Tests/images/test_combine_caron_below.png Tests/images/test_combine_caron_below_lb.png Tests/images/test_combine_caron_below_ld.png Tests/images/test_combine_caron_below_ls.png Tests/images/test_combine_caron_below_ttb.png Tests/images/test_combine_caron_below_ttb_lb.png Tests/images/test_combine_caron_la.png Tests/images/test_combine_caron_ls.png Tests/images/test_combine_caron_lt.png Tests/images/test_combine_caron_ttb.png Tests/images/test_combine_caron_ttb_lt.png Tests/images/test_combine_double_breve_below.png Tests/images/test_combine_double_breve_below_ma.png Tests/images/test_combine_double_breve_below_ra.png Tests/images/test_combine_double_breve_below_ttb.png Tests/images/test_combine_double_breve_below_ttb_mt.png Tests/images/test_combine_double_breve_below_ttb_rt.png Tests/images/test_combine_double_breve_below_ttb_st.png Tests/images/test_combine_multiline_lm_center.png Tests/images/test_combine_multiline_lm_left.png Tests/images/test_combine_multiline_lm_right.png Tests/images/test_combine_multiline_mm_center.png Tests/images/test_combine_multiline_mm_left.png Tests/images/test_combine_multiline_mm_right.png Tests/images/test_combine_multiline_rm_center.png Tests/images/test_combine_multiline_rm_left.png Tests/images/test_combine_multiline_rm_right.png Tests/images/test_combine_overline.png Tests/images/test_combine_overline_la.png Tests/images/test_combine_overline_ra.png Tests/images/test_combine_overline_ttb.png Tests/images/test_combine_overline_ttb_mt.png Tests/images/test_combine_overline_ttb_rt.png Tests/images/test_combine_overline_ttb_st.png Tests/images/test_complex_unicode_text.png Tests/images/test_complex_unicode_text2.png Tests/images/test_direction_ltr.png Tests/images/test_direction_rtl.png Tests/images/test_direction_ttb.png Tests/images/test_direction_ttb_stroke.png Tests/images/test_draw_pbm_target.png Tests/images/test_draw_pbm_ter_en_target.png Tests/images/test_draw_pbm_ter_pl_target.png Tests/images/test_extents.gif Tests/images/test_kerning_features.png Tests/images/test_language.png Tests/images/test_ligature_features.png Tests/images/test_text.png Tests/images/test_x_max_and_y_offset.png Tests/images/test_y_offset.png Tests/images/text_mono.gif Tests/images/tga/common/1x1_l.png Tests/images/tga/common/1x1_l_bl_raw.tga Tests/images/tga/common/1x1_l_bl_rle.tga Tests/images/tga/common/1x1_l_tl_raw.tga Tests/images/tga/common/1x1_l_tl_rle.tga Tests/images/tga/common/200x32_l.png Tests/images/tga/common/200x32_l_bl_raw.tga Tests/images/tga/common/200x32_l_bl_rle.tga Tests/images/tga/common/200x32_l_tl_raw.tga Tests/images/tga/common/200x32_l_tl_rle.tga Tests/images/tga/common/200x32_la.png Tests/images/tga/common/200x32_la_bl_raw.tga Tests/images/tga/common/200x32_la_bl_rle.tga Tests/images/tga/common/200x32_la_tl_raw.tga Tests/images/tga/common/200x32_la_tl_rle.tga Tests/images/tga/common/200x32_p.png Tests/images/tga/common/200x32_p_bl_raw.tga Tests/images/tga/common/200x32_p_bl_rle.tga Tests/images/tga/common/200x32_p_tl_raw.tga Tests/images/tga/common/200x32_p_tl_rle.tga Tests/images/tga/common/200x32_rgb.png Tests/images/tga/common/200x32_rgb_bl_raw.tga Tests/images/tga/common/200x32_rgb_bl_rle.tga Tests/images/tga/common/200x32_rgb_tl_raw.tga Tests/images/tga/common/200x32_rgb_tl_rle.tga Tests/images/tga/common/200x32_rgba.png Tests/images/tga/common/200x32_rgba_bl_raw.tga Tests/images/tga/common/200x32_rgba_bl_rle.tga Tests/images/tga/common/200x32_rgba_tl_raw.tga Tests/images/tga/common/200x32_rgba_tl_rle.tga Tests/images/tga/common/readme.txt Tests/images/tga_id_field.tga Tests/images/tiff_16bit_RGB.tiff Tests/images/tiff_16bit_RGB_target.png Tests/images/tiff_16bit_RGBa.tiff Tests/images/tiff_16bit_RGBa_target.png Tests/images/tiff_adobe_deflate.png Tests/images/tiff_adobe_deflate.tif Tests/images/tiff_gray_2_4_bpp/hopper2.tif Tests/images/tiff_gray_2_4_bpp/hopper2I.tif Tests/images/tiff_gray_2_4_bpp/hopper2IR.tif Tests/images/tiff_gray_2_4_bpp/hopper2R.tif Tests/images/tiff_gray_2_4_bpp/hopper4.tif Tests/images/tiff_gray_2_4_bpp/hopper4I.tif Tests/images/tiff_gray_2_4_bpp/hopper4IR.tif Tests/images/tiff_gray_2_4_bpp/hopper4R.tif Tests/images/tiff_overflow_rows_per_strip.tif Tests/images/tiff_strip_cmyk_16l_jpeg.tif Tests/images/tiff_strip_cmyk_jpeg.tif Tests/images/tiff_strip_planar_raw.tif Tests/images/tiff_strip_planar_raw_with_overviews.tif Tests/images/tiff_strip_raw.tif Tests/images/tiff_strip_ycbcr_jpeg_1x1_sampling.tif Tests/images/tiff_strip_ycbcr_jpeg_2x2_sampling.tif Tests/images/tiff_tiled_cmyk_jpeg.tif Tests/images/tiff_tiled_planar_raw.tif Tests/images/tiff_tiled_raw.tif Tests/images/tiff_tiled_ycbcr_jpeg_1x1_sampling.tif Tests/images/tiff_tiled_ycbcr_jpeg_2x2_sampling.tif Tests/images/tiff_wrong_bits_per_sample.tiff Tests/images/total-pages-zero.tif Tests/images/transparent.gif Tests/images/transparent.png Tests/images/transparent.sgi Tests/images/transparent.webp Tests/images/transparent_background_text.png Tests/images/truncated_image.png Tests/images/truncated_jpeg.jpg Tests/images/tv.rgb Tests/images/tv16.sgi Tests/images/uint16_1_4660.tif Tests/images/unbound_variable.jp2 Tests/images/uncompressed_rgb.dds Tests/images/uncompressed_rgb.png Tests/images/unicode_extended.png Tests/images/unimplemented_dxgi_format.dds Tests/images/unimplemented_pixel_format.dds Tests/images/variation_adobe.png Tests/images/variation_adobe_axes.png Tests/images/variation_adobe_name.png Tests/images/variation_adobe_older_harfbuzz.png Tests/images/variation_adobe_older_harfbuzz_axes.png Tests/images/variation_adobe_older_harfbuzz_name.png Tests/images/variation_tiny.png Tests/images/variation_tiny_axes.png Tests/images/variation_tiny_name.png Tests/images/xmp_tags_orientation.png Tests/images/zero_bb.eps Tests/images/zero_bb.png Tests/images/zero_bb_emptyline.eps Tests/images/zero_bb_scale2.png Tests/test_000_sanity.py Tests/test_binary.py Tests/test_bmp_reference.py Tests/test_box_blur.py Tests/test_color_lut.py Tests/test_core_resources.py Tests/test_decompression_bomb.py Tests/test_features.py Tests/test_file_apng.py Tests/test_file_blp.py Tests/test_file_bmp.py Tests/test_file_bufrstub.py Tests/test_file_container.py Tests/test_file_cur.py Tests/test_file_dcx.py Tests/test_file_dds.py Tests/test_file_eps.py Tests/test_file_fitsstub.py Tests/test_file_fli.py Tests/test_file_fpx.py Tests/test_file_ftex.py Tests/test_file_gbr.py Tests/test_file_gd.py Tests/test_file_gif.py Tests/test_file_gimpgradient.py Tests/test_file_gimppalette.py Tests/test_file_gribstub.py Tests/test_file_hdf5stub.py Tests/test_file_icns.py Tests/test_file_ico.py Tests/test_file_im.py Tests/test_file_iptc.py Tests/test_file_jpeg.py Tests/test_file_jpeg2k.py Tests/test_file_libtiff.py Tests/test_file_libtiff_small.py Tests/test_file_mcidas.py Tests/test_file_mic.py Tests/test_file_mpo.py Tests/test_file_msp.py Tests/test_file_palm.py Tests/test_file_pcd.py Tests/test_file_pcx.py Tests/test_file_pdf.py Tests/test_file_pixar.py Tests/test_file_png.py Tests/test_file_ppm.py Tests/test_file_psd.py Tests/test_file_sgi.py Tests/test_file_spider.py Tests/test_file_sun.py Tests/test_file_tar.py Tests/test_file_tga.py Tests/test_file_tiff.py Tests/test_file_tiff_metadata.py Tests/test_file_wal.py Tests/test_file_webp.py Tests/test_file_webp_alpha.py Tests/test_file_webp_animated.py Tests/test_file_webp_lossless.py Tests/test_file_webp_metadata.py Tests/test_file_wmf.py Tests/test_file_xbm.py Tests/test_file_xpm.py Tests/test_file_xvthumb.py Tests/test_font_bdf.py Tests/test_font_leaks.py Tests/test_font_pcf.py Tests/test_font_pcf_charsets.py Tests/test_format_hsv.py Tests/test_format_lab.py Tests/test_image.py Tests/test_image_access.py Tests/test_image_array.py Tests/test_image_convert.py Tests/test_image_copy.py Tests/test_image_crop.py Tests/test_image_draft.py Tests/test_image_entropy.py Tests/test_image_filter.py Tests/test_image_frombytes.py Tests/test_image_fromqimage.py Tests/test_image_getbands.py Tests/test_image_getbbox.py Tests/test_image_getcolors.py Tests/test_image_getdata.py Tests/test_image_getextrema.py Tests/test_image_getim.py Tests/test_image_getpalette.py Tests/test_image_getprojection.py Tests/test_image_histogram.py Tests/test_image_load.py Tests/test_image_mode.py Tests/test_image_paste.py Tests/test_image_point.py Tests/test_image_putalpha.py Tests/test_image_putdata.py Tests/test_image_putpalette.py Tests/test_image_quantize.py Tests/test_image_reduce.py Tests/test_image_resample.py Tests/test_image_resize.py Tests/test_image_rotate.py Tests/test_image_split.py Tests/test_image_thumbnail.py Tests/test_image_tobitmap.py Tests/test_image_tobytes.py Tests/test_image_transform.py Tests/test_image_transpose.py Tests/test_imagechops.py Tests/test_imagecms.py Tests/test_imagecolor.py Tests/test_imagedraw.py Tests/test_imagedraw2.py Tests/test_imageenhance.py Tests/test_imagefile.py Tests/test_imagefont.py Tests/test_imagefontctl.py Tests/test_imagegrab.py Tests/test_imagemath.py Tests/test_imagemorph.py Tests/test_imageops.py Tests/test_imageops_usm.py Tests/test_imagepalette.py Tests/test_imagepath.py Tests/test_imageqt.py Tests/test_imagesequence.py Tests/test_imageshow.py Tests/test_imagestat.py Tests/test_imagetk.py Tests/test_imagewin.py Tests/test_imagewin_pointers.py Tests/test_lib_image.py Tests/test_lib_pack.py Tests/test_locale.py Tests/test_main.py Tests/test_map.py Tests/test_mode_i16.py Tests/test_numpy.py Tests/test_pdfparser.py Tests/test_pickle.py Tests/test_psdraw.py Tests/test_pyroma.py Tests/test_qt_image_fromqpixmap.py Tests/test_qt_image_toqimage.py Tests/test_qt_image_toqpixmap.py Tests/test_sgi_crash.py Tests/test_shell_injection.py Tests/test_tiff_crashes.py Tests/test_tiff_ifdrational.py Tests/test_uploader.py Tests/test_util.py Tests/test_webp_leaks.py codecov.yml conftest.py depends/README.rst depends/diffcover-install.sh depends/diffcover-run.sh depends/download-and-extract.sh depends/install_extra_test_images.sh depends/install_imagequant.sh depends/install_openjpeg.sh depends/install_raqm.sh depends/install_raqm_cmake.sh depends/install_webp.sh depends/termux.sh docs/COPYING docs/Guardfile docs/Makefile docs/PIL.rst docs/about.rst docs/conf.py docs/deprecations.rst docs/example/DdsImagePlugin.py docs/example/anchors.png docs/example/anchors.py docs/handbook/appendices.rst docs/handbook/concepts.rst docs/handbook/image-file-formats.rst docs/handbook/index.rst docs/handbook/overview.rst docs/handbook/text-anchors.rst docs/handbook/tutorial.rst docs/handbook/writing-your-own-file-decoder.rst docs/index.rst docs/installation.rst docs/make.bat docs/porting.rst docs/reference/ExifTags.rst docs/reference/Image.rst docs/reference/ImageChops.rst docs/reference/ImageCms.rst docs/reference/ImageColor.rst docs/reference/ImageDraw.rst docs/reference/ImageEnhance.rst docs/reference/ImageFile.rst docs/reference/ImageFilter.rst docs/reference/ImageFont.rst docs/reference/ImageGrab.rst docs/reference/ImageMath.rst docs/reference/ImageMorph.rst docs/reference/ImageOps.rst docs/reference/ImagePalette.rst docs/reference/ImagePath.rst docs/reference/ImageQt.rst docs/reference/ImageSequence.rst docs/reference/ImageShow.rst docs/reference/ImageStat.rst docs/reference/ImageTk.rst docs/reference/ImageWin.rst docs/reference/JpegPresets.rst docs/reference/PSDraw.rst docs/reference/PixelAccess.rst docs/reference/PyAccess.rst docs/reference/TiffTags.rst docs/reference/block_allocator.rst docs/reference/features.rst docs/reference/index.rst docs/reference/internal_design.rst docs/reference/internal_modules.rst docs/reference/limits.rst docs/reference/open_files.rst docs/reference/plugins.rst docs/releasenotes/2.7.0.rst docs/releasenotes/2.8.0.rst docs/releasenotes/3.0.0.rst docs/releasenotes/3.1.0.rst docs/releasenotes/3.1.1.rst docs/releasenotes/3.1.2.rst docs/releasenotes/3.2.0.rst docs/releasenotes/3.3.0.rst docs/releasenotes/3.3.2.rst docs/releasenotes/3.4.0.rst docs/releasenotes/4.0.0.rst docs/releasenotes/4.1.0.rst docs/releasenotes/4.1.1.rst docs/releasenotes/4.2.0.rst docs/releasenotes/4.2.1.rst docs/releasenotes/4.3.0.rst docs/releasenotes/5.0.0.rst docs/releasenotes/5.1.0.rst docs/releasenotes/5.2.0.rst docs/releasenotes/5.3.0.rst docs/releasenotes/5.4.0.rst docs/releasenotes/5.4.1.rst docs/releasenotes/6.0.0.rst docs/releasenotes/6.1.0.rst docs/releasenotes/6.2.0.rst docs/releasenotes/6.2.1.rst docs/releasenotes/6.2.2.rst docs/releasenotes/7.0.0.rst docs/releasenotes/7.1.0.rst docs/releasenotes/7.1.1.rst docs/releasenotes/7.1.2.rst docs/releasenotes/7.2.0.rst docs/releasenotes/8.0.0.rst docs/releasenotes/8.0.1.rst docs/releasenotes/index.rst docs/releasenotes/template.rst docs/resources/anchor_horizontal.svg docs/resources/anchor_vertical.svg docs/resources/css/dark.css docs/resources/favicon.ico docs/resources/js/script.js requirements.txt selftest.py setup.cfg setup.py src/PIL/BdfFontFile.py src/PIL/BlpImagePlugin.py src/PIL/BmpImagePlugin.py src/PIL/BufrStubImagePlugin.py src/PIL/ContainerIO.py src/PIL/CurImagePlugin.py src/PIL/DcxImagePlugin.py src/PIL/DdsImagePlugin.py src/PIL/EpsImagePlugin.py src/PIL/ExifTags.py src/PIL/FitsStubImagePlugin.py src/PIL/FliImagePlugin.py src/PIL/FontFile.py src/PIL/FpxImagePlugin.py src/PIL/FtexImagePlugin.py src/PIL/GbrImagePlugin.py src/PIL/GdImageFile.py src/PIL/GifImagePlugin.py src/PIL/GimpGradientFile.py src/PIL/GimpPaletteFile.py src/PIL/GribStubImagePlugin.py src/PIL/Hdf5StubImagePlugin.py src/PIL/IcnsImagePlugin.py src/PIL/IcoImagePlugin.py src/PIL/ImImagePlugin.py src/PIL/Image.py src/PIL/ImageChops.py src/PIL/ImageCms.py src/PIL/ImageColor.py src/PIL/ImageDraw.py src/PIL/ImageDraw2.py src/PIL/ImageEnhance.py src/PIL/ImageFile.py src/PIL/ImageFilter.py src/PIL/ImageFont.py src/PIL/ImageGrab.py src/PIL/ImageMath.py src/PIL/ImageMode.py src/PIL/ImageMorph.py src/PIL/ImageOps.py src/PIL/ImagePalette.py src/PIL/ImagePath.py src/PIL/ImageQt.py src/PIL/ImageSequence.py src/PIL/ImageShow.py src/PIL/ImageStat.py src/PIL/ImageTk.py src/PIL/ImageTransform.py src/PIL/ImageWin.py src/PIL/ImtImagePlugin.py src/PIL/IptcImagePlugin.py src/PIL/Jpeg2KImagePlugin.py src/PIL/JpegImagePlugin.py src/PIL/JpegPresets.py src/PIL/McIdasImagePlugin.py src/PIL/MicImagePlugin.py src/PIL/MpegImagePlugin.py src/PIL/MpoImagePlugin.py src/PIL/MspImagePlugin.py src/PIL/PSDraw.py src/PIL/PaletteFile.py src/PIL/PalmImagePlugin.py src/PIL/PcdImagePlugin.py src/PIL/PcfFontFile.py src/PIL/PcxImagePlugin.py src/PIL/PdfImagePlugin.py src/PIL/PdfParser.py src/PIL/PixarImagePlugin.py src/PIL/PngImagePlugin.py src/PIL/PpmImagePlugin.py src/PIL/PsdImagePlugin.py src/PIL/PyAccess.py src/PIL/SgiImagePlugin.py src/PIL/SpiderImagePlugin.py src/PIL/SunImagePlugin.py src/PIL/TarIO.py src/PIL/TgaImagePlugin.py src/PIL/TiffImagePlugin.py src/PIL/TiffTags.py src/PIL/WalImageFile.py src/PIL/WebPImagePlugin.py src/PIL/WmfImagePlugin.py src/PIL/XVThumbImagePlugin.py src/PIL/XbmImagePlugin.py src/PIL/XpmImagePlugin.py src/PIL/__init__.py src/PIL/__main__.py src/PIL/_binary.py src/PIL/_tkinter_finder.py src/PIL/_util.py src/PIL/_version.py src/PIL/features.py src/Tk/_tkmini.h src/Tk/tkImaging.c src/_imaging.c src/_imagingcms.c src/_imagingft.c src/_imagingmath.c src/_imagingmorph.c src/_imagingtk.c src/_webp.c src/decode.c src/display.c src/encode.c src/libImaging/Access.c src/libImaging/AlphaComposite.c src/libImaging/Bands.c src/libImaging/BcnDecode.c src/libImaging/Bit.h src/libImaging/BitDecode.c src/libImaging/Blend.c src/libImaging/BoxBlur.c src/libImaging/Chops.c src/libImaging/ColorLUT.c src/libImaging/Convert.c src/libImaging/ConvertYCbCr.c src/libImaging/Copy.c src/libImaging/Crop.c src/libImaging/Dib.c src/libImaging/Draw.c src/libImaging/Effects.c src/libImaging/EpsEncode.c src/libImaging/Except.c src/libImaging/File.c src/libImaging/Fill.c src/libImaging/Filter.c src/libImaging/FliDecode.c src/libImaging/Geometry.c src/libImaging/GetBBox.c src/libImaging/Gif.h src/libImaging/GifDecode.c src/libImaging/GifEncode.c src/libImaging/HexDecode.c src/libImaging/Histo.c src/libImaging/ImDib.h src/libImaging/ImPlatform.h src/libImaging/Imaging.h src/libImaging/ImagingUtils.h src/libImaging/Jpeg.h src/libImaging/Jpeg2K.h src/libImaging/Jpeg2KDecode.c src/libImaging/Jpeg2KEncode.c src/libImaging/JpegDecode.c src/libImaging/JpegEncode.c src/libImaging/Matrix.c src/libImaging/ModeFilter.c src/libImaging/Negative.c src/libImaging/Offset.c src/libImaging/Pack.c src/libImaging/PackDecode.c src/libImaging/Palette.c src/libImaging/Paste.c src/libImaging/PcdDecode.c src/libImaging/PcxDecode.c src/libImaging/PcxEncode.c src/libImaging/Point.c src/libImaging/Quant.c src/libImaging/QuantHash.c src/libImaging/QuantHash.h src/libImaging/QuantHeap.c src/libImaging/QuantHeap.h src/libImaging/QuantOctree.c src/libImaging/QuantOctree.h src/libImaging/QuantPngQuant.c src/libImaging/QuantPngQuant.h src/libImaging/QuantTypes.h src/libImaging/RankFilter.c src/libImaging/Raw.h src/libImaging/RawDecode.c src/libImaging/RawEncode.c src/libImaging/Reduce.c src/libImaging/Resample.c src/libImaging/Sgi.h src/libImaging/SgiRleDecode.c src/libImaging/Storage.c src/libImaging/SunRleDecode.c src/libImaging/TgaRleDecode.c src/libImaging/TgaRleEncode.c src/libImaging/TiffDecode.c src/libImaging/TiffDecode.h src/libImaging/Unpack.c src/libImaging/UnpackYCC.c src/libImaging/UnsharpMask.c src/libImaging/XbmDecode.c src/libImaging/XbmEncode.c src/libImaging/ZipCodecs.h src/libImaging/ZipDecode.c src/libImaging/ZipEncode.c src/libImaging/codec_fd.c src/libImaging/raqm.h src/map.c src/outline.c src/path.c tox.ini winbuild/README.md winbuild/build.rst winbuild/build_prepare.py winbuild/fribidi.cmake winbuild/raqm.cmake winbuild/tiff.opt <<<<<< network # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Quant.c.gcov -: 0:Source:src/libImaging/Quant.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Quant.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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 87% branch 3 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 92% branch 1 taken 8% (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% #####: 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 78% 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% #####: 1618: return ImagingError_ModeError(); call 0 never executed -: 1619: } -: 1620: 25: 1621: if (im->xsize > INT_MAX / im->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1622: return ImagingError_MemoryError(); call 0 never executed -: 1623: } -: 1624: /* malloc check ok, using calloc for final overflow, x*y above */ 25: 1625: p = calloc(im->xsize * im->ysize, sizeof(Pixel)); 25: 1626: if (!p) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1627: return ImagingError_MemoryError(); call 0 never executed -: 1628: } -: 1629: -: 1630: /* collect statistics */ -: 1631: -: 1632: /* FIXME: maybe we could load the hash tables directly from the -: 1633: image data? */ -: 1634: 25: 1635: if (!strcmp(im->mode, "L")) { branch 0 taken 4% (fallthrough) branch 1 taken 96% branch 2 taken 4% (fallthrough) branch 3 taken 96% -: 1636: /* greyscale */ -: 1637: -: 1638: /* FIXME: converting a "L" image to "P" with 256 colors -: 1639: should be done by a simple copy... */ -: 1640: 128: 1641: for (i = y = 0; y < im->ysize; y++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 16384: 1642: for (x = 0; x < im->xsize; x++, i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16384: 1643: p[i].c.r = p[i].c.g = p[i].c.b = im->image8[y][x]; 16384: 1644: p[i].c.a = 255; -: 1645: } -: 1646: } -: 1647: 24: 1648: } else if (!strcmp(im->mode, "P")) { branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 1649: /* palette */ -: 1650: #####: 1651: pp = im->palette->palette; -: 1652: #####: 1653: for (i = y = 0; y < im->ysize; y++) { branch 0 never executed branch 1 never executed #####: 1654: for (x = 0; x < im->xsize; x++, i++) { branch 0 never executed branch 1 never executed #####: 1655: v = im->image8[y][x]; #####: 1656: p[i].c.r = pp[v*4+0]; #####: 1657: p[i].c.g = pp[v*4+1]; #####: 1658: p[i].c.b = pp[v*4+2]; #####: 1659: p[i].c.a = pp[v*4+3]; -: 1660: } -: 1661: } -: 1662: 24: 1663: } else if (!strcmp(im->mode, "RGB") || !strcmp(im->mode, "RGBA")) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 46% (fallthrough) branch 7 taken 54% branch 8 taken 100% (fallthrough) branch 9 taken 0% -: 1664: /* true colour */ -: 1665: 3207: 1666: for (i = y = 0; y < im->ysize; y++) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 881337: 1667: for (x = 0; x < im->xsize; x++, i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 881337: 1668: p[i].v = im->image32[y][x]; -: 1669: } -: 1670: } -: 1671: -: 1672: } else { #####: 1673: free(p); #####: 1674: return (Imaging) ImagingError_ValueError("internal error"); call 0 never executed -: 1675: } -: 1676: 25: 1677: ImagingSectionEnter(&cookie); call 0 returned 100% -: 1678: 25: 1679: switch (mode) { branch 0 taken 48% branch 1 taken 0% branch 2 taken 48% branch 3 taken 4% branch 4 taken 0% -: 1680: case 0: -: 1681: /* median cut */ 12: 1682: result = quantize( call 0 returned 100% -: 1683: p, 12: 1684: im->xsize*im->ysize, -: 1685: colors, -: 1686: &palette, -: 1687: &paletteLength, -: 1688: &newData, -: 1689: kmeans -: 1690: ); 12: 1691: break; -: 1692: case 1: -: 1693: /* maximum coverage */ #####: 1694: result = quantize2( call 0 never executed -: 1695: p, #####: 1696: im->xsize*im->ysize, -: 1697: colors, -: 1698: &palette, -: 1699: &paletteLength, -: 1700: &newData, -: 1701: kmeans -: 1702: ); #####: 1703: break; -: 1704: case 2: 12: 1705: if (!strcmp(im->mode, "RGBA")) { branch 0 taken 92% (fallthrough) branch 1 taken 8% 11: 1706: withAlpha = 1; -: 1707: } 12: 1708: result = quantize_octree( call 0 returned 100% -: 1709: p, 12: 1710: im->xsize*im->ysize, -: 1711: colors, -: 1712: &palette, -: 1713: &paletteLength, -: 1714: &newData, -: 1715: withAlpha -: 1716: ); 12: 1717: break; -: 1718: case 3: -: 1719:#ifdef HAVE_LIBIMAGEQUANT 1: 1720: if (!strcmp(im->mode, "RGBA")) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1721: withAlpha = 1; -: 1722: } 2: 1723: result = quantize_pngquant( call 0 returned 100% -: 1724: p, 1: 1725: im->xsize, 1: 1726: im->ysize, -: 1727: colors, -: 1728: &palette, -: 1729: &paletteLength, -: 1730: &newData, -: 1731: withAlpha -: 1732: ); -: 1733:#else -: 1734: result = -1; -: 1735:#endif 1: 1736: break; -: 1737: default: -: 1738: result = 0; -: 1739: break; -: 1740: } -: 1741: 25: 1742: free(p); 25: 1743: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1744: 25: 1745: if (result > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 25: 1746: imOut = ImagingNewDirty("P", im->xsize, im->ysize); call 0 returned 100% 25: 1747: ImagingSectionEnter(&cookie); -: 1748: 3360: 1749: for (i = y = 0; y < im->ysize; y++) { call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% 897721: 1750: for (x = 0; x < im->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 897721: 1751: imOut->image8[y][x] = (unsigned char) newData[i++]; -: 1752: } -: 1753: } -: 1754: 25: 1755: free(newData); -: 1756: 25: 1757: pp = imOut->palette->palette; -: 1758: 5101: 1759: for (i = j = 0; i < (int) paletteLength; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 5076: 1760: *pp++ = palette[i].c.r; 5076: 1761: *pp++ = palette[i].c.g; 5076: 1762: *pp++ = palette[i].c.b; 5076: 1763: if (withAlpha) { branch 0 taken 55% (fallthrough) branch 1 taken 45% 2816: 1764: *pp++ = palette[i].c.a; -: 1765: } else { 2260: 1766: *pp++ = 255; -: 1767: } -: 1768: } 1324: 1769: for (; i < 256; i++) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 1324: 1770: *pp++ = 0; 1324: 1771: *pp++ = 0; 1324: 1772: *pp++ = 0; 1324: 1773: *pp++ = 255; -: 1774: } -: 1775: 25: 1776: if (withAlpha) { branch 0 taken 44% (fallthrough) branch 1 taken 56% 11: 1777: strcpy(imOut->palette->mode, "RGBA"); -: 1778: } -: 1779: 25: 1780: free(palette); 25: 1781: ImagingSectionLeave(&cookie); call 0 returned 100% -: 1782: 25: 1783: return imOut; -: 1784: -: 1785: } else { -: 1786: #####: 1787: if (result == -1) { branch 0 never executed branch 1 never executed #####: 1788: return (Imaging) ImagingError_ValueError( call 0 never executed -: 1789: "dependency required by this method was not " -: 1790: "enabled at compile time"); -: 1791: } -: 1792: #####: 1793: return (Imaging) ImagingError_ValueError("quantization error"); call 0 never executed -: 1794: -: 1795: } -: 1796:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Point.c.gcov -: 0:Source:src/libImaging/Point.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Point.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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-aarch64-3.6/src/libImaging/Offset.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#QuantOctree.c.gcov -: 0:Source:src/libImaging/QuantOctree.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/QuantOctree.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/QuantOctree.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* Copyright (c) 2010 Oliver Tonnhofer , Omniscale -: 2:// -: 3:// Permission is hereby granted, free of charge, to any person obtaining a copy -: 4:// of this software and associated documentation files (the "Software"), to deal -: 5:// in the Software without restriction, including without limitation the rights -: 6:// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -: 7:// copies of the Software, and to permit persons to whom the Software is -: 8:// furnished to do so, subject to the following conditions: -: 9:// -: 10:// The above copyright notice and this permission notice shall be included in -: 11:// all copies or substantial portions of the Software. -: 12:// -: 13:// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -: 14:// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -: 15:// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -: 16:// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -: 17:// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -: 18:// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -: 19:// THE SOFTWARE. -: 20:*/ -: 21: -: 22:/* -: 23:// This file implements a variation of the octree color quantization algorithm. -: 24:*/ -: 25: -: 26:#include -: 27:#include -: 28:#include -: 29:#include -: 30: -: 31:#include "ImagingUtils.h" -: 32:#include "QuantOctree.h" -: 33: -: 34:typedef struct _ColorBucket{ -: 35: /* contains palette index when used for look up cube */ -: 36: uint32_t count; -: 37: uint64_t r; -: 38: uint64_t g; -: 39: uint64_t b; -: 40: uint64_t a; -: 41:} *ColorBucket; -: 42: -: 43:typedef struct _ColorCube{ -: 44: unsigned int rBits, gBits, bBits, aBits; -: 45: unsigned int rWidth, gWidth, bWidth, aWidth; -: 46: unsigned int rOffset, gOffset, bOffset, aOffset; -: 47: -: 48: unsigned long size; -: 49: ColorBucket buckets; -: 50:} *ColorCube; -: 51: -: 52:#define MAX(a, b) (a)>(b) ? (a) : (b) -: 53: -: 54:static ColorCube function new_color_cube called 48 returned 100% blocks executed 67% 48: 55:new_color_cube(int r, int g, int b, int a) { -: 56: ColorCube cube; -: 57: -: 58: /* malloc check ok, small constant allocation */ 48: 59: cube = malloc(sizeof(struct _ColorCube)); 48: 60: if (!cube) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 61: return NULL; -: 62: } -: 63: 48: 64: cube->rBits = MAX(r, 0); 48: 65: cube->gBits = MAX(g, 0); 48: 66: cube->bBits = MAX(b, 0); 48: 67: cube->aBits = MAX(a, 0); -: 68: -: 69: /* overflow check for size multiplication below */ 48: 70: if (cube->rBits + cube->gBits + cube->bBits + cube->aBits > 31) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 71: free(cube); #####: 72: return NULL; -: 73: } -: 74: -: 75: /* the width of the cube for each dimension */ 48: 76: cube->rWidth = 1<rBits; 48: 77: cube->gWidth = 1<gBits; 48: 78: cube->bWidth = 1<bBits; 48: 79: cube->aWidth = 1<aBits; -: 80: -: 81: /* the offsets of each color */ -: 82: 48: 83: cube->rOffset = cube->gBits + cube->bBits + cube->aBits; 48: 84: cube->gOffset = cube->bBits + cube->aBits; 48: 85: cube->bOffset = cube->aBits; 48: 86: cube->aOffset = 0; -: 87: -: 88: /* the number of color buckets */ 48: 89: cube->size = cube->rWidth * cube->gWidth * cube->bWidth * cube->aWidth; -: 90: /* malloc check ok, overflow checked above */ 48: 91: cube->buckets = calloc(cube->size, sizeof(struct _ColorBucket)); -: 92: 48: 93: if (!cube->buckets) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 94: free(cube); #####: 95: return NULL; -: 96: } -: 97: return cube; -: 98:} -: 99: -: 100:static void function free_color_cube called 48 returned 100% blocks executed 100% 48: 101:free_color_cube(ColorCube cube) { 48: 102: if (cube != NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 48: 103: free(cube->buckets); 48: 104: free(cube); -: 105: } 48: 106:} -: 107: -: 108:static long -: 109:color_bucket_offset_pos(const ColorCube cube, -: 110: unsigned int r, unsigned int g, unsigned int b, unsigned int a) -: 111:{ 784922: 112: return r<rOffset | g<gOffset | b<bOffset | a<aOffset; -: 113:} -: 114: -: 115:static long function color_bucket_offset called 408090 returned 100% blocks executed 100% 408090: 116:color_bucket_offset(const ColorCube cube, const Pixel *p) { 408090: 117: unsigned int r = p->c.r>>(8-cube->rBits); 408090: 118: unsigned int g = p->c.g>>(8-cube->gBits); 408090: 119: unsigned int b = p->c.b>>(8-cube->bBits); 408090: 120: unsigned int a = p->c.a>>(8-cube->aBits); 816180: 121: return color_bucket_offset_pos(cube, r, g, b, a); -: 122:} -: 123: -: 124:static ColorBucket -: 125:color_bucket_from_cube(const ColorCube cube, const Pixel *p) { 408090: 126: unsigned int offset = color_bucket_offset(cube, p); call 0 returned 100% call 1 returned 100% call 2 returned 100% call 3 returned 100% 408090: 127: return &cube->buckets[offset]; -: 128:} -: 129: -: 130:static void function add_color_to_color_cube called 202069 returned 100% blocks executed 100% 202069: 131:add_color_to_color_cube(const ColorCube cube, const Pixel *p) { 202069: 132: ColorBucket bucket = color_bucket_from_cube(cube, p); 202069: 133: bucket->count += 1; 202069: 134: bucket->r += p->c.r; 202069: 135: bucket->g += p->c.g; 202069: 136: bucket->b += p->c.b; 202069: 137: bucket->a += p->c.a; 202069: 138:} -: 139: -: 140:static unsigned long -: 141:count_used_color_buckets(const ColorCube cube) { -: 142: unsigned long usedBuckets = 0; -: 143: unsigned long i; 14464: 144: for (i=0; i < cube->size; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) branch 4 taken 99% branch 5 taken 1% (fallthrough) 14464: 145: if (cube->buckets[i].count > 0) { branch 0 taken 8% (fallthrough) branch 1 taken 92% branch 2 taken 6% (fallthrough) branch 3 taken 94% branch 4 taken 6% (fallthrough) branch 5 taken 94% 957: 146: usedBuckets += 1; -: 147: } -: 148: } -: 149: return usedBuckets; -: 150:} -: 151: -: 152:static void function avg_color_from_color_bucket called 6868 returned 100% blocks executed 100% 6868: 153:avg_color_from_color_bucket(const ColorBucket bucket, Pixel *dst) { 6868: 154: float count = bucket->count; 6868: 155: if (count != 0) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 3450: 156: dst->c.r = CLIP8((int)(bucket->r / count)); branch 0 taken 99% (fallthrough) branch 1 taken 1% 3450: 157: dst->c.g = CLIP8((int)(bucket->g / count)); branch 0 taken 99% (fallthrough) branch 1 taken 1% 3450: 158: dst->c.b = CLIP8((int)(bucket->b / count)); branch 0 taken 99% (fallthrough) branch 1 taken 1% 3450: 159: dst->c.a = CLIP8((int)(bucket->a / count)); branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 160: } else { 3418: 161: dst->c.r = 0; 3418: 162: dst->c.g = 0; 3418: 163: dst->c.b = 0; 3418: 164: dst->c.a = 0; -: 165: } 6868: 166:} -: 167: -: 168:static int function compare_bucket_count called 633928 returned 100% blocks executed 100% 633928: 169:compare_bucket_count(const ColorBucket a, const ColorBucket b) { 633928: 170: return b->count - a->count; -: 171:} -: 172: -: 173:static ColorBucket function create_sorted_color_palette.isra.2 called 24 returned 100% blocks executed 100% 24: 174:create_sorted_color_palette(const ColorCube cube) { -: 175: ColorBucket buckets; 24: 176: if (cube->size > LONG_MAX / sizeof(struct _ColorBucket)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 177: return NULL; -: 178: } -: 179: /* malloc check ok, calloc + overflow check above for memcpy */ 24: 180: buckets = calloc(cube->size, sizeof(struct _ColorBucket)); 24: 181: if (!buckets) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 182: return NULL; -: 183: } 48: 184: memcpy(buckets, cube->buckets, sizeof(struct _ColorBucket)*cube->size); -: 185: 24: 186: qsort(buckets, cube->size, sizeof(struct _ColorBucket), call 0 returned 100% -: 187: (int (*)(void const *, void const *))&compare_bucket_count); -: 188: -: 189: return buckets; -: 190:} -: 191: function add_bucket_values called 188416 returned 100% blocks executed 100% 188416: 192:void add_bucket_values(ColorBucket src, ColorBucket dst) { 188416: 193: dst->count += src->count; 188416: 194: dst->r += src->r; 188416: 195: dst->g += src->g; 188416: 196: dst->b += src->b; 188416: 197: dst->a += src->a; 188416: 198:} -: 199: -: 200:/* expand or shrink a given cube to level */ function copy_color_cube called 24 returned 100% blocks executed 100% 24: 201:static ColorCube copy_color_cube(const ColorCube cube, -: 202: unsigned int rBits, unsigned int gBits, unsigned int bBits, unsigned int aBits) -: 203:{ -: 204: unsigned int r, g, b, a; -: 205: long src_pos, dst_pos; 24: 206: unsigned int src_reduce[4] = {0}, dst_reduce[4] = {0}; -: 207: unsigned int width[4]; -: 208: ColorCube result; -: 209: 24: 210: result = new_color_cube(rBits, gBits, bBits, aBits); call 0 returned 100% 24: 211: if (!result) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 212: return NULL; -: 213: } -: 214: 24: 215: if (cube->rBits > rBits) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 12: 216: dst_reduce[0] = cube->rBits - result->rBits; 12: 217: width[0] = cube->rWidth; -: 218: } else { 12: 219: src_reduce[0] = result->rBits - cube->rBits; 12: 220: width[0] = result->rWidth; -: 221: } 24: 222: if (cube->gBits > gBits) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 12: 223: dst_reduce[1] = cube->gBits - result->gBits; 12: 224: width[1] = cube->gWidth; -: 225: } else { 12: 226: src_reduce[1] = result->gBits - cube->gBits; 12: 227: width[1] = result->gWidth; -: 228: } 24: 229: if (cube->bBits > bBits) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 12: 230: dst_reduce[2] = cube->bBits - result->bBits; 12: 231: width[2] = cube->bWidth; -: 232: } else { 12: 233: src_reduce[2] = result->bBits - cube->bBits; 12: 234: width[2] = result->bWidth; -: 235: } 24: 236: if (cube->aBits > aBits) { branch 0 taken 46% (fallthrough) branch 1 taken 54% 11: 237: dst_reduce[3] = cube->aBits - result->aBits; 11: 238: width[3] = cube->aWidth; -: 239: } else { 13: 240: src_reduce[3] = result->aBits - cube->aBits; 13: 241: width[3] = result->aWidth; -: 242: } -: 243: 232: 244: for (r=0; r>src_reduce[0], -: 250: g>>src_reduce[1], -: 251: b>>src_reduce[2], -: 252: a>>src_reduce[3]); 376832: 253: dst_pos = color_bucket_offset_pos(result, -: 254: r>>dst_reduce[0], -: 255: g>>dst_reduce[1], -: 256: b>>dst_reduce[2], -: 257: a>>dst_reduce[3]); 753664: 258: add_bucket_values( call 0 returned 100% 376832: 259: &cube->buckets[src_pos], 376832: 260: &result->buckets[dst_pos] -: 261: ); -: 262: } -: 263: } -: 264: } -: 265: } -: 266: return result; -: 267:} -: 268: -: 269:void function subtract_color_buckets called 29 returned 100% blocks executed 100% 29: 270:subtract_color_buckets(ColorCube cube, ColorBucket buckets, long nBuckets) { -: 271: ColorBucket minuend, subtrahend; -: 272: long i; -: 273: Pixel p; 2774: 274: for (i=0; icount == 0) { branch 0 taken 62% (fallthrough) branch 1 taken 38% 1709: 279: continue; -: 280: } -: 281: 1036: 282: avg_color_from_color_bucket(subtrahend, &p); call 0 returned 100% 1036: 283: minuend = color_bucket_from_cube(cube, &p); 1036: 284: minuend->count -= subtrahend->count; 1036: 285: minuend->r -= subtrahend->r; 1036: 286: minuend->g -= subtrahend->g; 1036: 287: minuend->b -= subtrahend->b; 1036: 288: minuend->a -= subtrahend->a; -: 289: } 29: 290:} -: 291: -: 292:static void -: 293:set_lookup_value(const ColorCube cube, const Pixel *p, long value) { 2916: 294: ColorBucket bucket = color_bucket_from_cube(cube, p); 2916: 295: bucket->count = value; -: 296:} -: 297: -: 298:uint64_t function lookup_color called 202069 returned 100% blocks executed 100% 202069: 299:lookup_color(const ColorCube cube, const Pixel *p) { 202069: 300: ColorBucket bucket = color_bucket_from_cube(cube, p); 202069: 301: return bucket->count; -: 302:} -: 303: function add_lookup_buckets called 24 returned 100% blocks executed 100% 24: 304:void add_lookup_buckets(ColorCube cube, ColorBucket palette, long nColors, long offset) { -: 305: long i; -: 306: Pixel p; 2940: 307: for (i=offset; i LONG_MAX - nBucketsB || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 12: 317: (nBucketsA+nBucketsB) > LONG_MAX / sizeof(struct _ColorBucket)) { -: 318: return NULL; -: 319: } -: 320: /* malloc check ok, overflow check above */ 12: 321: result = calloc(nBucketsA + nBucketsB, sizeof(struct _ColorBucket)); 12: 322: if (!result) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 323: return NULL; -: 324: } 24: 325: memcpy(result, bucketsA, sizeof(struct _ColorBucket) * nBucketsA); 24: 326: memcpy(&result[nBucketsA], bucketsB, sizeof(struct _ColorBucket) * nBucketsB); 12: 327: return result; -: 328:} -: 329: -: 330:static Pixel * function create_palette_array called 12 returned 100% blocks executed 100% 12: 331:create_palette_array(const ColorBucket palette, unsigned int paletteLength) { -: 332: Pixel *paletteArray; -: 333: unsigned int i; -: 334: -: 335: /* malloc check ok, calloc for overflow */ 12: 336: paletteArray = calloc(paletteLength, sizeof(Pixel)); 12: 337: if (!paletteArray) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 338: return NULL; -: 339: } -: 340: 2916: 341: for (i=0; i 64). -: 394: -: 395: For a quantization to 256 colors all 64 coarse colors will be used -: 396: plus the 192 most used color buckets from the fine color cube. -: 397: The average of all colors within one bucket is used as the actual -: 398: color for that bucket. -: 399: -: 400: For images with alpha the cubes gets a forth dimension, -: 401: 8x16x8x8 and 4x4x4x4. -: 402: */ -: 403: -: 404: /* create fine cube */ 36: 405: fineCube = new_color_cube(cubeBits[0], cubeBits[1], call 0 returned 100% 24: 406: cubeBits[2], cubeBits[3]); 12: 407: if (!fineCube) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 408: goto error; -: 409: } 202069: 410: for (i=0; i nQuantPixels) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 424: nCoarseColors = nQuantPixels; -: 425: } -: 426: -: 427: /* how many space do we have in our palette for fine colors? */ 12: 428: nFineColors = nQuantPixels - nCoarseColors; -: 429: -: 430: /* create fine color palette */ 12: 431: paletteBucketsFine = create_sorted_color_palette(fineCube); call 0 returned 100% 12: 432: if (!paletteBucketsFine) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 433: goto error; -: 434: } -: 435: -: 436: /* remove the used fine colors from the coarse cube */ 12: 437: subtract_color_buckets(coarseCube, paletteBucketsFine, nFineColors); call 0 returned 100% -: 438: -: 439: /* did the subtraction cleared one or more coarse bucket? */ 70: 440: while (nCoarseColors > count_used_color_buckets(coarseCube)) { branch 0 taken 59% (fallthrough) branch 1 taken 41% -: 441: /* then we can use the free buckets for fine colors */ -: 442: nAlreadySubtracted = nFineColors; 17: 443: nCoarseColors = count_used_color_buckets(coarseCube); 17: 444: nFineColors = nQuantPixels - nCoarseColors; 34: 445: subtract_color_buckets(coarseCube, &paletteBucketsFine[nAlreadySubtracted], call 0 returned 100% 17: 446: nFineColors-nAlreadySubtracted); -: 447: } -: 448: -: 449: /* create our palette buckets with fine and coarse combined */ 12: 450: paletteBucketsCoarse = create_sorted_color_palette(coarseCube); call 0 returned 100% 12: 451: if (!paletteBucketsCoarse) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 452: goto error; -: 453: } 12: 454: paletteBuckets = combined_palette(paletteBucketsCoarse, nCoarseColors, call 0 returned 100% -: 455: paletteBucketsFine, nFineColors); -: 456: 12: 457: free(paletteBucketsFine); 12: 458: paletteBucketsFine = NULL; 12: 459: free(paletteBucketsCoarse); 12: 460: paletteBucketsCoarse = NULL; 12: 461: if (!paletteBuckets) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 462: goto error; -: 463: } -: 464: -: 465: /* add all coarse colors to our coarse lookup cube. */ 36: 466: coarseLookupCube = new_color_cube(cubeBits[4], cubeBits[5], call 0 returned 100% 24: 467: cubeBits[6], cubeBits[7]); 12: 468: if (!coarseLookupCube) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 469: goto error; -: 470: } 12: 471: add_lookup_buckets(coarseLookupCube, paletteBuckets, nCoarseColors, 0); call 0 returned 100% -: 472: -: 473: /* expand coarse cube (64) to larger fine cube (4k). the value of each -: 474: coarse bucket is then present in the according 64 fine buckets. */ 12: 475: lookupCube = copy_color_cube(coarseLookupCube, cubeBits[0], cubeBits[1], call 0 returned 100% -: 476: cubeBits[2], cubeBits[3]); 12: 477: if (!lookupCube) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 478: goto error; -: 479: } -: 480: -: 481: /* add fine colors to the lookup cube */ 12: 482: add_lookup_buckets(lookupCube, paletteBuckets, nFineColors, nCoarseColors); call 0 returned 100% -: 483: -: 484: /* create result pixels and map palette indices */ -: 485: /* malloc check ok, calloc for overflow */ 12: 486: qp = calloc(nPixels, sizeof(Pixel)); 12: 487: if (!qp) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 488: goto error; -: 489: } 12: 490: map_image_pixels(pixelData, nPixels, lookupCube, qp); -: 491: -: 492: /* convert palette buckets to RGB pixel palette */ 12: 493: *palette = create_palette_array(paletteBuckets, nQuantPixels); call 0 returned 100% 12: 494: if (!(*palette)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 495: goto error; -: 496: } -: 497: 12: 498: *quantizedPixels = qp; 12: 499: *paletteLength = nQuantPixels; -: 500: 12: 501: free_color_cube(coarseCube); call 0 returned 100% 12: 502: free_color_cube(fineCube); call 0 returned 100% 12: 503: free_color_cube(lookupCube); call 0 returned 100% 12: 504: free_color_cube(coarseLookupCube); call 0 returned 100% 12: 505: free(paletteBuckets); 12: 506: return 1; -: 507: -: 508:error: -: 509: /* everything is initialized to NULL -: 510: so we are safe to call free */ #####: 511: free(qp); #####: 512: free_color_cube(lookupCube); call 0 never executed #####: 513: free_color_cube(coarseLookupCube); call 0 never executed #####: 514: free(paletteBuckets); #####: 515: free(paletteBucketsCoarse); #####: 516: free(paletteBucketsFine); #####: 517: free_color_cube(coarseCube); call 0 never executed #####: 518: free_color_cube(fineCube); call 0 never executed #####: 519: return 0; -: 520:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#encode.c.gcov -: 0:Source:src/encode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/encode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/encode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * -: 4: * standard encoder interfaces for the Imaging library -: 5: * -: 6: * History: -: 7: * 1996-04-19 fl Based on decoders.c -: 8: * 1996-05-12 fl Compile cleanly as C++ -: 9: * 1996-12-30 fl Plugged potential memory leak for tiled images -: 10: * 1997-01-03 fl Added GIF encoder -: 11: * 1997-01-05 fl Plugged encoder buffer leaks -: 12: * 1997-01-11 fl Added encode_to_file method -: 13: * 1998-03-09 fl Added mode/rawmode argument to encoders -: 14: * 1998-07-09 fl Added interlace argument to GIF encoder -: 15: * 1999-02-07 fl Added PCX encoder -: 16: * -: 17: * Copyright (c) 1997-2001 by Secret Labs AB -: 18: * Copyright (c) 1996-1997 by Fredrik Lundh -: 19: * -: 20: * See the README file for information on usage and redistribution. -: 21: */ -: 22: -: 23:/* FIXME: make these pluggable! */ -: 24: -: 25:#define PY_SSIZE_T_CLEAN -: 26:#include "Python.h" -: 27: -: 28:#include "libImaging/Imaging.h" -: 29:#include "libImaging/Gif.h" -: 30: -: 31:#ifdef HAVE_UNISTD_H -: 32:#include /* write */ -: 33:#endif -: 34: -: 35:/* -------------------------------------------------------------------- */ -: 36:/* Common */ -: 37:/* -------------------------------------------------------------------- */ -: 38: -: 39:typedef struct { -: 40: PyObject_HEAD -: 41: int (*encode)(Imaging im, ImagingCodecState state, -: 42: UINT8* buffer, int bytes); -: 43: int (*cleanup)(ImagingCodecState state); -: 44: struct ImagingCodecStateInstance state; -: 45: Imaging im; -: 46: PyObject* lock; -: 47: int pushes_fd; -: 48:} ImagingEncoderObject; -: 49: -: 50:static PyTypeObject ImagingEncoderType; -: 51: -: 52:static ImagingEncoderObject* function PyImaging_EncoderNew called 3705 returned 100% blocks executed 67% 3705: 53:PyImaging_EncoderNew(int contextsize) -: 54:{ -: 55: ImagingEncoderObject *encoder; -: 56: void *context; -: 57: 3705: 58: if(PyType_Ready(&ImagingEncoderType) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 59: return NULL; -: 60: } -: 61: 3705: 62: encoder = PyObject_New(ImagingEncoderObject, &ImagingEncoderType); call 0 returned 100% 3705: 63: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 64: return NULL; -: 65: } -: 66: -: 67: /* Clear the encoder state */ 7410: 68: memset(&encoder->state, 0, sizeof(encoder->state)); -: 69: -: 70: /* Allocate encoder context */ 3705: 71: if (contextsize > 0) { branch 0 taken 11% (fallthrough) branch 1 taken 89% 410: 72: context = (void*) calloc(1, contextsize); 410: 73: if (!context) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 74: Py_DECREF(encoder); branch 0 never executed branch 1 never executed call 2 never executed #####: 75: (void) PyErr_NoMemory(); call 0 never executed #####: 76: return NULL; -: 77: } -: 78: } else { -: 79: context = 0; -: 80: } -: 81: -: 82: /* Initialize encoder context */ 3705: 83: encoder->state.context = context; -: 84: -: 85: /* Most encoders don't need this */ 3705: 86: encoder->cleanup = NULL; -: 87: -: 88: /* Target image */ 3705: 89: encoder->lock = NULL; 3705: 90: encoder->im = NULL; 3705: 91: encoder->pushes_fd = 0; -: 92: 3705: 93: return encoder; -: 94:} -: 95: -: 96:static void function _dealloc called 3705 returned 100% blocks executed 80% 3705: 97:_dealloc(ImagingEncoderObject* encoder) -: 98:{ 3705: 99: if (encoder->cleanup) { branch 0 taken 4% (fallthrough) branch 1 taken 96% 146: 100: encoder->cleanup(&encoder->state); call 0 returned 100% -: 101: } 3705: 102: free(encoder->state.buffer); 3705: 103: free(encoder->state.context); 3705: 104: Py_XDECREF(encoder->lock); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 0% (fallthrough) branch 3 taken 100% call 4 never executed 3705: 105: Py_XDECREF(encoder->state.fd); branch 0 taken 1% (fallthrough) branch 1 taken 99% branch 2 taken 0% (fallthrough) branch 3 taken 100% call 4 never executed 3705: 106: PyObject_Del(encoder); call 0 returned 100% 3705: 107:} -: 108: -: 109:static PyObject* function _encode_cleanup called 560 returned 100% blocks executed 100% 560: 110:_encode_cleanup(ImagingEncoderObject* encoder, PyObject* args) -: 111:{ 560: 112: int status = 0; -: 113: 560: 114: if (encoder->cleanup){ branch 0 taken 26% (fallthrough) branch 1 taken 74% 144: 115: status = encoder->cleanup(&encoder->state); call 0 returned 100% -: 116: } -: 117: 560: 118: return Py_BuildValue("i", status); call 0 returned 100% -: 119:} -: 120: -: 121:static PyObject* function _encode called 12992 returned 100% blocks executed 92% 12992: 122:_encode(ImagingEncoderObject* encoder, PyObject* args) -: 123:{ -: 124: PyObject* buf; -: 125: PyObject* result; -: 126: int status; -: 127: -: 128: /* Encode to a Python string (allocated by this method) */ -: 129: 12992: 130: Py_ssize_t bufsize = 16384; -: 131: 12992: 132: if (!PyArg_ParseTuple(args, "|n", &bufsize)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 133: return NULL; -: 134: } -: 135: 12992: 136: buf = PyBytes_FromStringAndSize(NULL, bufsize); call 0 returned 100% 12992: 137: if (!buf) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 138: return NULL; -: 139: } -: 140: 25984: 141: status = encoder->encode(encoder->im, &encoder->state, call 0 returned 100% 12992: 142: (UINT8*) PyBytes_AsString(buf), bufsize); call 0 returned 100% -: 143: -: 144: /* adjust string length to avoid slicing in encoder */ 12992: 145: if (_PyBytes_Resize(&buf, (status > 0) ? status : 0) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 146: return NULL; -: 147: } -: 148: 12992: 149: result = Py_BuildValue("iiO", status, encoder->state.errcode, buf); call 0 returned 100% -: 150: 12992: 151: Py_DECREF(buf); /* must release buffer!!! */ branch 0 taken 0% (fallthrough) branch 1 taken 100% call 2 never executed -: 152: -: 153: return result; -: 154:} -: 155: -: 156:static PyObject* function _encode_to_pyfd called 14 returned 100% blocks executed 71% 14: 157:_encode_to_pyfd(ImagingEncoderObject* encoder, PyObject* args) -: 158:{ -: 159: -: 160: PyObject *result; -: 161: int status; -: 162: 14: 163: if (!encoder->pushes_fd) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 164: // UNDONE, appropriate errcode??? #####: 165: result = Py_BuildValue("ii", 0, IMAGING_CODEC_CONFIG);; call 0 never executed #####: 166: return result; -: 167: } -: 168: 14: 169: status = encoder->encode(encoder->im, &encoder->state, call 0 returned 100% -: 170: (UINT8*) NULL, 0); -: 171: 14: 172: result = Py_BuildValue("ii", status, encoder->state.errcode); call 0 returned 100% -: 173: 14: 174: return result; -: 175:} -: 176: -: 177:static PyObject* function _encode_to_file called 237 returned 100% blocks executed 81% 237: 178:_encode_to_file(ImagingEncoderObject* encoder, PyObject* args) -: 179:{ -: 180: UINT8* buf; -: 181: int status; -: 182: ImagingSectionCookie cookie; -: 183: -: 184: /* Encode to a file handle */ -: 185: -: 186: Py_ssize_t fh; 237: 187: Py_ssize_t bufsize = 16384; -: 188: 237: 189: if (!PyArg_ParseTuple(args, "n|n", &fh, &bufsize)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 190: return NULL; -: 191: } -: 192: -: 193: /* Allocate an encoder buffer */ -: 194: /* malloc check ok, either constant int, or checked by PyArg_ParseTuple */ 237: 195: buf = (UINT8*) malloc(bufsize); 237: 196: if (!buf) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 197: return PyErr_NoMemory(); call 0 never executed -: 198: } -: 199: 237: 200: ImagingSectionEnter(&cookie); call 0 returned 100% -: 201: -: 202: do { -: 203: -: 204: /* This replaces the inner loop in the ImageFile _save -: 205: function. */ -: 206: 324: 207: status = encoder->encode(encoder->im, &encoder->state, buf, bufsize); call 0 returned 100% -: 208: 324: 209: if (status > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 324: 210: if (write(fh, buf, status) < 0) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 211: ImagingSectionLeave(&cookie); call 0 never executed #####: 212: free(buf); #####: 213: return PyErr_SetFromErrno(PyExc_OSError); call 0 never executed -: 214: } -: 215: } -: 216: 324: 217: } while (encoder->state.errcode == 0); branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 218: 237: 219: ImagingSectionLeave(&cookie); call 0 returned 100% -: 220: 237: 221: free(buf); -: 222: 237: 223: return Py_BuildValue("i", encoder->state.errcode); call 0 returned 100% -: 224:} -: 225: -: 226:extern Imaging PyImaging_AsImaging(PyObject *op); -: 227: -: 228:static PyObject* function _setimage called 3704 returned 100% blocks executed 75% 3704: 229:_setimage(ImagingEncoderObject* encoder, PyObject* args) -: 230:{ -: 231: PyObject* op; -: 232: Imaging im; -: 233: ImagingCodecState state; -: 234: Py_ssize_t x0, y0, x1, y1; -: 235: -: 236: /* Define where image data should be stored */ -: 237: 3704: 238: x0 = y0 = x1 = y1 = 0; -: 239: -: 240: /* FIXME: should publish the ImagingType descriptor */ 3704: 241: if (!PyArg_ParseTuple(args, "O|(nnnn)", &op, &x0, &y0, &x1, &y1)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 242: return NULL; -: 243: } 3704: 244: im = PyImaging_AsImaging(op); call 0 returned 100% 3704: 245: if (!im) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 246: return NULL; -: 247: } -: 248: 3704: 249: encoder->im = im; -: 250: 3704: 251: state = &encoder->state; -: 252: 3704: 253: if (x0 == 0 && x1 == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 85% (fallthrough) branch 3 taken 15% 3143: 254: state->xsize = im->xsize; 3143: 255: state->ysize = im->ysize; -: 256: } else { 561: 257: state->xoff = x0; 561: 258: state->yoff = y0; 561: 259: state->xsize = x1 - x0; 561: 260: state->ysize = y1 - y0; -: 261: } -: 262: 7408: 263: if (state->xsize <= 0 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 7408: 264: state->xsize + state->xoff > im->xsize || branch 0 taken 100% (fallthrough) branch 1 taken 0% 7408: 265: state->ysize <= 0 || branch 0 taken 0% (fallthrough) branch 1 taken 100% 3704: 266: state->ysize + state->yoff > im->ysize) { #####: 267: PyErr_SetString(PyExc_SystemError, "tile cannot extend outside image"); call 0 never executed #####: 268: return NULL; -: 269: } -: 270: -: 271: /* Allocate memory buffer (if bits field is set) */ 3704: 272: if (state->bits > 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 3670: 273: if (state->xsize > ((INT_MAX / state->bits)-7)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 274: return PyErr_NoMemory(); call 0 never executed -: 275: } 3670: 276: state->bytes = (state->bits * state->xsize+7)/8; -: 277: /* malloc check ok, overflow checked above */ 3670: 278: state->buffer = (UINT8*) malloc(state->bytes); 3670: 279: if (!state->buffer) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 280: return PyErr_NoMemory(); call 0 never executed -: 281: } -: 282: } -: 283: -: 284: /* Keep a reference to the image object, to make sure it doesn't -: 285: go away before we do */ 3704: 286: Py_INCREF(op); 3704: 287: Py_XDECREF(encoder->lock); branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed call 4 never executed 3704: 288: encoder->lock = op; -: 289: 3704: 290: Py_INCREF(Py_None); 3704: 291: return Py_None; -: 292:} -: 293: -: 294:static PyObject* function _setfd called 14 returned 100% blocks executed 100% 14: 295:_setfd(ImagingEncoderObject* encoder, PyObject* args) -: 296:{ -: 297: PyObject* fd; -: 298: ImagingCodecState state; -: 299: 14: 300: if (!PyArg_ParseTuple(args, "O", &fd)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 301: return NULL; -: 302: } -: 303: 14: 304: state = &encoder->state; -: 305: 14: 306: Py_XINCREF(fd); branch 0 taken 100% (fallthrough) branch 1 taken 0% 14: 307: state->fd = fd; -: 308: 14: 309: Py_INCREF(Py_None); 14: 310: return Py_None; -: 311:} -: 312: -: 313:static PyObject * function _get_pushes_fd called 561 returned 100% blocks executed 100% 561: 314:_get_pushes_fd(ImagingEncoderObject *encoder) -: 315:{ 561: 316: return PyBool_FromLong(encoder->pushes_fd); call 0 returned 100% -: 317:} -: 318: -: 319:static struct PyMethodDef methods[] = { -: 320: {"encode", (PyCFunction)_encode, 1}, -: 321: {"cleanup", (PyCFunction)_encode_cleanup, 1}, -: 322: {"encode_to_file", (PyCFunction)_encode_to_file, 1}, -: 323: {"encode_to_pyfd", (PyCFunction)_encode_to_pyfd, 1}, -: 324: {"setimage", (PyCFunction)_setimage, 1}, -: 325: {"setfd", (PyCFunction)_setfd, 1}, -: 326: {NULL, NULL} /* sentinel */ -: 327:}; -: 328: -: 329:static struct PyGetSetDef getseters[] = { -: 330: {"pushes_fd", (getter)_get_pushes_fd, NULL, -: 331: "True if this decoder expects to push directly to self.fd", -: 332: NULL}, -: 333: {NULL, NULL, NULL, NULL, NULL} /* sentinel */ -: 334:}; -: 335: -: 336:static PyTypeObject ImagingEncoderType = { -: 337: PyVarObject_HEAD_INIT(NULL, 0) -: 338: "ImagingEncoder", /*tp_name*/ -: 339: sizeof(ImagingEncoderObject), /*tp_size*/ -: 340: 0, /*tp_itemsize*/ -: 341: /* methods */ -: 342: (destructor)_dealloc, /*tp_dealloc*/ -: 343: 0, /*tp_print*/ -: 344: 0, /*tp_getattr*/ -: 345: 0, /*tp_setattr*/ -: 346: 0, /*tp_compare*/ -: 347: 0, /*tp_repr*/ -: 348: 0, /*tp_as_number */ -: 349: 0, /*tp_as_sequence */ -: 350: 0, /*tp_as_mapping */ -: 351: 0, /*tp_hash*/ -: 352: 0, /*tp_call*/ -: 353: 0, /*tp_str*/ -: 354: 0, /*tp_getattro*/ -: 355: 0, /*tp_setattro*/ -: 356: 0, /*tp_as_buffer*/ -: 357: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 358: 0, /*tp_doc*/ -: 359: 0, /*tp_traverse*/ -: 360: 0, /*tp_clear*/ -: 361: 0, /*tp_richcompare*/ -: 362: 0, /*tp_weaklistoffset*/ -: 363: 0, /*tp_iter*/ -: 364: 0, /*tp_iternext*/ -: 365: methods, /*tp_methods*/ -: 366: 0, /*tp_members*/ -: 367: getseters, /*tp_getset*/ -: 368:}; -: 369: -: 370:/* -------------------------------------------------------------------- */ -: 371: -: 372:int function get_packer called 3670 returned 100% blocks executed 50% 3670: 373:get_packer(ImagingEncoderObject* encoder, const char* mode, -: 374: const char* rawmode) -: 375:{ -: 376: int bits; -: 377: ImagingShuffler pack; -: 378: 3670: 379: pack = ImagingFindPacker(mode, rawmode, &bits); call 0 returned 100% 3670: 380: if (!pack) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 381: Py_DECREF(encoder); branch 0 never executed branch 1 never executed call 2 never executed #####: 382: PyErr_Format(PyExc_ValueError, "No packer found from %s to %s", mode, rawmode); call 0 never executed #####: 383: return -1; -: 384: } -: 385: 3670: 386: encoder->state.shuffle = pack; 3670: 387: encoder->state.bits = bits; -: 388: 3670: 389: return 0; -: 390:} -: 391: -: 392: -: 393:/* -------------------------------------------------------------------- */ -: 394:/* EPS */ -: 395:/* -------------------------------------------------------------------- */ -: 396: -: 397:PyObject* function PyImaging_EpsEncoderNew called 20 returned 100% blocks executed 100% 20: 398:PyImaging_EpsEncoderNew(PyObject* self, PyObject* args) -: 399:{ -: 400: ImagingEncoderObject* encoder; -: 401: 20: 402: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 20: 403: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 404: return NULL; -: 405: } -: 406: 20: 407: encoder->encode = ImagingEpsEncode; -: 408: 20: 409: return (PyObject*) encoder; -: 410:} -: 411: -: 412: -: 413:/* -------------------------------------------------------------------- */ -: 414:/* GIF */ -: 415:/* -------------------------------------------------------------------- */ -: 416: -: 417:PyObject* function PyImaging_GifEncoderNew called 107 returned 100% blocks executed 100% 107: 418:PyImaging_GifEncoderNew(PyObject* self, PyObject* args) -: 419:{ -: 420: ImagingEncoderObject* encoder; -: 421: -: 422: char *mode; -: 423: char *rawmode; 107: 424: Py_ssize_t bits = 8; 107: 425: Py_ssize_t interlace = 0; 107: 426: if (!PyArg_ParseTuple(args, "ss|nn", &mode, &rawmode, &bits, &interlace)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 427: return NULL; -: 428: } -: 429: 107: 430: encoder = PyImaging_EncoderNew(sizeof(GIFENCODERSTATE)); call 0 returned 100% 107: 431: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 432: return NULL; -: 433: } -: 434: 107: 435: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 436: return NULL; -: 437: } -: 438: 107: 439: encoder->encode = ImagingGifEncode; -: 440: 107: 441: ((GIFENCODERSTATE*)encoder->state.context)->bits = bits; 107: 442: ((GIFENCODERSTATE*)encoder->state.context)->interlace = interlace; -: 443: 107: 444: return (PyObject*) encoder; -: 445:} -: 446: -: 447: -: 448:/* -------------------------------------------------------------------- */ -: 449:/* PCX */ -: 450:/* -------------------------------------------------------------------- */ -: 451: -: 452:PyObject* function PyImaging_PcxEncoderNew called 17 returned 100% blocks executed 100% 17: 453:PyImaging_PcxEncoderNew(PyObject* self, PyObject* args) -: 454:{ -: 455: ImagingEncoderObject* encoder; -: 456: -: 457: char *mode; -: 458: char *rawmode; 17: 459: Py_ssize_t bits = 8; -: 460: 17: 461: if (!PyArg_ParseTuple(args, "ss|n", &mode, &rawmode, &bits)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 462: return NULL; -: 463: } -: 464: 17: 465: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 17: 466: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 467: return NULL; -: 468: } -: 469: 17: 470: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 471: return NULL; -: 472: } -: 473: 17: 474: encoder->encode = ImagingPcxEncode; -: 475: 17: 476: return (PyObject*) encoder; -: 477:} -: 478: -: 479: -: 480:/* -------------------------------------------------------------------- */ -: 481:/* RAW */ -: 482:/* -------------------------------------------------------------------- */ -: 483: -: 484:PyObject* function PyImaging_RawEncoderNew called 3234 returned 100% blocks executed 100% 3234: 485:PyImaging_RawEncoderNew(PyObject* self, PyObject* args) -: 486:{ -: 487: ImagingEncoderObject* encoder; -: 488: -: 489: char *mode; -: 490: char *rawmode; 3234: 491: Py_ssize_t stride = 0; 3234: 492: Py_ssize_t ystep = 1; -: 493: 3234: 494: if (!PyArg_ParseTuple(args, "ss|nn", &mode, &rawmode, &stride, &ystep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 495: return NULL; -: 496: } -: 497: 3234: 498: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 3234: 499: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 500: return NULL; -: 501: } -: 502: 3234: 503: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 504: return NULL; -: 505: } -: 506: 3234: 507: encoder->encode = ImagingRawEncode; -: 508: 3234: 509: encoder->state.ystep = ystep; 3234: 510: encoder->state.count = stride; -: 511: 3234: 512: return (PyObject*) encoder; -: 513:} -: 514: -: 515: -: 516:/* -------------------------------------------------------------------- */ -: 517:/* TGA */ -: 518:/* -------------------------------------------------------------------- */ -: 519: -: 520:PyObject* function PyImaging_TgaRleEncoderNew called 20 returned 100% blocks executed 100% 20: 521:PyImaging_TgaRleEncoderNew(PyObject* self, PyObject* args) -: 522:{ -: 523: ImagingEncoderObject* encoder; -: 524: -: 525: char *mode; -: 526: char *rawmode; 20: 527: Py_ssize_t ystep = 1; -: 528: 20: 529: if (!PyArg_ParseTuple(args, "ss|n", &mode, &rawmode, &ystep)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 530: return NULL; -: 531: } -: 532: 20: 533: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 20: 534: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 535: return NULL; -: 536: } -: 537: 20: 538: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 539: return NULL; -: 540: } -: 541: 20: 542: encoder->encode = ImagingTgaRleEncode; -: 543: 20: 544: encoder->state.ystep = ystep; -: 545: 20: 546: return (PyObject*) encoder; -: 547:} -: 548: -: 549: -: 550: -: 551:/* -------------------------------------------------------------------- */ -: 552:/* XBM */ -: 553:/* -------------------------------------------------------------------- */ -: 554: -: 555:PyObject* function PyImaging_XbmEncoderNew called 4 returned 100% blocks executed 100% 4: 556:PyImaging_XbmEncoderNew(PyObject* self, PyObject* args) -: 557:{ -: 558: ImagingEncoderObject* encoder; -: 559: 4: 560: encoder = PyImaging_EncoderNew(0); call 0 returned 100% 4: 561: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 562: return NULL; -: 563: } -: 564: 4: 565: if (get_packer(encoder, "1", "1;R") < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 566: return NULL; -: 567: } -: 568: 4: 569: encoder->encode = ImagingXbmEncode; -: 570: 4: 571: return (PyObject*) encoder; -: 572:} -: 573: -: 574: -: 575:/* -------------------------------------------------------------------- */ -: 576:/* ZIP */ -: 577:/* -------------------------------------------------------------------- */ -: 578: -: 579:#ifdef HAVE_LIBZ -: 580: -: 581:#include "libImaging/ZipCodecs.h" -: 582: -: 583:PyObject* function PyImaging_ZipEncoderNew called 131 returned 100% blocks executed 72% 131: 584:PyImaging_ZipEncoderNew(PyObject* self, PyObject* args) -: 585:{ -: 586: ImagingEncoderObject* encoder; -: 587: -: 588: char* mode; -: 589: char* rawmode; 131: 590: Py_ssize_t optimize = 0; 131: 591: Py_ssize_t compress_level = -1; 131: 592: Py_ssize_t compress_type = -1; 131: 593: char* dictionary = NULL; 131: 594: Py_ssize_t dictionary_size = 0; 131: 595: if (!PyArg_ParseTuple(args, "ss|nnny#", &mode, &rawmode, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 596: &optimize, -: 597: &compress_level, &compress_type, -: 598: &dictionary, &dictionary_size)) { -: 599: return NULL; -: 600: } -: 601: -: 602: /* Copy to avoid referencing Python's memory */ 131: 603: if (dictionary && dictionary_size > 0) { branch 0 taken 76% (fallthrough) branch 1 taken 24% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 604: /* malloc check ok, size comes from PyArg_ParseTuple */ #####: 605: char* p = malloc(dictionary_size); #####: 606: if (!p) { branch 0 never executed branch 1 never executed #####: 607: return PyErr_NoMemory(); call 0 never executed -: 608: } #####: 609: memcpy(p, dictionary, dictionary_size); #####: 610: dictionary = p; -: 611: } else { 131: 612: dictionary = NULL; -: 613: } -: 614: 131: 615: encoder = PyImaging_EncoderNew(sizeof(ZIPSTATE)); call 0 returned 100% 131: 616: if (encoder == NULL) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 617: free(dictionary); #####: 618: return NULL; -: 619: } -: 620: 131: 621: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 622: free(dictionary); #####: 623: return NULL; -: 624: } -: 625: 131: 626: encoder->encode = ImagingZipEncode; 131: 627: encoder->cleanup = ImagingZipEncodeCleanup; -: 628: 131: 629: if (rawmode[0] == 'P') { branch 0 taken 9% (fallthrough) branch 1 taken 91% -: 630: /* disable filtering */ 12: 631: ((ZIPSTATE*)encoder->state.context)->mode = ZIP_PNG_PALETTE; -: 632: } -: 633: 131: 634: ((ZIPSTATE*)encoder->state.context)->optimize = optimize; 131: 635: ((ZIPSTATE*)encoder->state.context)->compress_level = compress_level; 131: 636: ((ZIPSTATE*)encoder->state.context)->compress_type = compress_type; 131: 637: ((ZIPSTATE*)encoder->state.context)->dictionary = dictionary; 131: 638: ((ZIPSTATE*)encoder->state.context)->dictionary_size = dictionary_size; -: 639: 131: 640: return (PyObject*) encoder; -: 641:} -: 642:#endif -: 643: -: 644: -: 645:/* -------------------------------------------------------------------- */ -: 646:/* LibTiff */ -: 647:/* -------------------------------------------------------------------- */ -: 648: -: 649:#ifdef HAVE_LIBTIFF -: 650: -: 651:#include "libImaging/TiffDecode.h" -: 652: -: 653:#include -: 654: -: 655:PyObject* -: 656:PyImaging_LibTiffEncoderNew(PyObject* self, PyObject* args) -: 657:{ -: 658: ImagingEncoderObject* encoder; -: 659: -: 660: char* mode; -: 661: char* rawmode; -: 662: char* compname; -: 663: char* filename; -: 664: Py_ssize_t fp; -: 665: -: 666: PyObject *tags, *types; -: 667: PyObject *key, *value; -: 668: Py_ssize_t pos = 0; -: 669: int key_int, status, is_core_tag, is_var_length, num_core_tags, i; -: 670: TIFFDataType type = TIFF_NOTYPE; -: 671: // This list also exists in TiffTags.py -: 672: const int core_tags[] = { -: 673: 256, 257, 258, 259, 262, 263, 266, 269, 274, 277, 278, 280, 281, 340, -: 674: 341, 282, 283, 284, 286, 287, 296, 297, 320, 321, 338, 32995, 32998, 32996, -: 675: 339, 32997, 330, 531, 530, 65537 -: 676: }; -: 677: -: 678: Py_ssize_t tags_size; -: 679: PyObject *item; -: 680: -: 681: if (! PyArg_ParseTuple(args, "sssnsOO", &mode, &rawmode, &compname, &fp, &filename, &tags, &types)) { -: 682: return NULL; -: 683: } -: 684: -: 685: if (!PyList_Check(tags)) { -: 686: PyErr_SetString(PyExc_ValueError, "Invalid tags list"); -: 687: return NULL; -: 688: } else { -: 689: tags_size = PyList_Size(tags); -: 690: TRACE(("tags size: %d\n", (int)tags_size)); -: 691: for (pos=0;posstate, filename, fp)) { -: 717: Py_DECREF(encoder); -: 718: PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed"); -: 719: return NULL; -: 720: } -: 721: -: 722: num_core_tags = sizeof(core_tags) / sizeof(int); -: 723: for (pos = 0; pos < tags_size; pos++) { -: 724: item = PyList_GetItem(tags, pos); -: 725: // We already checked that tags is a 2-tuple list. -: 726: key = PyTuple_GetItem(item, 0); -: 727: key_int = (int)PyLong_AsLong(key); -: 728: value = PyTuple_GetItem(item, 1); -: 729: status = 0; -: 730: is_core_tag = 0; -: 731: is_var_length = 0; -: 732: type = TIFF_NOTYPE; -: 733: -: 734: for (i=0; i= TIFF_BYTE && type_int <= TIFF_DOUBLE) { -: 746: type = (TIFFDataType)type_int; -: 747: } -: 748: } -: 749: } -: 750: -: 751: -: 752: if (type == TIFF_NOTYPE) { -: 753: // Autodetect type. Types should not be changed for backwards -: 754: // compatibility. -: 755: if (PyLong_Check(value)) { -: 756: type = TIFF_LONG; -: 757: } else if (PyFloat_Check(value)) { -: 758: type = TIFF_DOUBLE; -: 759: } else if (PyBytes_Check(value)) { -: 760: type = TIFF_ASCII; -: 761: } -: 762: } -: 763: -: 764: if (PyTuple_Check(value)) { -: 765: Py_ssize_t len; -: 766: len = PyTuple_Size(value); -: 767: -: 768: is_var_length = 1; -: 769: -: 770: if (!len) { -: 771: continue; -: 772: } -: 773: -: 774: if (type == TIFF_NOTYPE) { -: 775: // Autodetect type based on first item. Types should not be -: 776: // changed for backwards compatibility. -: 777: if (PyLong_Check(PyTuple_GetItem(value,0))) { -: 778: type = TIFF_LONG; -: 779: } else if (PyFloat_Check(PyTuple_GetItem(value,0))) { -: 780: type = TIFF_FLOAT; -: 781: } -: 782: } -: 783: } -: 784: -: 785: if (!is_core_tag) { -: 786: // Register field for non core tags. -: 787: if (type == TIFF_BYTE) { -: 788: is_var_length = 1; -: 789: } -: 790: if (ImagingLibTiffMergeFieldInfo(&encoder->state, type, key_int, is_var_length)) { -: 791: continue; -: 792: } -: 793: } -: 794: -: 795: if (type == TIFF_BYTE || type == TIFF_UNDEFINED) { -: 796: status = ImagingLibTiffSetField(&encoder->state, -: 797: (ttag_t) key_int, -: 798: PyBytes_Size(value), PyBytes_AsString(value)); -: 799: } else if (is_var_length) { -: 800: Py_ssize_t len,i; -: 801: TRACE(("Setting from Tuple: %d \n", key_int)); -: 802: len = PyTuple_Size(value); -: 803: -: 804: if (key_int == TIFFTAG_COLORMAP) { -: 805: int stride = 256; -: 806: if (len != 768) { -: 807: PyErr_SetString(PyExc_ValueError, "Requiring 768 items for for Colormap"); -: 808: return NULL; -: 809: } -: 810: UINT16 *av; -: 811: /* malloc check ok, calloc checks for overflow */ -: 812: av = calloc(len, sizeof(UINT16)); -: 813: if (av) { -: 814: for (i=0;istate, (ttag_t) key_int, -: 818: av, -: 819: av + stride, -: 820: av + stride * 2); -: 821: free(av); -: 822: } -: 823: } else if (type == TIFF_SHORT) { -: 824: UINT16 *av; -: 825: /* malloc check ok, calloc checks for overflow */ -: 826: av = calloc(len, sizeof(UINT16)); -: 827: if (av) { -: 828: for (i=0;istate, (ttag_t) key_int, len, av); -: 832: free(av); -: 833: } -: 834: } else if (type == TIFF_LONG) { -: 835: UINT32 *av; -: 836: /* malloc check ok, calloc checks for overflow */ -: 837: av = calloc(len, sizeof(UINT32)); -: 838: if (av) { -: 839: for (i=0;istate, (ttag_t) key_int, len, av); -: 843: free(av); -: 844: } -: 845: } else if (type == TIFF_SBYTE) { -: 846: INT8 *av; -: 847: /* malloc check ok, calloc checks for overflow */ -: 848: av = calloc(len, sizeof(INT8)); -: 849: if (av) { -: 850: for (i=0;istate, (ttag_t) key_int, len, av); -: 854: free(av); -: 855: } -: 856: } else if (type == TIFF_SSHORT) { -: 857: INT16 *av; -: 858: /* malloc check ok, calloc checks for overflow */ -: 859: av = calloc(len, sizeof(INT16)); -: 860: if (av) { -: 861: for (i=0;istate, (ttag_t) key_int, len, av); -: 865: free(av); -: 866: } -: 867: } else if (type == TIFF_SLONG) { -: 868: INT32 *av; -: 869: /* malloc check ok, calloc checks for overflow */ -: 870: av = calloc(len, sizeof(INT32)); -: 871: if (av) { -: 872: for (i=0;istate, (ttag_t) key_int, len, av); -: 876: free(av); -: 877: } -: 878: } else if (type == TIFF_FLOAT) { -: 879: FLOAT32 *av; -: 880: /* malloc check ok, calloc checks for overflow */ -: 881: av = calloc(len, sizeof(FLOAT32)); -: 882: if (av) { -: 883: for (i=0;istate, (ttag_t) key_int, len, av); -: 887: free(av); -: 888: } -: 889: } else if (type == TIFF_DOUBLE) { -: 890: FLOAT64 *av; -: 891: /* malloc check ok, calloc checks for overflow */ -: 892: av = calloc(len, sizeof(FLOAT64)); -: 893: if (av) { -: 894: for (i=0;istate, (ttag_t) key_int, len, av); -: 898: free(av); -: 899: } -: 900: } -: 901: } else { -: 902: if (type == TIFF_SHORT) { -: 903: status = ImagingLibTiffSetField(&encoder->state, -: 904: (ttag_t) key_int, -: 905: (UINT16)PyLong_AsLong(value)); -: 906: } else if (type == TIFF_LONG) { -: 907: status = ImagingLibTiffSetField(&encoder->state, -: 908: (ttag_t) key_int, -: 909: (UINT32)PyLong_AsLong(value)); -: 910: } else if (type == TIFF_SSHORT) { -: 911: status = ImagingLibTiffSetField(&encoder->state, -: 912: (ttag_t) key_int, -: 913: (INT16)PyLong_AsLong(value)); -: 914: } else if (type == TIFF_SLONG) { -: 915: status = ImagingLibTiffSetField(&encoder->state, -: 916: (ttag_t) key_int, -: 917: (INT32)PyLong_AsLong(value)); -: 918: } else if (type == TIFF_FLOAT) { -: 919: status = ImagingLibTiffSetField(&encoder->state, -: 920: (ttag_t) key_int, -: 921: (FLOAT32)PyFloat_AsDouble(value)); -: 922: } else if (type == TIFF_DOUBLE) { -: 923: status = ImagingLibTiffSetField(&encoder->state, -: 924: (ttag_t) key_int, -: 925: (FLOAT64)PyFloat_AsDouble(value)); -: 926: } else if (type == TIFF_SBYTE) { -: 927: status = ImagingLibTiffSetField(&encoder->state, -: 928: (ttag_t) key_int, -: 929: (INT8)PyLong_AsLong(value)); -: 930: } else if (type == TIFF_ASCII) { -: 931: status = ImagingLibTiffSetField(&encoder->state, -: 932: (ttag_t) key_int, -: 933: PyBytes_AsString(value)); -: 934: } else if (type == TIFF_RATIONAL) { -: 935: status = ImagingLibTiffSetField(&encoder->state, -: 936: (ttag_t) key_int, -: 937: (FLOAT64)PyFloat_AsDouble(value)); -: 938: } else { -: 939: TRACE(("Unhandled type for key %d : %s \n", -: 940: key_int, -: 941: PyBytes_AsString(PyObject_Str(value)))); -: 942: } -: 943: } -: 944: if (!status) { -: 945: TRACE(("Error setting Field\n")); -: 946: Py_DECREF(encoder); -: 947: PyErr_SetString(PyExc_RuntimeError, "Error setting from dictionary"); -: 948: return NULL; -: 949: } -: 950: } -: 951: -: 952: encoder->encode = ImagingLibTiffEncode; -: 953: -: 954: return (PyObject*) encoder; -: 955:} -: 956: -: 957:#endif -: 958: -: 959:/* -------------------------------------------------------------------- */ -: 960:/* JPEG */ -: 961:/* -------------------------------------------------------------------- */ -: 962: -: 963:#ifdef HAVE_LIBJPEG -: 964: -: 965:/* We better define this encoder last in this file, so the following -: 966: undef's won't mess things up for the Imaging library proper. */ -: 967: -: 968:#undef HAVE_PROTOTYPES -: 969:#undef HAVE_STDDEF_H -: 970:#undef HAVE_STDLIB_H -: 971:#undef UINT8 -: 972:#undef UINT16 -: 973:#undef UINT32 -: 974:#undef INT8 -: 975:#undef INT16 -: 976:#undef INT32 -: 977: -: 978:#include "libImaging/Jpeg.h" -: 979: function get_qtables_arrays called 157 returned 100% blocks executed 63% 157: 980:static unsigned int* get_qtables_arrays(PyObject* qtables, int* qtablesLen) { -: 981: PyObject* tables; -: 982: PyObject* table; -: 983: PyObject* table_data; -: 984: int i, j, num_tables; -: 985: unsigned int *qarrays; -: 986: 157: 987: if ((qtables == NULL) || (qtables == Py_None)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 20% (fallthrough) branch 3 taken 80% -: 988: return NULL; -: 989: } -: 990: 32: 991: if (!PySequence_Check(qtables)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 992: PyErr_SetString(PyExc_ValueError, "Invalid quantization tables"); call 0 never executed #####: 993: return NULL; -: 994: } -: 995: 32: 996: tables = PySequence_Fast(qtables, "expected a sequence"); call 0 returned 100% 32: 997: num_tables = PySequence_Size(qtables); call 0 returned 100% 32: 998: if (num_tables < 1 || num_tables > NUM_QUANT_TBLS) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 999: PyErr_SetString(PyExc_ValueError, call 0 never executed -: 1000: "Not a valid number of quantization tables. Should be between 1 and 4."); #####: 1001: Py_DECREF(tables); branch 0 never executed branch 1 never executed call 2 never executed -: 1002: return NULL; -: 1003: } -: 1004: /* malloc check ok, num_tables <4, DCTSIZE2 == 64 from jpeglib.h */ 32: 1005: qarrays = (unsigned int*) malloc(num_tables * DCTSIZE2 * sizeof(unsigned int)); 32: 1006: if (!qarrays) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 1007: Py_DECREF(tables); branch 0 never executed branch 1 never executed call 2 never executed #####: 1008: PyErr_NoMemory(); call 0 never executed #####: 1009: return NULL; -: 1010: } 63: 1011: for (i = 0; i < num_tables; i++) { branch 0 taken 66% branch 1 taken 34% (fallthrough) 63: 1012: table = PySequence_Fast_GET_ITEM(tables, i); branch 0 taken 100% (fallthrough) branch 1 taken 0% 63: 1013: if (!PySequence_Check(table)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1014: PyErr_SetString(PyExc_ValueError, "Invalid quantization tables"); call 0 never executed #####: 1015: goto JPEG_QTABLES_ERR; -: 1016: } 63: 1017: if (PySequence_Size(table) != DCTSIZE2) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1018: PyErr_SetString(PyExc_ValueError, "Invalid quantization table size"); call 0 never executed #####: 1019: goto JPEG_QTABLES_ERR; -: 1020: } 63: 1021: table_data = PySequence_Fast(table, "expected a sequence"); 4095: 1022: for (j = 0; j < DCTSIZE2; j++) { call 0 returned 100% branch 1 taken 98% branch 2 taken 2% (fallthrough) 4032: 1023: qarrays[i * DCTSIZE2 + j] = PyLong_AS_LONG(PySequence_Fast_GET_ITEM(table_data, j)); branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% -: 1024: } 63: 1025: Py_DECREF(table_data); branch 0 taken 0% (fallthrough) branch 1 taken 100% call 2 never executed -: 1026: } -: 1027: 32: 1028: *qtablesLen = num_tables; -: 1029: -: 1030:JPEG_QTABLES_ERR: 32: 1031: Py_DECREF(tables); // Run on both error and not error branch 0 taken 0% (fallthrough) branch 1 taken 100% call 2 never executed 32: 1032: if (PyErr_Occurred()) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 1033: free(qarrays); #####: 1034: qarrays = NULL; #####: 1035: return NULL; -: 1036: } -: 1037: -: 1038: return qarrays; -: 1039:} -: 1040: -: 1041:PyObject* function PyImaging_JpegEncoderNew called 158 returned 100% blocks executed 87% 158: 1042:PyImaging_JpegEncoderNew(PyObject* self, PyObject* args) -: 1043:{ -: 1044: ImagingEncoderObject* encoder; -: 1045: -: 1046: char *mode; -: 1047: char *rawmode; 158: 1048: Py_ssize_t quality = 0; 158: 1049: Py_ssize_t progressive = 0; 158: 1050: Py_ssize_t smooth = 0; 158: 1051: Py_ssize_t optimize = 0; 158: 1052: Py_ssize_t streamtype = 0; /* 0=interchange, 1=tables only, 2=image only */ 158: 1053: Py_ssize_t xdpi = 0, ydpi = 0; 158: 1054: Py_ssize_t subsampling = -1; /* -1=default, 0=none, 1=medium, 2=high */ 158: 1055: PyObject* qtables=NULL; 158: 1056: unsigned int *qarrays = NULL; 158: 1057: int qtablesLen = 0; 158: 1058: char* extra = NULL; -: 1059: Py_ssize_t extra_size; 158: 1060: char* rawExif = NULL; 158: 1061: Py_ssize_t rawExifLen = 0; -: 1062: 158: 1063: if (!PyArg_ParseTuple(args, "ss|nnnnnnnnOy#y#", call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 1064: &mode, &rawmode, &quality, -: 1065: &progressive, &smooth, &optimize, &streamtype, -: 1066: &xdpi, &ydpi, &subsampling, &qtables, &extra, &extra_size, -: 1067: &rawExif, &rawExifLen)) { -: 1068: return NULL; -: 1069: } -: 1070: 157: 1071: encoder = PyImaging_EncoderNew(sizeof(JPEGENCODERSTATE)); call 0 returned 100% 157: 1072: if (encoder == NULL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1073: return NULL; -: 1074: } -: 1075: -: 1076: // libjpeg-turbo supports different output formats. -: 1077: // We are choosing Pillow's native format (3 color bytes + 1 padding) -: 1078: // to avoid extra conversion in Pack.c. 157: 1079: if (ImagingJpegUseJCSExtensions() && strcmp(rawmode, "RGB") == 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 65% (fallthrough) branch 4 taken 35% branch 5 taken 100% (fallthrough) branch 6 taken 0% branch 7 taken 100% (fallthrough) branch 8 taken 0% branch 9 taken 65% (fallthrough) branch 10 taken 35% 102: 1080: rawmode = "RGBX"; -: 1081: } -: 1082: 157: 1083: if (get_packer(encoder, mode, rawmode) < 0) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1084: return NULL; -: 1085: } -: 1086: -: 1087: // Freed in JpegEncode, Case 5 157: 1088: qarrays = get_qtables_arrays(qtables, &qtablesLen); call 0 returned 100% -: 1089: 169: 1090: if (extra && extra_size > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 8% (fallthrough) branch 3 taken 92% -: 1091: /* malloc check ok, length is from python parsearg */ 12: 1092: char* p = malloc(extra_size); // Freed in JpegEncode, Case 5 12: 1093: if (!p) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1094: return PyErr_NoMemory(); call 0 never executed -: 1095: } 24: 1096: memcpy(p, extra, extra_size); 12: 1097: extra = p; -: 1098: } else { 145: 1099: extra = NULL; -: 1100: } -: 1101: 162: 1102: if (rawExif && rawExifLen > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 3% (fallthrough) branch 3 taken 97% -: 1103: /* malloc check ok, length is from python parsearg */ 5: 1104: char* pp = malloc(rawExifLen); // Freed in JpegEncode, Case 5 5: 1105: if (!pp) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1106: if (extra) { branch 0 never executed branch 1 never executed #####: 1107: free(extra); -: 1108: } #####: 1109: return PyErr_NoMemory(); call 0 never executed -: 1110: } 10: 1111: memcpy(pp, rawExif, rawExifLen); 5: 1112: rawExif = pp; -: 1113: } else { 152: 1114: rawExif = NULL; -: 1115: } -: 1116: 157: 1117: encoder->encode = ImagingJpegEncode; -: 1118: 314: 1119: strncpy(((JPEGENCODERSTATE*)encoder->state.context)->rawmode, rawmode, 8); -: 1120: 157: 1121: ((JPEGENCODERSTATE*)encoder->state.context)->quality = quality; 157: 1122: ((JPEGENCODERSTATE*)encoder->state.context)->qtables = qarrays; 157: 1123: ((JPEGENCODERSTATE*)encoder->state.context)->qtablesLen = qtablesLen; 157: 1124: ((JPEGENCODERSTATE*)encoder->state.context)->subsampling = subsampling; 157: 1125: ((JPEGENCODERSTATE*)encoder->state.context)->progressive = progressive; 157: 1126: ((JPEGENCODERSTATE*)encoder->state.context)->smooth = smooth; 157: 1127: ((JPEGENCODERSTATE*)encoder->state.context)->optimize = optimize; 157: 1128: ((JPEGENCODERSTATE*)encoder->state.context)->streamtype = streamtype; 157: 1129: ((JPEGENCODERSTATE*)encoder->state.context)->xdpi = xdpi; 157: 1130: ((JPEGENCODERSTATE*)encoder->state.context)->ydpi = ydpi; 157: 1131: ((JPEGENCODERSTATE*)encoder->state.context)->extra = extra; 157: 1132: ((JPEGENCODERSTATE*)encoder->state.context)->extra_size = extra_size; 157: 1133: ((JPEGENCODERSTATE*)encoder->state.context)->rawExif = rawExif; 157: 1134: ((JPEGENCODERSTATE*)encoder->state.context)->rawExifLen = rawExifLen; -: 1135: 157: 1136: return (PyObject*) encoder; -: 1137:} -: 1138: -: 1139:#endif -: 1140: -: 1141: -: 1142:/* -------------------------------------------------------------------- */ -: 1143:/* JPEG 2000 */ -: 1144:/* -------------------------------------------------------------------- */ -: 1145: -: 1146:#ifdef HAVE_OPENJPEG -: 1147: -: 1148:#include "libImaging/Jpeg2K.h" -: 1149: -: 1150:static void function j2k_decode_coord_tuple called 73 returned 100% blocks executed 80% 73: 1151:j2k_decode_coord_tuple(PyObject *tuple, int *x, int *y) -: 1152:{ 73: 1153: *x = *y = 0; -: 1154: 73: 1155: if (tuple && PyTuple_Check(tuple) && PyTuple_GET_SIZE(tuple) == 2) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 10% (fallthrough) branch 3 taken 90% branch 4 taken 100% (fallthrough) branch 5 taken 0% 7: 1156: *x = (int)PyLong_AsLong(PyTuple_GET_ITEM(tuple, 0)); call 0 returned 100% 7: 1157: *y = (int)PyLong_AsLong(PyTuple_GET_ITEM(tuple, 1)); call 0 returned 100% -: 1158: 7: 1159: if (*x < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1160: *x = 0; -: 1161: } 7: 1162: if (*y < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1163: *y = 0; -: 1164: } -: 1165: } 73: 1166:} -: 1167: -: 1168:PyObject* function PyImaging_Jpeg2KEncoderNew called 15 returned 100% blocks executed 76% 15: 1169:PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) -: 1170:{ -: 1171: ImagingEncoderObject *encoder; -: 1172: JPEG2KENCODESTATE *context; -: 1173: -: 1174: char *mode; -: 1175: char *format; -: 1176: OPJ_CODEC_FORMAT codec_format; 15: 1177: PyObject *offset = NULL, *tile_offset = NULL, *tile_size = NULL; 15: 1178: char *quality_mode = "rates"; 15: 1179: PyObject *quality_layers = NULL; 15: 1180: Py_ssize_t num_resolutions = 0; 15: 1181: PyObject *cblk_size = NULL, *precinct_size = NULL; 15: 1182: PyObject *irreversible = NULL; 15: 1183: char *progression = "LRCP"; -: 1184: OPJ_PROG_ORDER prog_order; 15: 1185: char *cinema_mode = "no"; -: 1186: OPJ_CINEMA_MODE cine_mode; 15: 1187: Py_ssize_t fd = -1; -: 1188: 15: 1189: if (!PyArg_ParseTuple(args, "ss|OOOsOnOOOssn", &mode, &format, call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 1190: &offset, &tile_offset, &tile_size, -: 1191: &quality_mode, &quality_layers, &num_resolutions, -: 1192: &cblk_size, &precinct_size, -: 1193: &irreversible, &progression, &cinema_mode, -: 1194: &fd)) { -: 1195: return NULL; -: 1196: } -: 1197: 15: 1198: if (strcmp (format, "j2k") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 never executed branch 5 never executed branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 1199: codec_format = OPJ_CODEC_J2K; 15: 1200: } else if (strcmp (format, "jpt") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 1201: codec_format = OPJ_CODEC_JPT; 15: 1202: } else if (strcmp (format, "jp2") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 1203: codec_format = OPJ_CODEC_JP2; -: 1204: } else { -: 1205: return NULL; -: 1206: } -: 1207: 15: 1208: if (strcmp(progression, "LRCP") == 0) { branch 0 taken 7% (fallthrough) branch 1 taken 93% -: 1209: prog_order = OPJ_LRCP; 1: 1210: } else if (strcmp(progression, "RLCP") == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 1211: prog_order = OPJ_RLCP; #####: 1212: } else if (strcmp(progression, "RPCL") == 0) { branch 0 never executed branch 1 never executed -: 1213: prog_order = OPJ_RPCL; #####: 1214: } else if (strcmp(progression, "PCRL") == 0) { branch 0 never executed branch 1 never executed -: 1215: prog_order = OPJ_PCRL; #####: 1216: } else if (strcmp(progression, "CPRL") == 0) { branch 0 never executed branch 1 never executed -: 1217: prog_order = OPJ_CPRL; -: 1218: } else { -: 1219: return NULL; -: 1220: } -: 1221: 15: 1222: if (strcmp(cinema_mode, "no") == 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% -: 1223: cine_mode = OPJ_OFF; #####: 1224: } else if (strcmp(cinema_mode, "cinema2k-24") == 0) { branch 0 never executed branch 1 never executed -: 1225: cine_mode = OPJ_CINEMA2K_24; #####: 1226: } else if (strcmp(cinema_mode, "cinema2k-48") == 0) { branch 0 never executed branch 1 never executed -: 1227: cine_mode = OPJ_CINEMA2K_48; #####: 1228: } else if (strcmp(cinema_mode, "cinema4k-24") == 0) { branch 0 never executed branch 1 never executed -: 1229: cine_mode = OPJ_CINEMA4K_24; -: 1230: } else { -: 1231: return NULL; -: 1232: } -: 1233: 15: 1234: encoder = PyImaging_EncoderNew(sizeof(JPEG2KENCODESTATE)); call 0 returned 100% 15: 1235: if (!encoder) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 1236: return NULL; -: 1237: } -: 1238: 15: 1239: encoder->encode = ImagingJpeg2KEncode; 15: 1240: encoder->cleanup = ImagingJpeg2KEncodeCleanup; 15: 1241: encoder->pushes_fd = 1; -: 1242: 15: 1243: context = (JPEG2KENCODESTATE *)encoder->state.context; -: 1244: 15: 1245: context->fd = fd; 15: 1246: context->format = codec_format; 15: 1247: context->offset_x = context->offset_y = 0; -: 1248: -: 1249: 15: 1250: j2k_decode_coord_tuple(offset, &context->offset_x, &context->offset_y); call 0 returned 100% 15: 1251: j2k_decode_coord_tuple(tile_offset, call 0 returned 100% -: 1252: &context->tile_offset_x, -: 1253: &context->tile_offset_y); 15: 1254: j2k_decode_coord_tuple(tile_size, call 0 returned 100% -: 1255: &context->tile_size_x, -: 1256: &context->tile_size_y); -: 1257: -: 1258: /* Error on illegal tile offsets */ 15: 1259: if (context->tile_size_x && context->tile_size_y) { branch 0 taken 20% (fallthrough) branch 1 taken 80% branch 2 taken 100% (fallthrough) branch 3 taken 0% 3: 1260: if (context->tile_offset_x <= context->offset_x - context->tile_size_x branch 0 taken 67% (fallthrough) branch 1 taken 33% 2: 1261: || context->tile_offset_y <= context->offset_y - context->tile_size_y) { branch 0 taken 0% (fallthrough) branch 1 taken 100% 1: 1262: PyErr_SetString(PyExc_ValueError, call 0 returned 100% -: 1263: "JPEG 2000 tile offset too small; top left tile must " -: 1264: "intersect image area"); 1: 1265: Py_DECREF(encoder); branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% -: 1266: return NULL; -: 1267: } -: 1268: 2: 1269: if (context->tile_offset_x > context->offset_x branch 0 taken 100% (fallthrough) branch 1 taken 0% 2: 1270: || context->tile_offset_y > context->offset_y) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1271: PyErr_SetString(PyExc_ValueError, call 0 never executed -: 1272: "JPEG 2000 tile offset too large to cover image area"); #####: 1273: Py_DECREF(encoder); branch 0 never executed branch 1 never executed call 2 never executed -: 1274: return NULL; -: 1275: } -: 1276: } -: 1277: 14: 1278: if (quality_layers && PySequence_Check(quality_layers)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% call 2 returned 100% branch 3 taken 43% (fallthrough) branch 4 taken 57% 6: 1279: context->quality_is_in_db = strcmp (quality_mode, "dB") == 0; branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 never executed branch 3 never executed 6: 1280: context->quality_layers = quality_layers; 6: 1281: Py_INCREF(quality_layers); -: 1282: } -: 1283: 14: 1284: context->num_resolutions = num_resolutions; -: 1285: 14: 1286: j2k_decode_coord_tuple(cblk_size, call 0 returned 100% -: 1287: &context->cblk_width, -: 1288: &context->cblk_height); 14: 1289: j2k_decode_coord_tuple(precinct_size, call 0 returned 100% -: 1290: &context->precinct_width, -: 1291: &context->precinct_height); -: 1292: 14: 1293: context->irreversible = PyObject_IsTrue(irreversible); call 0 returned 100% 14: 1294: context->progression = prog_order; 14: 1295: context->cinema_mode = cine_mode; -: 1296: 14: 1297: return (PyObject *)encoder; -: 1298:} -: 1299: -: 1300:#endif -: 1301: -: 1302:/* -: 1303: * Local Variables: -: 1304: * c-basic-offset: 4 -: 1305: * End: -: 1306: * -: 1307: */ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#codec_fd.c.gcov -: 0:Source:src/libImaging/codec_fd.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/codec_fd.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#PcdDecode.c.gcov -: 0:Source:src/libImaging/PcdDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/PcdDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/PcdDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for uncompressed PCD image data. -: 6: * -: 7: * history: -: 8: * 96-05-10 fl Created -: 9: * 96-05-18 fl New tables -: 10: * 97-01-25 fl Use PhotoYCC unpacker -: 11: * -: 12: * notes: -: 13: * This driver supports uncompressed PCD modes only -: 14: * (resolutions up to 768x512). -: 15: * -: 16: * Copyright (c) Fredrik Lundh 1996-97. -: 17: * Copyright (c) Secret Labs AB 1997. -: 18: * -: 19: * See the README file for information on usage and redistribution. -: 20: */ -: 21: -: 22: -: 23:#include "Imaging.h" -: 24: -: 25: -: 26:int function ImagingPcdDecode called 9 returned 100% blocks executed 100% 9: 27:ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 28:{ -: 29: int x; -: 30: int chunk; -: 31: UINT8* out; -: 32: UINT8* ptr; -: 33: 9: 34: ptr = buf; -: 35: 9: 36: chunk = 3 * state->xsize; -: 37: -: 38: for (;;) { -: 39: -: 40: /* We need data for two full lines before we can do anything */ 264: 41: if (bytes < chunk) { branch 0 taken 3% (fallthrough) branch 1 taken 97% 8: 42: return ptr - buf; -: 43: } -: 44: -: 45: /* Unpack first line */ 256: 46: out = state->buffer; 196864: 47: for (x = 0; x < state->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 196608: 48: out[0] = ptr[x]; 196608: 49: out[1] = ptr[(x+4*state->xsize)/2]; 196608: 50: out[2] = ptr[(x+5*state->xsize)/2]; 196608: 51: out += 3; -: 52: } -: 53: 512: 54: state->shuffle((UINT8*) im->image[state->y], call 0 returned 100% 256: 55: state->buffer, state->xsize); -: 56: 256: 57: if (++state->y >= state->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 58: return -1; /* This can hardly happen */ -: 59: } -: 60: -: 61: /* Unpack second line */ 256: 62: out = state->buffer; 196864: 63: for (x = 0; x < state->xsize; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 196608: 64: out[0] = ptr[x+state->xsize]; 196608: 65: out[1] = ptr[(x+4*state->xsize)/2]; 196608: 66: out[2] = ptr[(x+5*state->xsize)/2]; 196608: 67: out += 3; -: 68: } -: 69: 512: 70: state->shuffle((UINT8*) im->image[state->y], call 0 returned 100% 256: 71: state->buffer, state->xsize); -: 72: 256: 73: if (++state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 74: return -1; -: 75: } -: 76: 255: 77: ptr += chunk; 255: 78: bytes -= chunk; -: 79: 255: 80: } -: 81:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#JpegDecode.c.gcov -: 0:Source:src/libImaging/JpegDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/JpegDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#Paste.c.gcov -: 0:Source:src/libImaging/Paste.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Paste.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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 0% (fallthrough) branch 1 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% -: 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 86% 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 0% (fallthrough) branch 1 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% -: 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#GifDecode.c.gcov -: 0:Source:src/libImaging/GifDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/GifDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#BcnDecode.c.gcov -: 0:Source:src/libImaging/BcnDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/BcnDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/BcnDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * -: 4: * decoder for DXTn-compressed data -: 5: * -: 6: * Format documentation: -: 7: * https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt -: 8: * -: 9: * The contents of this file are in the public domain (CC0) -: 10: * Full text of the CC0 license: -: 11: * https://creativecommons.org/publicdomain/zero/1.0/ -: 12: */ -: 13: -: 14: -: 15:#include "Imaging.h" -: 16: -: 17: -: 18:typedef struct { -: 19: UINT8 r, g, b, a; -: 20:} rgba; -: 21: -: 22:typedef struct { -: 23: UINT8 l; -: 24:} lum; -: 25: -: 26:typedef struct { -: 27: FLOAT32 r, g, b; -: 28:} rgb32f; -: 29: -: 30:typedef struct { -: 31: UINT16 c0, c1; -: 32: UINT32 lut; -: 33:} bc1_color; -: 34: -: 35:typedef struct { -: 36: UINT8 a0, a1; -: 37: UINT8 lut[6]; -: 38:} bc3_alpha; -: 39: -: 40:#define LOAD16(p) \ -: 41: (p)[0] | ((p)[1] << 8) -: 42: -: 43:#define LOAD32(p) \ -: 44: (p)[0] | ((p)[1] << 8) | ((p)[2] << 16) | ((p)[3] << 24) -: 45: -: 46:static void bc1_color_load(bc1_color *dst, const UINT8 *src) { 17401: 47: dst->c0 = LOAD16(src); 17401: 48: dst->c1 = LOAD16(src + 2); 17401: 49: dst->lut = LOAD32(src + 4); -: 50:} -: 51: -: 52:static void bc3_alpha_load(bc3_alpha *dst, const UINT8 *src) { -: 53: memcpy(dst, src, sizeof(bc3_alpha)); -: 54:} -: 55: -: 56:static rgba decode_565(UINT16 x) { -: 57: rgba c; -: 58: int r, g, b; 34802: 59: r = (x & 0xf800) >> 8; 34802: 60: r |= r >> 5; 34802: 61: c.r = r; 34802: 62: g = (x & 0x7e0) >> 3; 34802: 63: g |= g >> 6; 34802: 64: c.g = g; 34802: 65: b = (x & 0x1f) << 3; 34802: 66: b |= b >> 5; 34802: 67: c.b = b; 34802: 68: c.a = 0xff; -: 69: return c; -: 70:} -: 71: function decode_bc1_color called 17401 returned 100% blocks executed 100% 17401: 72:static void decode_bc1_color(rgba *dst, const UINT8 *src) { -: 73: bc1_color col; -: 74: rgba p[4]; -: 75: int n, cw; -: 76: UINT16 r0, g0, b0, r1, g1, b1; 17401: 77: bc1_color_load(&col, src); -: 78: 34802: 79: p[0] = decode_565(col.c0); 17401: 80: r0 = p[0].r; 17401: 81: g0 = p[0].g; 17401: 82: b0 = p[0].b; 34802: 83: p[1] = decode_565(col.c1); 17401: 84: r1 = p[1].r; 17401: 85: g1 = p[1].g; 17401: 86: b1 = p[1].b; 17401: 87: if (col.c0 > col.c1) { branch 0 taken 89% (fallthrough) branch 1 taken 11% 15466: 88: p[2].r = (2*r0 + 1*r1) / 3; 15466: 89: p[2].g = (2*g0 + 1*g1) / 3; 15466: 90: p[2].b = (2*b0 + 1*b1) / 3; 15466: 91: p[2].a = 0xff; 15466: 92: p[3].r = (1*r0 + 2*r1) / 3; 15466: 93: p[3].g = (1*g0 + 2*g1) / 3; 15466: 94: p[3].b = (1*b0 + 2*b1) / 3; 15466: 95: p[3].a = 0xff; -: 96: } else { 1935: 97: p[2].r = (r0 + r1) / 2; 1935: 98: p[2].g = (g0 + g1) / 2; 1935: 99: p[2].b = (b0 + b1) / 2; 1935: 100: p[2].a = 0xff; 1935: 101: p[3].r = 0; 1935: 102: p[3].g = 0; 1935: 103: p[3].b = 0; 1935: 104: p[3].a = 0; -: 105: } 278416: 106: for (n = 0; n < 16; n++) { branch 0 taken 94% branch 1 taken 6% (fallthrough) 278416: 107: cw = 3 & (col.lut >> (2 * n)); 278416: 108: dst[n] = p[cw]; -: 109: } 17401: 110:} -: 111: function decode_bc3_alpha called 8185 returned 100% blocks executed 100% 8185: 112:static void decode_bc3_alpha(char *dst, const UINT8 *src, int stride, int o) { -: 113: bc3_alpha b; -: 114: UINT16 a0, a1; -: 115: UINT8 a[8]; -: 116: int n, lut, aw; 8185: 117: bc3_alpha_load(&b, src); -: 118: 8185: 119: a0 = b.a0; 8185: 120: a1 = b.a1; 8185: 121: a[0] = (UINT8)a0; 8185: 122: a[1] = (UINT8)a1; 8185: 123: if (a0 > a1) { branch 0 taken 87% (fallthrough) branch 1 taken 13% 7087: 124: a[2] = (6*a0 + 1*a1) / 7; 7087: 125: a[3] = (5*a0 + 2*a1) / 7; 7087: 126: a[4] = (4*a0 + 3*a1) / 7; 7087: 127: a[5] = (3*a0 + 4*a1) / 7; 7087: 128: a[6] = (2*a0 + 5*a1) / 7; 7087: 129: a[7] = (1*a0 + 6*a1) / 7; -: 130: } else { 1098: 131: a[2] = (4*a0 + 1*a1) / 5; 1098: 132: a[3] = (3*a0 + 2*a1) / 5; 1098: 133: a[4] = (2*a0 + 3*a1) / 5; 1098: 134: a[5] = (1*a0 + 4*a1) / 5; 1098: 135: a[6] = 0; 1098: 136: a[7] = 0xff; -: 137: } 8185: 138: lut = b.lut[0] | (b.lut[1] << 8) | (b.lut[2] << 16); 73665: 139: for (n = 0; n < 8; n++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 65480: 140: aw = 7 & (lut >> (3 * n)); 65480: 141: dst[stride * n + o] = a[aw]; -: 142: } 8185: 143: lut = b.lut[3] | (b.lut[4] << 8) | (b.lut[5] << 16); 73665: 144: for (n = 0; n < 8; n++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 65480: 145: aw = 7 & (lut >> (3 * n)); 65480: 146: dst[stride * (8+n) + o] = a[aw]; -: 147: } 8185: 148:} -: 149: -: 150:static void decode_bc1_block(rgba *col, const UINT8* src) { 5120: 151: decode_bc1_color(col, src); call 0 returned 100% -: 152:} -: 153: function decode_bc2_block called 4096 returned 100% blocks executed 100% 4096: 154:static void decode_bc2_block(rgba *col, const UINT8* src) { -: 155: int n, bitI, byI, av; 4096: 156: decode_bc1_color(col, src + 8); 69632: 157: for (n = 0; n < 16; n++) { call 0 returned 100% branch 1 taken 94% branch 2 taken 6% (fallthrough) 65536: 158: bitI = n * 4; 65536: 159: byI = bitI >> 3; 65536: 160: av = 0xf & (src[byI] >> (bitI & 7)); 65536: 161: av = (av << 4) | av; 65536: 162: col[n].a = av; -: 163: } 4096: 164:} -: 165: function decode_bc3_block called 8185 returned 100% blocks executed 100% 8185: 166:static void decode_bc3_block(rgba *col, const UINT8* src) { 8185: 167: decode_bc1_color(col, src + 8); call 0 returned 100% 8185: 168: decode_bc3_alpha((char *)col, src, sizeof(col[0]), 3); call 0 returned 100% 8185: 169:} -: 170: -: 171:static void decode_bc4_block(lum *col, const UINT8* src) { #####: 172: decode_bc3_alpha((char *)col, src, sizeof(col[0]), 0); call 0 never executed -: 173:} -: 174: function decode_bc5_block called 0 returned 0% blocks executed 0% #####: 175:static void decode_bc5_block(rgba *col, const UINT8* src) { #####: 176: decode_bc3_alpha((char *)col, src, sizeof(col[0]), 0); call 0 never executed #####: 177: decode_bc3_alpha((char *)col, src + 8, sizeof(col[0]), 1); call 0 never executed #####: 178:} -: 179: -: 180:/* BC6 and BC7 are described here: -: 181: https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_texture_compression_bptc.txt */ -: 182: -: 183:static UINT8 get_bit(const UINT8* src, int bit) { #####: 184: int by = bit >> 3; #####: 185: bit &= 7; #####: 186: return (src[by] >> bit) & 1; -: 187:} -: 188: function get_bits called 134464 returned 100% blocks executed 100% 134464: 189:static UINT8 get_bits(const UINT8* src, int bit, int count) { -: 190: UINT8 v; -: 191: int x; 142900: 192: int by = bit >> 3; 142900: 193: bit &= 7; 134464: 194: if (!count) { branch 0 taken 94% (fallthrough) branch 1 taken 6% -: 195: return 0; -: 196: } 134353: 197: if (bit + count <= 8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 69% (fallthrough) branch 5 taken 31% 95205: 198: v = (src[by] >> bit) & ((1 << count) - 1); -: 199: } else { 39148: 200: x = src[by] | (src[by+1] << 8); 39148: 201: v = (x >> bit) & ((1 << count) - 1); -: 202: } -: 203: return v; -: 204:} -: 205: -: 206:/* BC7 */ -: 207:typedef struct { -: 208: char ns; -: 209: char pb; -: 210: char rb; -: 211: char isb; -: 212: char cb; -: 213: char ab; -: 214: char epb; -: 215: char spb; -: 216: char ib; -: 217: char ib2; -: 218:} bc7_mode_info; -: 219: -: 220:static const bc7_mode_info bc7_modes[] = { -: 221: {3, 4, 0, 0, 4, 0, 1, 0, 3, 0}, -: 222: {2, 6, 0, 0, 6, 0, 0, 1, 3, 0}, -: 223: {3, 6, 0, 0, 5, 0, 0, 0, 2, 0}, -: 224: {2, 6, 0, 0, 7, 0, 1, 0, 2, 0}, -: 225: {1, 0, 2, 1, 5, 6, 0, 0, 2, 3}, -: 226: {1, 0, 2, 0, 7, 8, 0, 0, 2, 2}, -: 227: {1, 0, 0, 0, 7, 7, 1, 0, 4, 0}, -: 228: {2, 6, 0, 0, 5, 5, 1, 0, 2, 0} -: 229:}; -: 230: -: 231:/* Subset indices: -: 232: Table.P2, 1 bit per index */ -: 233:static const UINT16 bc7_si2[] = { -: 234: 0xcccc, 0x8888, 0xeeee, 0xecc8, 0xc880, 0xfeec, 0xfec8, 0xec80, -: 235: 0xc800, 0xffec, 0xfe80, 0xe800, 0xffe8, 0xff00, 0xfff0, 0xf000, -: 236: 0xf710, 0x008e, 0x7100, 0x08ce, 0x008c, 0x7310, 0x3100, 0x8cce, -: 237: 0x088c, 0x3110, 0x6666, 0x366c, 0x17e8, 0x0ff0, 0x718e, 0x399c, -: 238: 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a, -: 239: 0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660, -: 240: 0x0272, 0x04e4, 0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, -: 241: 0x9336, 0x9cc6, 0x817e, 0xe718, 0xccf0, 0x0fcc, 0x7744, 0xee22}; -: 242: -: 243:/* Table.P3, 2 bits per index */ -: 244:static const UINT32 bc7_si3[] = { -: 245: 0xaa685050, 0x6a5a5040, 0x5a5a4200, 0x5450a0a8, -: 246: 0xa5a50000, 0xa0a05050, 0x5555a0a0, 0x5a5a5050, -: 247: 0xaa550000, 0xaa555500, 0xaaaa5500, 0x90909090, -: 248: 0x94949494, 0xa4a4a4a4, 0xa9a59450, 0x2a0a4250, -: 249: 0xa5945040, 0x0a425054, 0xa5a5a500, 0x55a0a0a0, -: 250: 0xa8a85454, 0x6a6a4040, 0xa4a45000, 0x1a1a0500, -: 251: 0x0050a4a4, 0xaaa59090, 0x14696914, 0x69691400, -: 252: 0xa08585a0, 0xaa821414, 0x50a4a450, 0x6a5a0200, -: 253: 0xa9a58000, 0x5090a0a8, 0xa8a09050, 0x24242424, -: 254: 0x00aa5500, 0x24924924, 0x24499224, 0x50a50a50, -: 255: 0x500aa550, 0xaaaa4444, 0x66660000, 0xa5a0a5a0, -: 256: 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600, -: 257: 0xaa444444, 0x54a854a8, 0x95809580, 0x96969600, -: 258: 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000, -: 259: 0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, -: 260: 0x40804080, 0xa9a8a9a8, 0xaaaaaa44, 0x2a4a5254}; -: 261: -: 262:/* Anchor indices: -: 263: Table.A2 */ -: 264:static const char bc7_ai0[] = { -: 265: 15,15,15,15,15,15,15,15, -: 266: 15,15,15,15,15,15,15,15, -: 267: 15, 2, 8, 2, 2, 8, 8,15, -: 268: 2, 8, 2, 2, 8, 8, 2, 2, -: 269: 15,15, 6, 8, 2, 8,15,15, -: 270: 2, 8, 2, 2, 2,15,15, 6, -: 271: 6, 2, 6, 8,15,15, 2, 2, -: 272: 15,15,15,15,15, 2, 2,15}; -: 273: -: 274:/* Table.A3a */ -: 275:static const char bc7_ai1[] = { -: 276: 3, 3,15,15, 8, 3,15,15, -: 277: 8, 8, 6, 6, 6, 5, 3, 3, -: 278: 3, 3, 8,15, 3, 3, 6,10, -: 279: 5, 8, 8, 6, 8, 5,15,15, -: 280: 8,15, 3, 5, 6,10, 8,15, -: 281: 15, 3,15, 5,15,15,15,15, -: 282: 3,15, 5, 5, 5, 8, 5,10, -: 283: 5,10, 8,13,15,12, 3, 3}; -: 284: -: 285:/* Table.A3b */ -: 286:static const char bc7_ai2[] = { -: 287: 15, 8, 8, 3,15,15, 3, 8, -: 288: 15,15,15,15,15,15,15, 8, -: 289: 15, 8,15, 3,15, 8,15, 8, -: 290: 3,15, 6,10,15,15,10, 8, -: 291: 15, 3,15,10,10, 8, 9,10, -: 292: 6,15, 8,15, 3, 6, 6, 8, -: 293: 15, 3,15,15,15,15,15,15, -: 294: 15,15,15,15, 3,15,15, 8}; -: 295: -: 296:/* Interpolation weights */ -: 297:static const char bc7_weights2[] = {0, 21, 43, 64}; -: 298:static const char bc7_weights3[] = {0, 9, 18, 27, 37, 46, 55, 64}; -: 299:static const char bc7_weights4[] = { -: 300: 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64}; -: 301: -: 302:static const char *bc7_get_weights(int n) { 8224: 303: if (n == 2) { branch 0 never executed branch 1 never executed branch 2 taken 72% (fallthrough) branch 3 taken 28% branch 4 taken 87% (fallthrough) branch 5 taken 13% -: 304: return bc7_weights2; -: 305: } 6562: 306: if (n == 3) { branch 0 never executed branch 1 never executed branch 2 taken 32% (fallthrough) branch 3 taken 68% branch 4 taken 26% (fallthrough) branch 5 taken 74% -: 307: return bc7_weights3; -: 308: } -: 309: return bc7_weights4; -: 310:} -: 311: -: 312:static int bc7_get_subset(int ns, int partition, int n) { 65792: 313: if (ns == 2) { branch 0 never executed branch 1 never executed branch 2 taken 52% (fallthrough) branch 3 taken 48% 34528: 314: return 1 & (bc7_si2[partition] >> n); -: 315: } 31264: 316: if (ns == 3) { branch 0 never executed branch 1 never executed branch 2 taken 13% (fallthrough) branch 3 taken 87% 3968: 317: return 3 & (bc7_si3[partition] >> (2 * n)); -: 318: } -: 319: return 0; -: 320:} -: 321: -: 322:static UINT8 expand_quantized(UINT8 v, int bits) { 44096: 323: v = v << (8 - bits); 44096: 324: return v | (v >> bits); -: 325:} -: 326: function bc7_lerp called 65792 returned 100% blocks executed 100% 65792: 327:static void bc7_lerp(rgba *dst, const rgba *e, int s0, int s1) { 65792: 328: int t0 = 64 - s0; 65792: 329: int t1 = 64 - s1; 65792: 330: dst->r = (UINT8)((t0 * e[0].r + s0 * e[1].r + 32) >> 6); 65792: 331: dst->g = (UINT8)((t0 * e[0].g + s0 * e[1].g + 32) >> 6); 65792: 332: dst->b = (UINT8)((t0 * e[0].b + s0 * e[1].b + 32) >> 6); 65792: 333: dst->a = (UINT8)((t1 * e[0].a + s1 * e[1].a + 32) >> 6); 65792: 334:} -: 335: function decode_bc7_block called 4112 returned 100% blocks executed 92% 4112: 336:static void decode_bc7_block(rgba *col, const UINT8* src) { -: 337: rgba endpoints[6]; 4112: 338: int bit = 0, cibit, aibit; 4112: 339: int mode = src[0]; -: 340: int i, j; -: 341: int numep, cb, ab, ib, ib2, i0, i1, s; -: 342: UINT8 index_sel, partition, rotation, val; -: 343: const char *cw, *aw; -: 344: const bc7_mode_info *info; -: 345: -: 346: /* mode is the number of unset bits before the first set bit: */ 4112: 347: if (!mode) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 348: /* degenerate case when no bits set */ #####: 349: for (i = 0; i < 16; i++) { branch 0 never executed branch 1 never executed #####: 350: col[i].r = col[i].g = col[i].b = 0; #####: 351: col[i].a = 255; -: 352: } #####: 353: return; -: 354: } 15961: 355: while (!(mode & (1 << bit++))) ; branch 0 taken 74% branch 1 taken 26% (fallthrough) 4112: 356: mode = bit - 1; 4112: 357: info = &bc7_modes[mode]; -: 358: /* color selection bits: {subset}{endpoint} */ 4112: 359: cb = info->cb; 4112: 360: ab = info->ab; 8224: 361: cw = bc7_get_weights(info->ib); 8224: 362: aw = bc7_get_weights((ab && info->ib2) ? info->ib2 : info->ib); branch 0 taken 42% (fallthrough) branch 1 taken 58% branch 2 taken 44% (fallthrough) branch 3 taken 56% -: 363: -: 364:#define LOAD(DST, N) \ -: 365: DST = get_bits(src, bit, N); \ -: 366: bit += N; 4112: 367: LOAD(partition, info->pb); call 0 returned 100% 4112: 368: LOAD(rotation, info->rb); call 0 returned 100% 4112: 369: LOAD(index_sel, info->isb); call 0 returned 100% 4112: 370: numep = info->ns << 1; -: 371: -: 372: /* red */ 17644: 373: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 13532: 374: LOAD(val, cb); call 0 returned 100% 13532: 375: endpoints[i].r = val; -: 376: } -: 377: -: 378: /* green */ 13532: 379: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 13532: 380: LOAD(val, cb); call 0 returned 100% 13532: 381: endpoints[i].g = val; -: 382: } -: 383: -: 384: /* blue */ 13532: 385: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 13532: 386: LOAD(val, cb); call 0 returned 100% 13532: 387: endpoints[i].b = val; -: 388: } -: 389: -: 390: /* alpha */ 13532: 391: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 13532: 392: if (ab) { branch 0 taken 26% (fallthrough) branch 1 taken 74% 3500: 393: LOAD(val, ab); call 0 returned 100% -: 394: } else { -: 395: val = 255; -: 396: } 13532: 397: endpoints[i].a = val; -: 398: } -: 399: -: 400: /* p-bits */ -: 401:#define ASSIGN_P(x) x = (x << 1) | val 4112: 402: if (info->epb) { branch 0 taken 38% (fallthrough) branch 1 taken 62% -: 403: /* per endpoint */ 1564: 404: cb++; 1564: 405: if (ab) { branch 0 taken 62% (fallthrough) branch 1 taken 38% 963: 406: ab++; -: 407: } 6434: 408: for (i = 0; i < numep; i++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 4870: 409: LOAD(val, 1); 4870: 410: ASSIGN_P(endpoints[i].r); 4870: 411: ASSIGN_P(endpoints[i].g); 4870: 412: ASSIGN_P(endpoints[i].b); 4870: 413: if (ab) { branch 0 taken 40% (fallthrough) branch 1 taken 60% 1970: 414: ASSIGN_P(endpoints[i].a); -: 415: } -: 416: } -: 417: } 4112: 418: if (info->spb) { branch 0 taken 43% (fallthrough) branch 1 taken 57% -: 419: /* per subset */ 1783: 420: cb++; 1783: 421: if (ab) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 422: ab++; -: 423: } 5349: 424: for (i = 0; i < numep; i+=2) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 3566: 425: LOAD(val, 1); 10698: 426: for (j = 0; j < 2; j++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 7132: 427: ASSIGN_P(endpoints[i+j].r); 7132: 428: ASSIGN_P(endpoints[i+j].g); 7132: 429: ASSIGN_P(endpoints[i+j].b); 7132: 430: if (ab) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 431: ASSIGN_P(endpoints[i+j].a); -: 432: } -: 433: } -: 434: } -: 435: } -: 436:#undef ASSIGN_P -: 437:#define EXPAND(x, b) x = expand_quantized(x, b) 17644: 438: for (i = 0; i < numep; i++) { branch 0 taken 77% branch 1 taken 23% (fallthrough) 27064: 439: EXPAND(endpoints[i].r, cb); 27064: 440: EXPAND(endpoints[i].g, cb); 27064: 441: EXPAND(endpoints[i].b, cb); 13532: 442: if (ab) { branch 0 taken 26% (fallthrough) branch 1 taken 74% 7000: 443: EXPAND(endpoints[i].a, ab); -: 444: } -: 445: } -: 446:#undef EXPAND -: 447:#undef LOAD 4112: 448: cibit = bit; 4112: 449: aibit = cibit + 16 * info->ib - info->ns; 69904: 450: for (i = 0; i < 16; i++) { branch 0 taken 94% branch 1 taken 6% (fallthrough) 131584: 451: s = bc7_get_subset(info->ns, partition, i) << 1; 65792: 452: ib = info->ib; 65792: 453: if (i == 0) { branch 0 taken 6% (fallthrough) branch 1 taken 94% 4112: 454: ib--; 61680: 455: } else if (info->ns == 2) { branch 0 taken 52% (fallthrough) branch 1 taken 48% 32370: 456: if (i == bc7_ai0[partition]) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 2158: 457: ib--; -: 458: } 29310: 459: } else if (info->ns == 3) { branch 0 taken 13% (fallthrough) branch 1 taken 87% 3720: 460: if (i == bc7_ai1[partition]) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 248: 461: ib--; 3472: 462: } else if (i == bc7_ai2[partition]) { branch 0 taken 7% (fallthrough) branch 1 taken 93% 248: 463: ib--; -: 464: } -: 465: } 65792: 466: i0 = get_bits(src, cibit, ib); call 0 returned 100% 65792: 467: cibit += ib; -: 468: 65792: 469: if (ab && info->ib2) { branch 0 taken 42% (fallthrough) branch 1 taken 58% branch 2 taken 44% (fallthrough) branch 3 taken 56% 12240: 470: ib2 = info->ib2; 12240: 471: if (ib2 && i == 0) { branch 0 taken 6% (fallthrough) branch 1 taken 94% 765: 472: ib2--; -: 473: } 12240: 474: i1 = get_bits(src, aibit, ib2); call 0 returned 100% 12240: 475: aibit += ib2; 12240: 476: if (index_sel) { branch 0 taken 11% (fallthrough) branch 1 taken 89% 1360: 477: bc7_lerp(&col[i], &endpoints[s], aw[i1], cw[i0]); call 0 returned 100% -: 478: } else { 10880: 479: bc7_lerp(&col[i], &endpoints[s], cw[i0], aw[i1]); call 0 returned 100% -: 480: } -: 481: } else { 53552: 482: bc7_lerp(&col[i], &endpoints[s], cw[i0], cw[i0]); call 0 returned 100% -: 483: } -: 484:#define ROTATE(x, y) \ -: 485: val = x; \ -: 486: x = y; \ -: 487: y = val 65792: 488: if (rotation == 1) { branch 0 taken 14% (fallthrough) branch 1 taken 86% 9120: 489: ROTATE(col[i].r, col[i].a); 56672: 490: } else if (rotation == 2) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 912: 491: ROTATE(col[i].g, col[i].a); 55760: 492: } else if (rotation == 3) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 672: 493: ROTATE(col[i].b, col[i].a); -: 494: } -: 495:#undef ROTATE -: 496: } -: 497:} -: 498: -: 499:/* BC6 */ -: 500:typedef struct { -: 501: char ns; /* number of subsets (also called regions) */ -: 502: char tr; /* whether endpoints are delta-compressed */ -: 503: char pb; /* partition bits */ -: 504: char epb; /* endpoint bits */ -: 505: char rb; /* red bits (delta) */ -: 506: char gb; /* green bits (delta) */ -: 507: char bb; /* blue bits (delta) */ -: 508:} bc6_mode_info; -: 509: -: 510:static const bc6_mode_info bc6_modes[] = { -: 511: // 00 -: 512: {2, 1, 5, 10, 5, 5, 5}, -: 513: // 01 -: 514: {2, 1, 5, 7, 6, 6, 6}, -: 515: // 10 -: 516: {2, 1, 5, 11, 5, 4, 4}, -: 517: {2, 1, 5, 11, 4, 5, 4}, -: 518: {2, 1, 5, 11, 4, 4, 5}, -: 519: {2, 1, 5, 9, 5, 5, 5}, -: 520: {2, 1, 5, 8, 6, 5, 5}, -: 521: {2, 1, 5, 8, 5, 6, 5}, -: 522: {2, 1, 5, 8, 5, 5, 6}, -: 523: {2, 0, 5, 6, 6, 6, 6}, -: 524: // 11 -: 525: {1, 0, 0, 10, 10, 10, 10}, -: 526: {1, 1, 0, 11, 9, 9, 9}, -: 527: {1, 1, 0, 12, 8, 8, 8}, -: 528: {1, 1, 0, 16, 4, 4, 4} -: 529:}; -: 530: -: 531:/* Table.F, encoded as a sequence of bit indices */ -: 532:static const UINT8 bc6_bit_packings[][75] = { -: 533: {116, 132, 176, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, -: 534: 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, -: 535: 164, 112, 113, 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, -: 536: 81, 82, 83, 84, 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, -: 537: 145, 146, 147, 148, 175}, -: 538: {117, 164, 165, 0, 1, 2, 3, 4, 5, 6, 172, 173, 132, 16, 17, 18, 19, 20, 21, -: 539: 22, 133, 174, 116, 32, 33, 34, 35, 36, 37, 38, 175, 177, 176, 48, 49, 50, -: 540: 51, 52, 53, 112, 113, 114, 115, 64, 65, 66, 67, 68, 69, 160, 161, 162, 163, -: 541: 80, 81, 82, 83, 84, 85, 128, 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, -: 542: 145, 146, 147, 148, 149}, -: 543: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 544: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 10, 112, 113, 114, -: 545: 115, 64, 65, 66, 67, 26, 172, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, -: 546: 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, -: 547: 175}, -: 548: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 549: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 10, 164, 112, 113, 114, -: 550: 115, 64, 65, 66, 67, 68, 26, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, -: 551: 128, 129, 130, 131, 96, 97, 98, 99, 172, 174, 144, 145, 146, 147, 116, -: 552: 175}, -: 553: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 554: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 10, 132, 112, 113, 114, -: 555: 115, 64, 65, 66, 67, 26, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 42, -: 556: 128, 129, 130, 131, 96, 97, 98, 99, 173, 174, 144, 145, 146, 147, 176, -: 557: 175}, -: 558: {0, 1, 2, 3, 4, 5, 6, 7, 8, 132, 16, 17, 18, 19, 20, 21, 22, 23, 24, 116, -: 559: 32, 33, 34, 35, 36, 37, 38, 39, 40, 176, 48, 49, 50, 51, 52, 164, 112, 113, -: 560: 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, -: 561: 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, -: 562: 175}, -: 563: {0, 1, 2, 3, 4, 5, 6, 7, 164, 132, 16, 17, 18, 19, 20, 21, 22, 23, 174, 116, -: 564: 32, 33, 34, 35, 36, 37, 38, 39, 175, 176, 48, 49, 50, 51, 52, 53, 112, 113, -: 565: 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, -: 566: 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, -: 567: 149}, -: 568: {0, 1, 2, 3, 4, 5, 6, 7, 172, 132, 16, 17, 18, 19, 20, 21, 22, 23, 117, 116, -: 569: 32, 33, 34, 35, 36, 37, 38, 39, 165, 176, 48, 49, 50, 51, 52, 164, 112, -: 570: 113, 114, 115, 64, 65, 66, 67, 68, 69, 160, 161, 162, 163, 80, 81, 82, 83, -: 571: 84, 173, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, -: 572: 148, 175}, -: 573: {0, 1, 2, 3, 4, 5, 6, 7, 173, 132, 16, 17, 18, 19, 20, 21, 22, 23, 133, 116, -: 574: 32, 33, 34, 35, 36, 37, 38, 39, 177, 176, 48, 49, 50, 51, 52, 164, 112, -: 575: 113, 114, 115, 64, 65, 66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, -: 576: 84, 85, 128, 129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, -: 577: 148, 175}, -: 578: {0, 1, 2, 3, 4, 5, 164, 172, 173, 132, 16, 17, 18, 19, 20, 21, 117, 133, -: 579: 174, 116, 32, 33, 34, 35, 36, 37, 165, 175, 177, 176, 48, 49, 50, 51, 52, -: 580: 53, 112, 113, 114, 115, 64, 65, 66, 67, 68, 69, 160, 161, 162, 163, 80, 81, -: 581: 82, 83, 84, 85, 128, 129, 130, 131, 96, 97, 98, 99, 100, 101, 144, 145, -: 582: 146, 147, 148, 149}, -: 583: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 584: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -: 585: 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 80, 81, 82, 83, 84, 85, 86, 87, 88, -: 586: 89}, -: 587: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 588: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 10, -: 589: 64, 65, 66, 67, 68, 69, 70, 71, 72, 26, 80, 81, 82, 83, 84, 85, 86, 87, 88, -: 590: 42}, -: 591: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 592: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 11, 10, -: 593: 64, 65, 66, 67, 68, 69, 70, 71, 27, 26, 80, 81, 82, 83, 84, 85, 86, 87, 43, -: 594: 42}, -: 595: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, -: 596: 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 15, 14, 13, 12, 11, 10, -: 597: 64, 65, 66, 67, 31, 30, 29, 28, 27, 26, 80, 81, 82, 83, 47, 46, 45, 44, 43, -: 598: 42}}; -: 599: -: 600:static void bc6_sign_extend(UINT16 *v, int prec) { #####: 601: int x = *v; #####: 602: if (x & (1 << (prec - 1))) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed #####: 603: x |= -1 << prec; -: 604: } #####: 605: *v = (UINT16)x; -: 606:} -: 607: function bc6_unquantize called 0 returned 0% blocks executed 0% #####: 608:static int bc6_unquantize(UINT16 v, int prec, int sign) { #####: 609: int s = 0; -: 610: int x; #####: 611: if (!sign) { branch 0 never executed branch 1 never executed #####: 612: x = v; #####: 613: if (prec >= 15) { branch 0 never executed branch 1 never executed -: 614: return x; -: 615: } #####: 616: if (x == 0) { branch 0 never executed branch 1 never executed -: 617: return 0; -: 618: } #####: 619: if (x == ((1 << prec) - 1)) { branch 0 never executed branch 1 never executed -: 620: return 0xffff; -: 621: } #####: 622: return ((x << 15) + 0x4000) >> (prec - 1); -: 623: } else { #####: 624: x = (INT16)v; #####: 625: if (prec >= 16) { branch 0 never executed branch 1 never executed -: 626: return x; -: 627: } #####: 628: if (x < 0) { branch 0 never executed branch 1 never executed #####: 629: s = 1; #####: 630: x = -x; -: 631: } -: 632: #####: 633: if (x != 0) { branch 0 never executed branch 1 never executed #####: 634: if (x >= ((1 << (prec - 1)) - 1)) { branch 0 never executed branch 1 never executed -: 635: x = 0x7fff; -: 636: } else { #####: 637: x = ((x << 15) + 0x4000) >> (prec - 1); -: 638: } -: 639: } -: 640: #####: 641: if (s) { branch 0 never executed branch 1 never executed #####: 642: return -x; -: 643: } -: 644: return x; -: 645: } -: 646:} -: 647: -: 648:static float half_to_float(UINT16 h) { -: 649: /* https://gist.github.com/rygorous/2144712 */ -: 650: union { -: 651: UINT32 u; -: 652: float f; -: 653: } o, m; #####: 654: m.u = 0x77800000; #####: 655: o.u = (h & 0x7fff) << 13; #####: 656: o.f *= m.f; #####: 657: m.u = 0x47800000; #####: 658: if (o.f >= m.f) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed #####: 659: o.u |= 255 << 23; -: 660: } #####: 661: o.u |= (h & 0x8000) << 16; #####: 662: return o.f; -: 663:} -: 664: function bc6_finalize called 0 returned 0% blocks executed 0% #####: 665:static float bc6_finalize(int v, int sign) { #####: 666: if (sign) { branch 0 never executed branch 1 never executed #####: 667: if (v < 0) { branch 0 never executed branch 1 never executed #####: 668: v = ((-v) * 31) / 32; #####: 669: return half_to_float((UINT16)(0x8000 | v)); -: 670: } else { #####: 671: return half_to_float((UINT16)((v * 31) / 32)); -: 672: } -: 673: } else { #####: 674: return half_to_float((UINT16)((v * 31) / 64)); -: 675: } -: 676:} -: 677: function bc6_lerp called 0 returned 0% blocks executed 0% #####: 678:static void bc6_lerp(rgb32f *col, int *e0, int *e1, int s, int sign) { -: 679: int r, g, b; #####: 680: int t = 64 - s; #####: 681: r = (e0[0] * t + e1[0] * s) >> 6; #####: 682: g = (e0[1] * t + e1[1] * s) >> 6; #####: 683: b = (e0[2] * t + e1[2] * s) >> 6; #####: 684: col->r = bc6_finalize(r, sign); call 0 never executed #####: 685: col->g = bc6_finalize(g, sign); call 0 never executed #####: 686: col->b = bc6_finalize(b, sign); call 0 never executed #####: 687:} -: 688: function decode_bc6_block called 0 returned 0% blocks executed 0% #####: 689:static void decode_bc6_block(rgb32f *col, const UINT8* src, int sign) { -: 690: UINT16 endpoints[12]; /* storage for r0, g0, b0, r1, ... */ -: 691: int ueps[12]; -: 692: int i, i0, ib2, di, dw, mask, numep, s; -: 693: UINT8 partition; -: 694: const bc6_mode_info *info; -: 695: const char *cw; #####: 696: int bit = 5; #####: 697: int epbits = 75; #####: 698: int ib = 3; #####: 699: int mode = src[0] & 0x1f; #####: 700: if ((mode & 3) == 0 || (mode & 3) == 1) { branch 0 never executed branch 1 never executed #####: 701: mode &= 3; #####: 702: bit = 2; #####: 703: } else if ((mode & 3) == 2) { branch 0 never executed branch 1 never executed #####: 704: mode = 2 + (mode >> 2); #####: 705: epbits = 72; -: 706: } else { #####: 707: mode = 10 + (mode >> 2); #####: 708: epbits = 60; #####: 709: ib = 4; -: 710: } #####: 711: if (mode >= 14) { branch 0 never executed branch 1 never executed -: 712: /* invalid block */ #####: 713: memset(col, 0, 16 * sizeof(col[0])); #####: 714: return; -: 715: } #####: 716: info = &bc6_modes[mode]; #####: 717: cw = bc7_get_weights(ib); #####: 718: numep = info->ns == 2 ? 12 : 6; branch 0 never executed branch 1 never executed #####: 719: for (i = 0; i < 12; i++) { branch 0 never executed branch 1 never executed #####: 720: endpoints[i] = 0; -: 721: } #####: 722: for (i = 0; i < epbits; i++) { branch 0 never executed branch 1 never executed #####: 723: di = bc6_bit_packings[mode][i]; #####: 724: dw = di >> 4; #####: 725: di &= 15; #####: 726: endpoints[dw] |= (UINT16)get_bit(src, bit + i) << di; -: 727: } #####: 728: bit += epbits; #####: 729: partition = get_bits(src, bit, info->pb); call 0 never executed #####: 730: bit += info->pb; #####: 731: mask = (1 << info->epb) - 1; #####: 732: if (sign) { /* sign-extend e0 if signed */ branch 0 never executed branch 1 never executed #####: 733: bc6_sign_extend(&endpoints[0], info->epb); #####: 734: bc6_sign_extend(&endpoints[1], info->epb); #####: 735: bc6_sign_extend(&endpoints[2], info->epb); -: 736: } #####: 737: if (sign || info->tr) { /* sign-extend e1,2,3 if signed or deltas */ branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 738: for (i = 3; i < numep; i += 3) { branch 0 never executed branch 1 never executed #####: 739: bc6_sign_extend(&endpoints[i+0], info->rb); #####: 740: bc6_sign_extend(&endpoints[i+1], info->gb); #####: 741: bc6_sign_extend(&endpoints[i+2], info->bb); -: 742: } -: 743: } #####: 744: if (info->tr) { /* apply deltas */ branch 0 never executed branch 1 never executed #####: 745: for (i = 3; i < numep; i++) { branch 0 never executed branch 1 never executed #####: 746: endpoints[i] = (endpoints[i] + endpoints[0]) & mask; -: 747: } #####: 748: if (sign) { branch 0 never executed branch 1 never executed #####: 749: for (i = 3; i < numep; i += 3) { branch 0 never executed branch 1 never executed #####: 750: bc6_sign_extend(&endpoints[i+0], info->rb); #####: 751: bc6_sign_extend(&endpoints[i+1], info->gb); #####: 752: bc6_sign_extend(&endpoints[i+2], info->bb); -: 753: } -: 754: } -: 755: } #####: 756: for (i = 0; i < numep; i++) { branch 0 never executed branch 1 never executed #####: 757: ueps[i] = bc6_unquantize(endpoints[i], info->epb, sign); call 0 never executed -: 758: } #####: 759: for (i = 0; i < 16; i++) { branch 0 never executed branch 1 never executed #####: 760: s = bc7_get_subset(info->ns, partition, i) * 6; #####: 761: ib2 = ib; #####: 762: if (i == 0) { branch 0 never executed branch 1 never executed #####: 763: ib2--; #####: 764: } else if (info->ns == 2) { branch 0 never executed branch 1 never executed #####: 765: if (i == bc7_ai0[partition]) { branch 0 never executed branch 1 never executed #####: 766: ib2--; -: 767: } -: 768: } #####: 769: i0 = get_bits(src, bit, ib2); call 0 never executed #####: 770: bit += ib2; -: 771: #####: 772: bc6_lerp(&col[i], &ueps[s], &ueps[s+3], cw[i0], sign); call 0 never executed -: 773: } -: 774:} -: 775: function put_block.isra.0 called 21513 returned 100% blocks executed 45% 21513: 776:static void put_block(Imaging im, ImagingCodecState state, const char *col, int sz, int C) { 21513: 777: int width = state->xsize; 21513: 778: int height = state->ysize; 21513: 779: int xmax = width + state->xoff; 21513: 780: int ymax = height + state->yoff; -: 781: int j, i, y, x; -: 782: char *dst; 107565: 783: for (j = 0; j < 4; j++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 86052: 784: y = state->y + j; 86052: 785: if (C) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 786: if (y >= height) { branch 0 never executed branch 1 never executed #####: 787: continue; -: 788: } #####: 789: if (state->ystep < 0) { branch 0 never executed branch 1 never executed #####: 790: y = state->yoff + ymax - y - 1; -: 791: } #####: 792: dst = im->image[y]; #####: 793: for (i = 0; i < 4; i++) { branch 0 never executed branch 1 never executed #####: 794: x = state->x + i; #####: 795: if (x >= width) { branch 0 never executed branch 1 never executed #####: 796: continue; -: 797: } #####: 798: memcpy(dst + sz*x, col + sz*(j*4 + i), sz); -: 799: } -: 800: } else { 86052: 801: if (state->ystep < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 802: y = state->yoff + ymax - y - 1; -: 803: } 86052: 804: x = state->x; 86052: 805: dst = im->image[y] + sz*x; 86052: 806: memcpy(dst, col + sz*(j*4), 4 * sz); -: 807: } -: 808: } 21513: 809: state->x += 4; 21513: 810: if (state->x >= xmax) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 355: 811: state->y += 4; 355: 812: state->x = state->xoff; -: 813: } 21513: 814:} -: 815: function decode_bcn called 7 returned 100% blocks executed 60% 7: 816:static int decode_bcn(Imaging im, ImagingCodecState state, const UINT8* src, int bytes, int N, int C) { 7: 817: int ymax = state->ysize + state->yoff; 7: 818: const UINT8 *ptr = src; 7: 819: switch (N) { branch 0 taken 29% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% branch 4 taken 29% branch 5 taken 14% branch 6 taken 29% branch 7 taken 0% -: 820:#define DECODE_LOOP(NN, SZ, TY, ...) \ -: 821: case NN: \ -: 822: while (bytes >= SZ) { \ -: 823: TY col[16]; \ -: 824: memset(col, 0, 16 * sizeof(col[0])); \ -: 825: decode_bc##NN##_block(col, ptr); \ -: 826: put_block(im, state, (const char *)col, sizeof(col[0]), C); \ -: 827: ptr += SZ; \ -: 828: bytes -= SZ; \ -: 829: if (state->y >= ymax) {\ -: 830: return -1; \ -: 831: }\ -: 832: } \ -: 833: break -: 834: 10240: 835: DECODE_LOOP(1, 8, rgba); call 0 returned 100% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 100% branch 4 taken 0% 4096: 836: DECODE_LOOP(2, 16, rgba); call 0 returned 100% call 1 returned 100% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 100% branch 5 taken 0% 8185: 837: DECODE_LOOP(3, 16, rgba); call 0 returned 100% call 1 returned 100% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 99% branch 5 taken 1% #####: 838: DECODE_LOOP(4, 8, lum); call 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed #####: 839: DECODE_LOOP(5, 16, rgba); call 0 never executed call 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed -: 840: case 6: #####: 841: while (bytes >= 16) { branch 0 never executed branch 1 never executed -: 842: rgb32f col[16]; #####: 843: decode_bc6_block(col, ptr, (state->state >> 4) & 1); call 0 never executed #####: 844: put_block(im, state, (const char *)col, sizeof(col[0]), C); call 0 never executed #####: 845: ptr += 16; #####: 846: bytes -= 16; #####: 847: if (state->y >= ymax) {\ branch 0 never executed branch 1 never executed #####: 848: return -1; \ -: 849: }\ -: 850: } -: 851: break; 4112: 852: DECODE_LOOP(7, 16, rgba); call 0 returned 100% call 1 returned 100% branch 2 taken 1% (fallthrough) branch 3 taken 99% branch 4 taken 100% branch 5 taken 0% (fallthrough) -: 853:#undef DECODE_LOOP -: 854: } 1: 855: return (int)(ptr - src); -: 856:} -: 857: function ImagingBcnDecode called 7 returned 100% blocks executed 75% 7: 858:int ImagingBcnDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) { 7: 859: int N = state->state & 0xf; 7: 860: int width = state->xsize; 7: 861: int height = state->ysize; 7: 862: if ((width & 3) | (height & 3)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 863: return decode_bcn(im, state, buf, bytes, N, 1); call 0 never executed -: 864: } else { 7: 865: return decode_bcn(im, state, buf, bytes, N, 0); call 0 returned 100% -: 866: } -: 867:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Matrix.c.gcov -: 0:Source:src/libImaging/Matrix.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Matrix.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#TgaRleEncode.c.gcov -: 0:Source:src/libImaging/TgaRleEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/TgaRleEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/TgaRleEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1: -: 2:#include "Imaging.h" -: 3: -: 4:#include -: 5:#include -: 6: -: 7: -: 8:static int comparePixels(const UINT8* buf, int x, int bytesPerPixel) -: 9:{ 329175: 10: buf += x * bytesPerPixel; 329175: 11: return memcmp(buf, buf + bytesPerPixel, bytesPerPixel) == 0; -: 12:} -: 13: -: 14: -: 15:int function ImagingTgaRleEncode called 26 returned 100% blocks executed 100% 26: 16:ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 17:{ -: 18: UINT8* dst; -: 19: int bytesPerPixel; -: 20: 26: 21: if (state->state == 0) { branch 0 taken 77% (fallthrough) branch 1 taken 23% 20: 22: if (state->ystep < 0) { branch 0 taken 60% (fallthrough) branch 1 taken 40% 12: 23: state->ystep = -1; 12: 24: state->y = state->ysize - 1; -: 25: } else { 8: 26: state->ystep = 1; -: 27: } -: 28: 20: 29: state->state = 1; -: 30: } -: 31: 26: 32: dst = buf; 26: 33: bytesPerPixel = (state->bits + 7) / 8; -: 34: -: 35: while (1) { -: 36: int flushCount; -: 37: -: 38: /* -: 39: * state->count is the numbers of bytes in the packet, -: 40: * excluding the 1-byte descriptor. -: 41: */ 35468: 42: if (state->count == 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 43: UINT8* row; -: 44: UINT8 descriptor; -: 45: int startX; -: 46: -: 47: assert(state->x <= state->xsize); -: 48: -: 49: /* Make sure we have space for the descriptor. */ 35456: 50: if (bytes < 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 51: break; -: 52: } -: 53: 35456: 54: if (state->x == state->xsize) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 1680: 55: state->x = 0; -: 56: 1680: 57: state->y += state->ystep; 1680: 58: if (state->y < 0 || state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 20: 59: state->errcode = IMAGING_CODEC_END; 20: 60: break; -: 61: } -: 62: } -: 63: 35436: 64: if (state->x == 0) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 3360: 65: state->shuffle( call 0 returned 100% -: 66: state->buffer, 1680: 67: (UINT8*)im->image[state->y + state->yoff] 1680: 68: + state->xoff * im->pixelsize, -: 69: state->xsize); -: 70: } -: 71: 35436: 72: row = state->buffer; -: 73: -: 74: /* Start with a raw packet for 1 px. */ 35436: 75: descriptor = 0; 35436: 76: startX = state->x; 35436: 77: state->count = bytesPerPixel; -: 78: 35436: 79: if (state->x + 1 < state->xsize) { branch 0 taken 98% (fallthrough) branch 1 taken 2% -: 80: int maxLookup; -: 81: int isRaw; -: 82: 69796: 83: isRaw = !comparePixels(row, state->x, bytesPerPixel); 34898: 84: ++state->x; -: 85: -: 86: /* -: 87: * A packet can contain up to 128 pixels; -: 88: * 2 are already behind (state->x points to -: 89: * the second one). -: 90: */ 34898: 91: maxLookup = state->x + 126; -: 92: /* A packet must not span multiple rows. */ 34898: 93: if (maxLookup > state->xsize - 1) { branch 0 taken 57% (fallthrough) branch 1 taken 43% 19998: 94: maxLookup = state->xsize - 1; -: 95: } -: 96: 34898: 97: if (isRaw) { branch 0 taken 52% (fallthrough) branch 1 taken 48% 222311: 98: while (state->x < maxLookup) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 442218: 99: if (!comparePixels(row, state->x, bytesPerPixel)) { branch 0 taken 93% (fallthrough) branch 1 taken 7% 205726: 100: ++state->x; -: 101: } else { -: 102: /* Two identical pixels will go to RLE packet. */ 15383: 103: --state->x; 15383: 104: break; -: 105: } -: 106: } -: 107: 16585: 108: state->count += (state->x - startX) * bytesPerPixel; -: 109: } else { -: 110: descriptor |= 0x80; -: 111: 73340: 112: while (state->x < maxLookup) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 146336: 113: if (comparePixels(row, state->x, bytesPerPixel)) { branch 0 taken 75% (fallthrough) branch 1 taken 25% 55027: 114: ++state->x; -: 115: } else { -: 116: break; -: 117: } -: 118: } -: 119: } -: 120: } -: 121: -: 122: /* -: 123: * state->x currently points to the last pixel to be -: 124: * included in the packet. The pixel count in the -: 125: * descriptor is 1 less than actual number of pixels in -: 126: * the packet, that is, state->x == startX if we encode -: 127: * only 1 pixel. -: 128: */ 35436: 129: descriptor += state->x - startX; 35436: 130: *dst++ = descriptor; 35436: 131: --bytes; -: 132: -: 133: /* Advance to past-the-last encoded pixel. */ 35436: 134: ++state->x; -: 135: } -: 136: -: 137: assert(bytes >= 0); -: 138: assert(state->count > 0); -: 139: assert(state->x > 0); -: 140: assert(state->count <= state->x * bytesPerPixel); -: 141: 35448: 142: if (bytes == 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 143: break; -: 144: } -: 145: 35442: 146: flushCount = state->count; 35442: 147: if (flushCount > bytes) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 6: 148: flushCount = bytes; -: 149: } -: 150: 106326: 151: memcpy( -: 152: dst, 70884: 153: state->buffer + (state->x * bytesPerPixel - state->count), -: 154: flushCount); 35442: 155: dst += flushCount; 35442: 156: bytes -= flushCount; -: 157: 35442: 158: state->count -= flushCount; 35442: 159: } -: 160: 26: 161: return dst - buf; -: 162:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Convert.c.gcov -: 0:Source:src/libImaging/Convert.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Convert.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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 52% (fallthrough) branch 1 taken 48% 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 54% (fallthrough) branch 1 taken 46% 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#RawEncode.c.gcov -: 0:Source:src/libImaging/RawEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/RawEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/RawEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * coder for raw data -: 6: * -: 7: * FIXME: This encoder will fail if the buffer is not large enough to -: 8: * hold one full line of data. There's a workaround for this problem -: 9: * in ImageFile.py, but it should be solved here instead. -: 10: * -: 11: * history: -: 12: * 96-04-30 fl created -: 13: * 97-01-03 fl fixed padding -: 14: * -: 15: * Copyright (c) Fredrik Lundh 1996-97. -: 16: * Copyright (c) Secret Labs AB 1997. -: 17: * -: 18: * See the README file for information on usage and redistribution. */ -: 19: -: 20: -: 21:#include "Imaging.h" -: 22: -: 23:int function ImagingRawEncode called 12656 returned 100% blocks executed 86% 12656: 24:ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 25:{ -: 26: UINT8* ptr; -: 27: 12656: 28: if (!state->state) { branch 0 taken 26% (fallthrough) branch 1 taken 74% -: 29: -: 30: /* The "count" field holds the stride, if specified. Fix -: 31: things up so "bytes" is the full size, and "count" the -: 32: packed size */ -: 33: 3234: 34: if (state->count > 0) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 57: 35: int bytes = state->count; -: 36: -: 37: /* stride must not be less than real size */ 57: 38: if (state->count < state->bytes) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 39: state->errcode = IMAGING_CODEC_CONFIG; #####: 40: return -1; -: 41: } 57: 42: state->count = state->bytes; 57: 43: state->bytes = bytes; -: 44: } else { 3177: 45: state->count = state->bytes; -: 46: } -: 47: -: 48: /* The "ystep" field specifies the orientation */ -: 49: 3234: 50: if (state->ystep < 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 46: 51: state->y = state->ysize-1; 46: 52: state->ystep = -1; -: 53: } else { 3188: 54: state->ystep = 1; -: 55: } -: 56: 3234: 57: state->state = 1; -: 58: -: 59: } -: 60: 12656: 61: if (bytes < state->bytes) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 62: state->errcode = IMAGING_CODEC_CONFIG; #####: 63: return 0; -: 64: } -: 65: -: 66: ptr = buf; -: 67: 447494: 68: while (bytes >= state->bytes) { branch 0 taken 98% branch 1 taken 2% (fallthrough) -: 69: 876144: 70: state->shuffle(ptr, (UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 438072: 71: state->xoff * im->pixelsize, state->xsize); -: 72: 438072: 73: if (state->bytes > state->count) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 74: /* zero-pad the buffer, if necessary */ #####: 75: memset(ptr + state->count, 0, state->bytes - state->count); -: 76: } -: 77: 438072: 78: ptr += state->bytes; 438072: 79: bytes -= state->bytes; -: 80: 438072: 81: state->y += state->ystep; -: 82: 438072: 83: if (state->y < 0 || state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 1% (fallthrough) branch 3 taken 99% 3234: 84: state->errcode = IMAGING_CODEC_END; 3234: 85: break; -: 86: } -: 87: -: 88: } -: 89: 12656: 90: return ptr - buf; -: 91: -: 92:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#_imagingmath.c.gcov -: 0:Source:src/_imagingmath.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/_imagingmath.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#display.c.gcov -: 0:Source:src/display.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/display.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/display.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * -: 4: * display support (and other windows-related stuff) -: 5: * -: 6: * History: -: 7: * 1996-05-13 fl Windows DIB support -: 8: * 1996-05-21 fl Added palette stuff -: 9: * 1996-05-28 fl Added display_mode stuff -: 10: * 1997-09-21 fl Added draw primitive -: 11: * 2001-09-17 fl Added ImagingGrabScreen (from _grabscreen.c) -: 12: * 2002-05-12 fl Added ImagingListWindows -: 13: * 2002-11-19 fl Added clipboard support -: 14: * 2002-11-25 fl Added GetDC/ReleaseDC helpers -: 15: * 2003-05-21 fl Added create window support (including window callback) -: 16: * 2003-09-05 fl Added fromstring/tostring methods -: 17: * 2009-03-14 fl Added WMF support (from pilwmf) -: 18: * -: 19: * Copyright (c) 1997-2003 by Secret Labs AB. -: 20: * Copyright (c) 1996-1997 by Fredrik Lundh. -: 21: * -: 22: * See the README file for information on usage and redistribution. -: 23: */ -: 24: -: 25:#define PY_SSIZE_T_CLEAN -: 26:#include "Python.h" -: 27: -: 28:#include "libImaging/Imaging.h" -: 29: -: 30:/* -------------------------------------------------------------------- */ -: 31:/* Windows DIB support */ -: 32: -: 33:#ifdef _WIN32 -: 34: -: 35:#include "libImaging/ImDib.h" -: 36: -: 37:#if SIZEOF_VOID_P == 8 -: 38:#define F_HANDLE "K" -: 39:#else -: 40:#define F_HANDLE "k" -: 41:#endif -: 42: -: 43:typedef struct { -: 44: PyObject_HEAD -: 45: ImagingDIB dib; -: 46:} ImagingDisplayObject; -: 47: -: 48:static PyTypeObject ImagingDisplayType; -: 49: -: 50:static ImagingDisplayObject* -: 51:_new(const char* mode, int xsize, int ysize) -: 52:{ -: 53: ImagingDisplayObject *display; -: 54: -: 55: if (PyType_Ready(&ImagingDisplayType) < 0) { -: 56: return NULL; -: 57: } -: 58: -: 59: display = PyObject_New(ImagingDisplayObject, &ImagingDisplayType); -: 60: if (display == NULL) { -: 61: return NULL; -: 62: } -: 63: -: 64: display->dib = ImagingNewDIB(mode, xsize, ysize); -: 65: if (!display->dib) { -: 66: Py_DECREF(display); -: 67: return NULL; -: 68: } -: 69: -: 70: return display; -: 71:} -: 72: -: 73:static void -: 74:_delete(ImagingDisplayObject* display) -: 75:{ -: 76: if (display->dib) { -: 77: ImagingDeleteDIB(display->dib); -: 78: } -: 79: PyObject_Del(display); -: 80:} -: 81: -: 82:static PyObject* -: 83:_expose(ImagingDisplayObject* display, PyObject* args) -: 84:{ -: 85: HDC hdc; -: 86: if (!PyArg_ParseTuple(args, F_HANDLE, &hdc)) { -: 87: return NULL; -: 88: } -: 89: -: 90: ImagingExposeDIB(display->dib, hdc); -: 91: -: 92: Py_INCREF(Py_None); -: 93: return Py_None; -: 94:} -: 95: -: 96:static PyObject* -: 97:_draw(ImagingDisplayObject* display, PyObject* args) -: 98:{ -: 99: HDC hdc; -: 100: int dst[4]; -: 101: int src[4]; -: 102: if (!PyArg_ParseTuple(args, F_HANDLE "(iiii)(iiii)", &hdc, -: 103: dst+0, dst+1, dst+2, dst+3, -: 104: src+0, src+1, src+2, src+3)) { -: 105: return NULL; -: 106: } -: 107: -: 108: ImagingDrawDIB(display->dib, hdc, dst, src); -: 109: -: 110: Py_INCREF(Py_None); -: 111: return Py_None; -: 112:} -: 113: -: 114:extern Imaging PyImaging_AsImaging(PyObject *op); -: 115: -: 116:static PyObject* -: 117:_paste(ImagingDisplayObject* display, PyObject* args) -: 118:{ -: 119: Imaging im; -: 120: -: 121: PyObject* op; -: 122: int xy[4]; -: 123: xy[0] = xy[1] = xy[2] = xy[3] = 0; -: 124: if (!PyArg_ParseTuple(args, "O|(iiii)", &op, xy+0, xy+1, xy+2, xy+3)) { -: 125: return NULL; -: 126: } -: 127: im = PyImaging_AsImaging(op); -: 128: if (!im) { -: 129: return NULL; -: 130: } -: 131: -: 132: if (xy[2] <= xy[0]) { -: 133: xy[2] = xy[0] + im->xsize; -: 134: } -: 135: if (xy[3] <= xy[1]) { -: 136: xy[3] = xy[1] + im->ysize; -: 137: } -: 138: -: 139: ImagingPasteDIB(display->dib, im, xy); -: 140: -: 141: Py_INCREF(Py_None); -: 142: return Py_None; -: 143:} -: 144: -: 145:static PyObject* -: 146:_query_palette(ImagingDisplayObject* display, PyObject* args) -: 147:{ -: 148: HDC hdc; -: 149: int status; -: 150: -: 151: if (!PyArg_ParseTuple(args, F_HANDLE, &hdc)) { -: 152: return NULL; -: 153: } -: 154: -: 155: status = ImagingQueryPaletteDIB(display->dib, hdc); -: 156: -: 157: return Py_BuildValue("i", status); -: 158:} -: 159: -: 160:static PyObject* -: 161:_getdc(ImagingDisplayObject* display, PyObject* args) -: 162:{ -: 163: HWND window; -: 164: HDC dc; -: 165: -: 166: if (!PyArg_ParseTuple(args, F_HANDLE, &window)) { -: 167: return NULL; -: 168: } -: 169: -: 170: dc = GetDC(window); -: 171: if (!dc) { -: 172: PyErr_SetString(PyExc_OSError, "cannot create dc"); -: 173: return NULL; -: 174: } -: 175: -: 176: return Py_BuildValue(F_HANDLE, dc); -: 177:} -: 178: -: 179:static PyObject* -: 180:_releasedc(ImagingDisplayObject* display, PyObject* args) -: 181:{ -: 182: HWND window; -: 183: HDC dc; -: 184: -: 185: if (!PyArg_ParseTuple(args, F_HANDLE F_HANDLE, &window, &dc)) { -: 186: return NULL; -: 187: } -: 188: -: 189: ReleaseDC(window, dc); -: 190: -: 191: Py_INCREF(Py_None); -: 192: return Py_None; -: 193:} -: 194: -: 195:static PyObject* -: 196:_frombytes(ImagingDisplayObject* display, PyObject* args) -: 197:{ -: 198: char* ptr; -: 199: Py_ssize_t bytes; -: 200: -: 201: if (!PyArg_ParseTuple(args, "y#:frombytes", &ptr, &bytes)) { -: 202: return NULL; -: 203: } -: 204: -: 205: if (display->dib->ysize * display->dib->linesize != bytes) { -: 206: PyErr_SetString(PyExc_ValueError, "wrong size"); -: 207: return NULL; -: 208: } -: 209: -: 210: memcpy(display->dib->bits, ptr, bytes); -: 211: -: 212: Py_INCREF(Py_None); -: 213: return Py_None; -: 214:} -: 215: -: 216:static PyObject* -: 217:_tobytes(ImagingDisplayObject* display, PyObject* args) -: 218:{ -: 219: if (!PyArg_ParseTuple(args, ":tobytes")) { -: 220: return NULL; -: 221: } -: 222: -: 223: return PyBytes_FromStringAndSize( -: 224: display->dib->bits, display->dib->ysize * display->dib->linesize -: 225: ); -: 226:} -: 227: -: 228:static struct PyMethodDef methods[] = { -: 229: {"draw", (PyCFunction)_draw, 1}, -: 230: {"expose", (PyCFunction)_expose, 1}, -: 231: {"paste", (PyCFunction)_paste, 1}, -: 232: {"query_palette", (PyCFunction)_query_palette, 1}, -: 233: {"getdc", (PyCFunction)_getdc, 1}, -: 234: {"releasedc", (PyCFunction)_releasedc, 1}, -: 235: {"frombytes", (PyCFunction)_frombytes, 1}, -: 236: {"tobytes", (PyCFunction)_tobytes, 1}, -: 237: {NULL, NULL} /* sentinel */ -: 238:}; -: 239: -: 240:static PyObject* -: 241:_getattr_mode(ImagingDisplayObject* self, void* closure) -: 242:{ -: 243: return Py_BuildValue("s", self->dib->mode); -: 244:} -: 245: -: 246:static PyObject* -: 247:_getattr_size(ImagingDisplayObject* self, void* closure) -: 248:{ -: 249: return Py_BuildValue("ii", self->dib->xsize, self->dib->ysize); -: 250:} -: 251: -: 252:static struct PyGetSetDef getsetters[] = { -: 253: { "mode", (getter) _getattr_mode }, -: 254: { "size", (getter) _getattr_size }, -: 255: { NULL } -: 256:}; -: 257: -: 258:static PyTypeObject ImagingDisplayType = { -: 259: PyVarObject_HEAD_INIT(NULL, 0) -: 260: "ImagingDisplay", /*tp_name*/ -: 261: sizeof(ImagingDisplayObject),/*tp_size*/ -: 262: 0, /*tp_itemsize*/ -: 263: /* methods */ -: 264: (destructor)_delete, /*tp_dealloc*/ -: 265: 0, /*tp_print*/ -: 266: 0, /*tp_getattr*/ -: 267: 0, /*tp_setattr*/ -: 268: 0, /*tp_compare*/ -: 269: 0, /*tp_repr*/ -: 270: 0, /*tp_as_number */ -: 271: 0, /*tp_as_sequence */ -: 272: 0, /*tp_as_mapping */ -: 273: 0, /*tp_hash*/ -: 274: 0, /*tp_call*/ -: 275: 0, /*tp_str*/ -: 276: 0, /*tp_getattro*/ -: 277: 0, /*tp_setattro*/ -: 278: 0, /*tp_as_buffer*/ -: 279: Py_TPFLAGS_DEFAULT, /*tp_flags*/ -: 280: 0, /*tp_doc*/ -: 281: 0, /*tp_traverse*/ -: 282: 0, /*tp_clear*/ -: 283: 0, /*tp_richcompare*/ -: 284: 0, /*tp_weaklistoffset*/ -: 285: 0, /*tp_iter*/ -: 286: 0, /*tp_iternext*/ -: 287: methods, /*tp_methods*/ -: 288: 0, /*tp_members*/ -: 289: getsetters, /*tp_getset*/ -: 290:}; -: 291: -: 292:PyObject* -: 293:PyImaging_DisplayWin32(PyObject* self, PyObject* args) -: 294:{ -: 295: ImagingDisplayObject* display; -: 296: char *mode; -: 297: int xsize, ysize; -: 298: -: 299: if (!PyArg_ParseTuple(args, "s(ii)", &mode, &xsize, &ysize)) { -: 300: return NULL; -: 301: } -: 302: -: 303: display = _new(mode, xsize, ysize); -: 304: if (display == NULL) { -: 305: return NULL; -: 306: } -: 307: -: 308: return (PyObject*) display; -: 309:} -: 310: -: 311:PyObject* -: 312:PyImaging_DisplayModeWin32(PyObject* self, PyObject* args) -: 313:{ -: 314: char *mode; -: 315: int size[2]; -: 316: -: 317: mode = ImagingGetModeDIB(size); -: 318: -: 319: return Py_BuildValue("s(ii)", mode, size[0], size[1]); -: 320:} -: 321: -: 322:/* -------------------------------------------------------------------- */ -: 323:/* Windows screen grabber */ -: 324: -: 325:typedef HANDLE(__stdcall* Func_SetThreadDpiAwarenessContext)(HANDLE); -: 326: -: 327:PyObject* -: 328:PyImaging_GrabScreenWin32(PyObject* self, PyObject* args) -: 329:{ -: 330: int x = 0, y = 0, width, height; -: 331: int includeLayeredWindows = 0, all_screens = 0; -: 332: HBITMAP bitmap; -: 333: BITMAPCOREHEADER core; -: 334: HDC screen, screen_copy; -: 335: DWORD rop; -: 336: PyObject* buffer; -: 337: HANDLE dpiAwareness; -: 338: HMODULE user32; -: 339: Func_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContext_function; -: 340: -: 341: if (!PyArg_ParseTuple(args, "|ii", &includeLayeredWindows, &all_screens)) { -: 342: return NULL; -: 343: } -: 344: -: 345: /* step 1: create a memory DC large enough to hold the -: 346: entire screen */ -: 347: -: 348: screen = CreateDC("DISPLAY", NULL, NULL, NULL); -: 349: screen_copy = CreateCompatibleDC(screen); -: 350: -: 351: // added in Windows 10 (1607) -: 352: // loaded dynamically to avoid link errors -: 353: user32 = LoadLibraryA("User32.dll"); -: 354: SetThreadDpiAwarenessContext_function = -: 355: (Func_SetThreadDpiAwarenessContext) -: 356: GetProcAddress(user32, "SetThreadDpiAwarenessContext"); -: 357: if (SetThreadDpiAwarenessContext_function != NULL) { -: 358: // DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3) -: 359: dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE) -3); -: 360: } -: 361: -: 362: if (all_screens) { -: 363: x = GetSystemMetrics(SM_XVIRTUALSCREEN); -: 364: y = GetSystemMetrics(SM_YVIRTUALSCREEN); -: 365: width = GetSystemMetrics(SM_CXVIRTUALSCREEN); -: 366: height = GetSystemMetrics(SM_CYVIRTUALSCREEN); -: 367: } else { -: 368: width = GetDeviceCaps(screen, HORZRES); -: 369: height = GetDeviceCaps(screen, VERTRES); -: 370: } -: 371: -: 372: if (SetThreadDpiAwarenessContext_function != NULL) { -: 373: SetThreadDpiAwarenessContext_function(dpiAwareness); -: 374: } -: 375: -: 376: FreeLibrary(user32); -: 377: -: 378: bitmap = CreateCompatibleBitmap(screen, width, height); -: 379: if (!bitmap) { -: 380: goto error; -: 381: } -: 382: -: 383: if (!SelectObject(screen_copy, bitmap)) { -: 384: goto error; -: 385: } -: 386: -: 387: /* step 2: copy bits into memory DC bitmap */ -: 388: -: 389: rop = SRCCOPY; -: 390: if (includeLayeredWindows) { -: 391: rop |= CAPTUREBLT; -: 392: } -: 393: if (!BitBlt(screen_copy, 0, 0, width, height, screen, x, y, rop)) { -: 394: goto error; -: 395: } -: 396: -: 397: /* step 3: extract bits from bitmap */ -: 398: -: 399: buffer = PyBytes_FromStringAndSize(NULL, height * ((width*3 + 3) & -4)); -: 400: if (!buffer) { -: 401: return NULL; -: 402: } -: 403: -: 404: core.bcSize = sizeof(core); -: 405: core.bcWidth = width; -: 406: core.bcHeight = height; -: 407: core.bcPlanes = 1; -: 408: core.bcBitCount = 24; -: 409: if (!GetDIBits(screen_copy, bitmap, 0, height, PyBytes_AS_STRING(buffer), -: 410: (BITMAPINFO*) &core, DIB_RGB_COLORS)) { -: 411: goto error; -: 412: } -: 413: -: 414: DeleteObject(bitmap); -: 415: DeleteDC(screen_copy); -: 416: DeleteDC(screen); -: 417: -: 418: return Py_BuildValue("(ii)(ii)N", x, y, width, height, buffer); -: 419: -: 420:error: -: 421: PyErr_SetString(PyExc_OSError, "screen grab failed"); -: 422: -: 423: DeleteDC(screen_copy); -: 424: DeleteDC(screen); -: 425: -: 426: return NULL; -: 427:} -: 428: -: 429:static BOOL CALLBACK list_windows_callback(HWND hwnd, LPARAM lParam) -: 430:{ -: 431: PyObject* window_list = (PyObject*) lParam; -: 432: PyObject* item; -: 433: PyObject* title; -: 434: RECT inner, outer; -: 435: int title_size; -: 436: int status; -: 437: -: 438: /* get window title */ -: 439: title_size = GetWindowTextLength(hwnd); -: 440: if (title_size > 0) { -: 441: title = PyUnicode_FromStringAndSize(NULL, title_size); -: 442: if (title) { -: 443: GetWindowTextW(hwnd, PyUnicode_AS_UNICODE(title), title_size+1); -: 444: } -: 445: } else { -: 446: title = PyUnicode_FromString(""); -: 447: } -: 448: if (!title) { -: 449: return 0; -: 450: } -: 451: -: 452: /* get bounding boxes */ -: 453: GetClientRect(hwnd, &inner); -: 454: GetWindowRect(hwnd, &outer); -: 455: -: 456: item = Py_BuildValue( -: 457: F_HANDLE "N(iiii)(iiii)", hwnd, title, -: 458: inner.left, inner.top, inner.right, inner.bottom, -: 459: outer.left, outer.top, outer.right, outer.bottom -: 460: ); -: 461: if (!item) { -: 462: return 0; -: 463: } -: 464: -: 465: status = PyList_Append(window_list, item); -: 466: -: 467: Py_DECREF(item); -: 468: -: 469: if (status < 0) { -: 470: return 0; -: 471: } -: 472: -: 473: return 1; -: 474:} -: 475: -: 476:PyObject* -: 477:PyImaging_ListWindowsWin32(PyObject* self, PyObject* args) -: 478:{ -: 479: PyObject* window_list; -: 480: -: 481: window_list = PyList_New(0); -: 482: if (!window_list) { -: 483: return NULL; -: 484: } -: 485: -: 486: EnumWindows(list_windows_callback, (LPARAM) window_list); -: 487: -: 488: if (PyErr_Occurred()) { -: 489: Py_DECREF(window_list); -: 490: return NULL; -: 491: } -: 492: -: 493: return window_list; -: 494:} -: 495: -: 496:/* -------------------------------------------------------------------- */ -: 497:/* Windows clipboard grabber */ -: 498: -: 499:PyObject* -: 500:PyImaging_GrabClipboardWin32(PyObject* self, PyObject* args) -: 501:{ -: 502: int clip; -: 503: HANDLE handle = NULL; -: 504: int size; -: 505: void* data; -: 506: PyObject* result; -: 507: UINT format; -: 508: UINT formats[] = { CF_DIB, CF_DIBV5, CF_HDROP, RegisterClipboardFormatA("PNG"), 0 }; -: 509: LPCSTR format_names[] = { "DIB", "DIB", "file", "png", NULL }; -: 510: -: 511: if (!OpenClipboard(NULL)) { -: 512: PyErr_SetString(PyExc_OSError, "failed to open clipboard"); -: 513: return NULL; -: 514: } -: 515: -: 516: // find best format as set by clipboard owner -: 517: format = 0; -: 518: while (!handle && (format = EnumClipboardFormats(format))) { -: 519: for (UINT i = 0; formats[i] != 0; i++) { -: 520: if (format == formats[i]) { -: 521: handle = GetClipboardData(format); -: 522: format = i; -: 523: break; -: 524: } -: 525: } -: 526: } -: 527: -: 528: if (!handle) { -: 529: CloseClipboard(); -: 530: return Py_BuildValue("zO", NULL, Py_None); -: 531: } -: 532: -: 533: data = GlobalLock(handle); -: 534: size = GlobalSize(handle); -: 535: -: 536: result = PyBytes_FromStringAndSize(data, size); -: 537: -: 538: GlobalUnlock(handle); -: 539: CloseClipboard(); -: 540: -: 541: return Py_BuildValue("zN", format_names[format], result); -: 542:} -: 543: -: 544:/* -------------------------------------------------------------------- */ -: 545:/* Windows class */ -: 546: -: 547:#ifndef WM_MOUSEWHEEL -: 548:#define WM_MOUSEWHEEL 522 -: 549:#endif -: 550: -: 551:static int mainloop = 0; -: 552: -: 553:static void -: 554:callback_error(const char* handler) -: 555:{ -: 556: PyObject* sys_stderr; -: 557: -: 558: sys_stderr = PySys_GetObject("stderr"); -: 559: -: 560: if (sys_stderr) { -: 561: PyFile_WriteString("*** ImageWin: error in ", sys_stderr); -: 562: PyFile_WriteString((char*) handler, sys_stderr); -: 563: PyFile_WriteString(":\n", sys_stderr); -: 564: } -: 565: -: 566: PyErr_Print(); -: 567: PyErr_Clear(); -: 568:} -: 569: -: 570:static LRESULT CALLBACK -: 571:windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) -: 572:{ -: 573: PAINTSTRUCT ps; -: 574: PyObject* callback = NULL; -: 575: PyObject* result; -: 576: PyThreadState* threadstate; -: 577: PyThreadState* current_threadstate; -: 578: HDC dc; -: 579: RECT rect; -: 580: LRESULT status = 0; -: 581: -: 582: /* set up threadstate for messages that calls back into python */ -: 583: switch (message) { -: 584: case WM_CREATE: -: 585: mainloop++; -: 586: break; -: 587: case WM_DESTROY: -: 588: mainloop--; -: 589: /* fall through... */ -: 590: case WM_PAINT: -: 591: case WM_SIZE: -: 592: callback = (PyObject*) GetWindowLongPtr(wnd, 0); -: 593: if (callback) { -: 594: threadstate = (PyThreadState*) -: 595: GetWindowLongPtr(wnd, sizeof(PyObject*)); -: 596: current_threadstate = PyThreadState_Swap(NULL); -: 597: PyEval_RestoreThread(threadstate); -: 598: } else { -: 599: return DefWindowProc(wnd, message, wParam, lParam); -: 600: } -: 601: } -: 602: -: 603: /* process message */ -: 604: switch (message) { -: 605: -: 606: case WM_PAINT: -: 607: /* redraw (part of) window. this generates a WCK-style -: 608: damage/clear/repair cascade */ -: 609: BeginPaint(wnd, &ps); -: 610: dc = GetDC(wnd); -: 611: GetWindowRect(wnd, &rect); /* in screen coordinates */ -: 612: -: 613: result = PyObject_CallFunction( -: 614: callback, "siiii", "damage", -: 615: ps.rcPaint.left, ps.rcPaint.top, -: 616: ps.rcPaint.right, ps.rcPaint.bottom -: 617: ); -: 618: if (result) { -: 619: Py_DECREF(result); -: 620: } else { -: 621: callback_error("window damage callback"); -: 622: } -: 623: -: 624: result = PyObject_CallFunction( -: 625: callback, "s" F_HANDLE "iiii", "clear", dc, -: 626: 0, 0, rect.right-rect.left, rect.bottom-rect.top -: 627: ); -: 628: if (result) { -: 629: Py_DECREF(result); -: 630: } else { -: 631: callback_error("window clear callback"); -: 632: } -: 633: -: 634: result = PyObject_CallFunction( -: 635: callback, "s" F_HANDLE "iiii", "repair", dc, -: 636: 0, 0, rect.right-rect.left, rect.bottom-rect.top -: 637: ); -: 638: if (result) { -: 639: Py_DECREF(result); -: 640: } else { -: 641: callback_error("window repair callback"); -: 642: } -: 643: -: 644: ReleaseDC(wnd, dc); -: 645: EndPaint(wnd, &ps); -: 646: break; -: 647: -: 648: case WM_SIZE: -: 649: /* resize window */ -: 650: result = PyObject_CallFunction( -: 651: callback, "sii", "resize", LOWORD(lParam), HIWORD(lParam) -: 652: ); -: 653: if (result) { -: 654: InvalidateRect(wnd, NULL, 1); -: 655: Py_DECREF(result); -: 656: } else { -: 657: callback_error("window resize callback"); -: 658: } -: 659: break; -: 660: -: 661: case WM_DESTROY: -: 662: /* destroy window */ -: 663: result = PyObject_CallFunction(callback, "s", "destroy"); -: 664: if (result) { -: 665: Py_DECREF(result); -: 666: } else { -: 667: callback_error("window destroy callback"); -: 668: } -: 669: Py_DECREF(callback); -: 670: break; -: 671: -: 672: default: -: 673: status = DefWindowProc(wnd, message, wParam, lParam); -: 674: } -: 675: -: 676: if (callback) { -: 677: /* restore thread state */ -: 678: PyEval_SaveThread(); -: 679: PyThreadState_Swap(threadstate); -: 680: } -: 681: -: 682: return status; -: 683:} -: 684: -: 685:PyObject* -: 686:PyImaging_CreateWindowWin32(PyObject* self, PyObject* args) -: 687:{ -: 688: HWND wnd; -: 689: WNDCLASS windowClass; -: 690: -: 691: char* title; -: 692: PyObject* callback; -: 693: int width = 0, height = 0; -: 694: if (!PyArg_ParseTuple(args, "sO|ii", &title, &callback, &width, &height)) { -: 695: return NULL; -: 696: } -: 697: -: 698: if (width <= 0) { -: 699: width = CW_USEDEFAULT; -: 700: } -: 701: if (height <= 0) { -: 702: height = CW_USEDEFAULT; -: 703: } -: 704: -: 705: /* register toplevel window class */ -: 706: windowClass.style = CS_CLASSDC; -: 707: windowClass.cbClsExtra = 0; -: 708: windowClass.cbWndExtra = sizeof(PyObject*) + sizeof(PyThreadState*); -: 709: windowClass.hInstance = GetModuleHandle(NULL); -: 710: /* windowClass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); */ -: 711: windowClass.hbrBackground = NULL; -: 712: windowClass.lpszMenuName = NULL; -: 713: windowClass.lpszClassName = "pilWindow"; -: 714: windowClass.lpfnWndProc = windowCallback; -: 715: windowClass.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(1)); -: 716: windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); /* CROSS? */ -: 717: -: 718: RegisterClass(&windowClass); /* FIXME: check return status */ -: 719: -: 720: wnd = CreateWindowEx( -: 721: 0, windowClass.lpszClassName, title, -: 722: WS_OVERLAPPEDWINDOW, -: 723: CW_USEDEFAULT, CW_USEDEFAULT, width, height, -: 724: HWND_DESKTOP, NULL, NULL, NULL -: 725: ); -: 726: -: 727: if (!wnd) { -: 728: PyErr_SetString(PyExc_OSError, "failed to create window"); -: 729: return NULL; -: 730: } -: 731: -: 732: /* register window callback */ -: 733: Py_INCREF(callback); -: 734: SetWindowLongPtr(wnd, 0, (LONG_PTR) callback); -: 735: SetWindowLongPtr(wnd, sizeof(callback), (LONG_PTR) PyThreadState_Get()); -: 736: -: 737: Py_BEGIN_ALLOW_THREADS -: 738: ShowWindow(wnd, SW_SHOWNORMAL); -: 739: SetForegroundWindow(wnd); /* to make sure it's visible */ -: 740: Py_END_ALLOW_THREADS -: 741: -: 742: return Py_BuildValue(F_HANDLE, wnd); -: 743:} -: 744: -: 745:PyObject* -: 746:PyImaging_EventLoopWin32(PyObject* self, PyObject* args) -: 747:{ -: 748: MSG msg; -: 749: -: 750: Py_BEGIN_ALLOW_THREADS -: 751: while (mainloop && GetMessage(&msg, NULL, 0, 0)) { -: 752: TranslateMessage(&msg); -: 753: DispatchMessage(&msg); -: 754: } -: 755: Py_END_ALLOW_THREADS -: 756: -: 757: Py_INCREF(Py_None); -: 758: return Py_None; -: 759:} -: 760: -: 761:/* -------------------------------------------------------------------- */ -: 762:/* windows WMF renderer */ -: 763: -: 764:#define GET32(p,o) ((DWORD*)(p+o))[0] -: 765: -: 766:PyObject * -: 767:PyImaging_DrawWmf(PyObject* self, PyObject* args) -: 768:{ -: 769: HBITMAP bitmap; -: 770: HENHMETAFILE meta; -: 771: BITMAPCOREHEADER core; -: 772: HDC dc; -: 773: RECT rect; -: 774: PyObject* buffer = NULL; -: 775: char* ptr; -: 776: -: 777: char* data; -: 778: Py_ssize_t datasize; -: 779: int width, height; -: 780: int x0, y0, x1, y1; -: 781: if (!PyArg_ParseTuple(args, "y#(ii)(iiii):_load", &data, &datasize, -: 782: &width, &height, &x0, &x1, &y0, &y1)) { -: 783: return NULL; -: 784: } -: 785: -: 786: /* step 1: copy metafile contents into METAFILE object */ -: 787: -: 788: if (datasize > 22 && GET32(data, 0) == 0x9ac6cdd7) { -: 789: -: 790: /* placeable windows metafile (22-byte aldus header) */ -: 791: meta = SetWinMetaFileBits(datasize-22, data+22, NULL, NULL); -: 792: -: 793: } else if (datasize > 80 && GET32(data, 0) == 1 && -: 794: GET32(data, 40) == 0x464d4520) { -: 795: -: 796: /* enhanced metafile */ -: 797: meta = SetEnhMetaFileBits(datasize, data); -: 798: -: 799: } else { -: 800: -: 801: /* unknown meta format */ -: 802: meta = NULL; -: 803: -: 804: } -: 805: -: 806: if (!meta) { -: 807: PyErr_SetString(PyExc_OSError, "cannot load metafile"); -: 808: return NULL; -: 809: } -: 810: -: 811: /* step 2: create bitmap */ -: 812: -: 813: core.bcSize = sizeof(core); -: 814: core.bcWidth = width; -: 815: core.bcHeight = height; -: 816: core.bcPlanes = 1; -: 817: core.bcBitCount = 24; -: 818: -: 819: dc = CreateCompatibleDC(NULL); -: 820: -: 821: bitmap = CreateDIBSection( -: 822: dc, (BITMAPINFO*) &core, DIB_RGB_COLORS, &ptr, NULL, 0 -: 823: ); -: 824: -: 825: if (!bitmap) { -: 826: PyErr_SetString(PyExc_OSError, "cannot create bitmap"); -: 827: goto error; -: 828: } -: 829: -: 830: if (!SelectObject(dc, bitmap)) { -: 831: PyErr_SetString(PyExc_OSError, "cannot select bitmap"); -: 832: goto error; -: 833: } -: 834: -: 835: /* step 3: render metafile into bitmap */ -: 836: -: 837: rect.left = rect.top = 0; -: 838: rect.right = width; -: 839: rect.bottom = height; -: 840: -: 841: /* FIXME: make background transparent? configurable? */ -: 842: FillRect(dc, &rect, GetStockObject(WHITE_BRUSH)); -: 843: -: 844: if (!PlayEnhMetaFile(dc, meta, &rect)) { -: 845: PyErr_SetString(PyExc_OSError, "cannot render metafile"); -: 846: goto error; -: 847: } -: 848: -: 849: /* step 4: extract bits from bitmap */ -: 850: -: 851: GdiFlush(); -: 852: -: 853: buffer = PyBytes_FromStringAndSize(ptr, height * ((width*3 + 3) & -4)); -: 854: -: 855:error: -: 856: DeleteEnhMetaFile(meta); -: 857: -: 858: if (bitmap) { -: 859: DeleteObject(bitmap); -: 860: } -: 861: -: 862: DeleteDC(dc); -: 863: -: 864: return buffer; -: 865:} -: 866: -: 867:#endif /* _WIN32 */ -: 868: -: 869:/* -------------------------------------------------------------------- */ -: 870:/* X11 support */ -: 871: -: 872:#ifdef HAVE_XCB -: 873:#include -: 874: -: 875:/* -------------------------------------------------------------------- */ -: 876:/* X11 screen grabber */ -: 877: -: 878:PyObject* function PyImaging_GrabScreenX11 called 2 returned 100% blocks executed 28% 2: 879:PyImaging_GrabScreenX11(PyObject* self, PyObject* args) -: 880:{ -: 881: int width, height; -: 882: char* display_name; -: 883: xcb_connection_t* connection; -: 884: int screen_number; -: 885: xcb_screen_iterator_t iter; 2: 886: xcb_screen_t* screen = NULL; -: 887: xcb_get_image_reply_t* reply; -: 888: xcb_generic_error_t* error; 2: 889: PyObject* buffer = NULL; -: 890: 2: 891: if (!PyArg_ParseTuple(args, "|z", &display_name)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% -: 892: return NULL; -: 893: } -: 894: -: 895: /* connect to X and get screen data */ -: 896: 2: 897: connection = xcb_connect(display_name, &screen_number); call 0 returned 100% 2: 898: if (xcb_connection_has_error(connection)) { call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% 2: 899: PyErr_Format(PyExc_OSError, "X connection failed: error %i", xcb_connection_has_error(connection)); call 0 returned 100% call 1 returned 100% 2: 900: xcb_disconnect(connection); call 0 returned 100% 2: 901: return NULL; -: 902: } -: 903: #####: 904: iter = xcb_setup_roots_iterator(xcb_get_setup(connection)); call 0 never executed call 1 never executed #####: 905: for (; iter.rem; --screen_number, xcb_screen_next(&iter)) { call 0 never executed branch 1 never executed branch 2 never executed #####: 906: if (screen_number == 0) { branch 0 never executed branch 1 never executed #####: 907: screen = iter.data; #####: 908: break; -: 909: } -: 910: } #####: 911: if (screen == NULL || screen->root == 0) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 912: // this case is usually caught with "X connection failed: error 6" above #####: 913: xcb_disconnect(connection); call 0 never executed #####: 914: PyErr_SetString(PyExc_OSError, "X screen not found"); call 0 never executed #####: 915: return NULL; -: 916: } -: 917: #####: 918: width = screen->width_in_pixels; #####: 919: height = screen->height_in_pixels; -: 920: -: 921: /* get image data */ -: 922: #####: 923: reply = xcb_get_image_reply(connection, call 0 never executed call 1 never executed -: 924: xcb_get_image(connection, XCB_IMAGE_FORMAT_Z_PIXMAP, screen->root, -: 925: 0, 0, width, height, 0x00ffffff), -: 926: &error); #####: 927: if (reply == NULL) { branch 0 never executed branch 1 never executed #####: 928: PyErr_Format(PyExc_OSError, "X get_image failed: error %i (%i, %i, %i)", call 0 never executed #####: 929: error->error_code, error->major_code, error->minor_code, error->resource_id); #####: 930: free(error); #####: 931: xcb_disconnect(connection); call 0 never executed #####: 932: return NULL; -: 933: } -: 934: -: 935: /* store data in Python buffer */ -: 936: #####: 937: if (reply->depth == 24) { branch 0 never executed branch 1 never executed #####: 938: buffer = PyBytes_FromStringAndSize((char*)xcb_get_image_data(reply), call 0 never executed call 1 never executed #####: 939: xcb_get_image_data_length(reply)); call 0 never executed -: 940: } else { #####: 941: PyErr_Format(PyExc_OSError, "unsupported bit depth: %i", reply->depth); call 0 never executed -: 942: } -: 943: #####: 944: free(reply); #####: 945: xcb_disconnect(connection); call 0 never executed -: 946: #####: 947: if (!buffer) { branch 0 never executed branch 1 never executed -: 948: return NULL; -: 949: } -: 950: #####: 951: return Py_BuildValue("(ii)N", width, height, buffer); call 0 never executed -: 952:} -: 953: -: 954:#endif /* HAVE_XCB */ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#RankFilter.c.gcov -: 0:Source:src/libImaging/RankFilter.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/RankFilter.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/RankFilter.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * min, max, median filters -: 6: * -: 7: * history: -: 8: * 2002-06-08 fl Created -: 9: * -: 10: * Copyright (c) Secret Labs AB 2002. All rights reserved. -: 11: * -: 12: * See the README file for information on usage and redistribution. -: 13: */ -: 14: -: 15:#include "Imaging.h" -: 16: -: 17:/* Fast rank algorithm (due to Wirth), based on public domain code -: 18: by Nicolas Devillard, available at http://ndevilla.free.fr */ -: 19: -: 20:#define SWAP(type,a,b) { register type t=(a);(a)=(b);(b)=t; } -: 21: -: 22:#define MakeRankFunction(type)\ -: 23:static type Rank##type(type a[], int n, int k)\ -: 24:{\ -: 25: register int i, j, l, m;\ -: 26: register type x;\ -: 27: l = 0; m = n-1;\ -: 28: while (l < m) {\ -: 29: x = a[k];\ -: 30: i = l;\ -: 31: j = m;\ -: 32: do {\ -: 33: while (a[i] < x) {\ -: 34: i++;\ -: 35: }\ -: 36: while (x < a[j]) {\ -: 37: j--;\ -: 38: }\ -: 39: if (i <= j) {\ -: 40: SWAP(type, a[i], a[j]);\ -: 41: i++; j--;\ -: 42: }\ -: 43: } while (i <= j);\ -: 44: if (j < k) {\ -: 45: l = i;\ -: 46: }\ -: 47: if (k < i) {\ -: 48: m = j;\ -: 49: }\ -: 50: }\ -: 51: return a[k];\ -: 52:} -: 53: function RankUINT8 called 393351 returned 100% blocks executed 100% 393351: 54:MakeRankFunction(UINT8) branch 0 taken 38% branch 1 taken 62% (fallthrough) branch 2 taken 38% branch 3 taken 62% (fallthrough) branch 4 taken 83% (fallthrough) branch 5 taken 17% branch 6 taken 55% branch 7 taken 45% (fallthrough) branch 8 taken 59% (fallthrough) branch 9 taken 41% branch 10 taken 59% (fallthrough) branch 11 taken 41% branch 12 taken 71% branch 13 taken 29% (fallthrough) function RankINT32 called 27 returned 100% blocks executed 100% 27: 55:MakeRankFunction(INT32) branch 0 taken 65% branch 1 taken 35% (fallthrough) branch 2 taken 65% branch 3 taken 35% (fallthrough) branch 4 taken 84% (fallthrough) branch 5 taken 16% branch 6 taken 33% branch 7 taken 67% (fallthrough) branch 8 taken 63% (fallthrough) branch 9 taken 37% branch 10 taken 63% (fallthrough) branch 11 taken 37% branch 12 taken 60% branch 13 taken 40% (fallthrough) function RankFLOAT32 called 27 returned 100% blocks executed 100% 27: 56:MakeRankFunction(FLOAT32) branch 0 taken 65% branch 1 taken 35% (fallthrough) branch 2 taken 65% branch 3 taken 35% (fallthrough) branch 4 taken 84% (fallthrough) branch 5 taken 16% branch 6 taken 33% branch 7 taken 67% (fallthrough) branch 8 taken 63% (fallthrough) branch 9 taken 37% branch 10 taken 63% (fallthrough) branch 11 taken 37% branch 12 taken 60% branch 13 taken 40% (fallthrough) -: 57: -: 58:Imaging function ImagingRankFilter called 45 returned 100% blocks executed 86% 45: 59:ImagingRankFilter(Imaging im, int size, int rank) -: 60:{ 45: 61: Imaging imOut = NULL; -: 62: int x, y; -: 63: int i, margin, size2; -: 64: 45: 65: if (!im || im->bands != 1 || im->type == IMAGING_TYPE_SPECIAL) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 0% (fallthrough) branch 5 taken 100% #####: 66: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 67: } -: 68: 45: 69: if (!(size & 1)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 70: return (Imaging) ImagingError_ValueError("bad filter size"); call 0 never executed -: 71: } -: 72: -: 73: /* malloc check ok, for overflow in the define below */ 90: 74: if (size > INT_MAX / size || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% 45: 75: size > INT_MAX / (size * sizeof(FLOAT32))) { #####: 76: return (Imaging) ImagingError_ValueError("filter size too large"); call 0 never executed -: 77: } -: 78: 45: 79: size2 = size * size; 45: 80: margin = (size-1) / 2; -: 81: 45: 82: if (rank < 0 || rank >= size2) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 83: return (Imaging) ImagingError_ValueError("bad rank value"); call 0 never executed -: 84: } -: 85: 45: 86: imOut = ImagingNew(im->mode, im->xsize - 2*margin, im->ysize - 2*margin); call 0 returned 100% 45: 87: if (!imOut) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 88: return NULL; -: 89: } -: 90: -: 91: /* malloc check ok, checked above */ -: 92:#define RANK_BODY(type) do {\ -: 93: type* buf = malloc(size2 * sizeof(type));\ -: 94: if (!buf) {\ -: 95: goto nomemory;\ -: 96: }\ -: 97: for (y = 0; y < imOut->ysize; y++) {\ -: 98: for (x = 0; x < imOut->xsize; x++) {\ -: 99: for (i = 0; i < size; i++) {\ -: 100: memcpy(buf + i*size, &IMAGING_PIXEL_##type(im, x, y+i),\ -: 101: size * sizeof(type));\ -: 102: }\ -: 103: IMAGING_PIXEL_##type(imOut, x, y) = Rank##type(buf, size2, rank);\ -: 104: }\ -: 105: }\ -: 106: free(buf); \ -: 107:} while (0) -: 108: 45: 109: if (im->image8) { branch 0 taken 87% (fallthrough) branch 1 taken 13% 1180092: 110: RANK_BODY(UINT8); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 75% branch 3 taken 25% (fallthrough) call 4 returned 100% branch 5 taken 99% (fallthrough) branch 6 taken 1% branch 7 taken 99% (fallthrough) branch 8 taken 1% 6: 111: } else if (im->type == IMAGING_TYPE_INT32) { branch 0 taken 50% (fallthrough) branch 1 taken 50% 84: 112: RANK_BODY(INT32); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 75% branch 3 taken 25% (fallthrough) call 4 returned 100% branch 5 taken 75% (fallthrough) branch 6 taken 25% branch 7 taken 75% (fallthrough) branch 8 taken 25% 3: 113: } else if (im->type == IMAGING_TYPE_FLOAT32) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 84: 114: RANK_BODY(FLOAT32); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 75% branch 3 taken 25% (fallthrough) call 4 returned 100% branch 5 taken 75% (fallthrough) branch 6 taken 25% branch 7 taken 75% (fallthrough) branch 8 taken 25% -: 115: } else { -: 116: /* safety net (we shouldn't end up here) */ #####: 117: ImagingDelete(imOut); call 0 never executed #####: 118: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 119: } -: 120: 45: 121: ImagingCopyPalette(imOut, im); call 0 returned 100% -: 122: 45: 123: return imOut; -: 124: -: 125:nomemory: #####: 126: ImagingDelete(imOut); call 0 never executed #####: 127: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 128:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Effects.c.gcov -: 0:Source:src/libImaging/Effects.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Effects.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#libImaging#SunRleDecode.c.gcov -: 0:Source:src/libImaging/SunRleDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/SunRleDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/SunRleDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * THIS IS WORK IN PROGRESS -: 3: * -: 4: * The Python Imaging Library. -: 5: * $Id$ -: 6: * -: 7: * decoder for SUN RLE data. -: 8: * -: 9: * history: -: 10: * 97-01-04 fl Created -: 11: * -: 12: * Copyright (c) Fredrik Lundh 1997. -: 13: * Copyright (c) Secret Labs AB 1997. -: 14: * -: 15: * See the README file for information on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21: -: 22:int function ImagingSunRleDecode called 19 returned 100% blocks executed 100% 19: 23:ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 24:{ -: 25: int n; -: 26: UINT8* ptr; 19: 27: UINT8 extra_data = 0; 19: 28: UINT8 extra_bytes = 0; -: 29: 19: 30: ptr = buf; -: 31: -: 32: for (;;) { -: 33: 1043968: 34: if (bytes < 1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 14: 35: return ptr - buf; -: 36: } -: 37: 1043954: 38: if (ptr[0] == 0x80) { branch 0 taken 2% (fallthrough) branch 1 taken 98% -: 39: 18634: 40: if (bytes < 2) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 41: break; -: 42: } -: 43: 18633: 44: n = ptr[1]; -: 45: -: 46: 18633: 47: if (n == 0) { branch 0 taken 27% (fallthrough) branch 1 taken 73% -: 48: -: 49: /* Literal 0x80 (2 bytes) */ 5101: 50: n = 1; -: 51: 5101: 52: state->buffer[state->x] = 0x80; -: 53: 5101: 54: ptr += 2; 5101: 55: bytes -= 2; -: 56: -: 57: } else { -: 58: -: 59: /* Run (3 bytes) */ 13532: 60: if (bytes < 3) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 61: break; -: 62: } -: 63: -: 64: /* from (https://www.fileformat.info/format/sunraster/egff.htm) -: 65: -: 66: For example, a run of 100 pixels with the value of -: 67: 0Ah would encode as the values 80h 64h 0Ah. A -: 68: single pixel value of 80h would encode as the -: 69: values 80h 00h. The four unencoded bytes 12345678h -: 70: would be stored in the RLE stream as 12h 34h 56h -: 71: 78h. 100 pixels, n=100, not 100 pixels, n=99. -: 72: -: 73: But Wait! There's More! -: 74: (https://www.fileformat.info/format/sunraster/spec/598a59c4fac64c52897585d390d86360/view.htm) -: 75: -: 76: If the first byte is 0x80, and the second byte is -: 77: not zero, the record is three bytes long. The -: 78: second byte is a count and the third byte is a -: 79: value. Output (count+1) pixels of that value. -: 80: -: 81: 2 specs, same site, but Imagemagick and GIMP seem -: 82: to agree on the second one. -: 83: */ 13532: 84: n += 1; -: 85: 13532: 86: if (state->x + n > state->bytes) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 325: 87: extra_bytes = n; /* full value */ 325: 88: n = state->bytes - state->x; 325: 89: extra_bytes -= n; 325: 90: extra_data = ptr[2]; -: 91: } -: 92: 27064: 93: memset(state->buffer + state->x, ptr[2], n); -: 94: 13532: 95: ptr += 3; 13532: 96: bytes -= 3; -: 97: -: 98: } -: 99: -: 100: } else { -: 101: -: 102: /* Literal byte */ 1025320: 103: n = 1; -: 104: 1025320: 105: state->buffer[state->x] = ptr[0]; -: 106: 1025320: 107: ptr += 1; 1025320: 108: bytes -= 1; -: 109: -: 110: } -: 111: -: 112: for (;;) { 1044359: 113: state->x += n; -: 114: 1044359: 115: if (state->x >= state->bytes) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 116: -: 117: /* Got a full line, unpack it */ 5808: 118: state->shuffle((UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 3872: 119: state->xoff * im->pixelsize, state->buffer, -: 120: state->xsize); -: 121: 1936: 122: state->x = 0; -: 123: 1936: 124: if (++state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 125: /* End of file (errcode = 0) */ -: 126: return -1; -: 127: } -: 128: } -: 129: 1044355: 130: if (extra_bytes == 0) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 131: break; -: 132: } -: 133: 406: 134: if (state->x > 0) { branch 0 taken 0% branch 1 taken 100% (fallthrough) -: 135: break; // assert -: 136: } -: 137: 406: 138: if (extra_bytes >= state->bytes) { branch 0 taken 80% (fallthrough) branch 1 taken 20% -: 139: n = state->bytes; -: 140: } else { 324: 141: n = extra_bytes; -: 142: } 812: 143: memset(state->buffer + state->x, extra_data, n); 406: 144: extra_bytes -= n; 406: 145: } -: 146: } -: 147: 1: 148: return ptr - buf; -: 149:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#_imagingft.c.gcov -: 0:Source:src/_imagingft.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/_imagingft.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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 99% (fallthrough) branch 1 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 76% 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 1% (fallthrough) branch 3 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 -: 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#QuantPngQuant.c.gcov -: 0:Source:src/libImaging/QuantPngQuant.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/QuantPngQuant.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#Negative.c.gcov -: 0:Source:src/libImaging/Negative.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Negative.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#QuantHash.c.gcov -: 0:Source:src/libImaging/QuantHash.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/QuantHash.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/QuantHash.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * hash tables used by the image quantizer -: 6: * -: 7: * history: -: 8: * 98-09-10 tjs Contributed -: 9: * 98-12-29 fl Added to PIL 1.0b1 -: 10: * -: 11: * Written by Toby J Sargeant . -: 12: * -: 13: * Copyright (c) 1998 by Toby J Sargeant -: 14: * Copyright (c) 1998 by Secret Labs AB -: 15: * -: 16: * See the README file for information on usage and redistribution. -: 17: */ -: 18: -: 19:#include -: 20:#include -: 21:#include -: 22:#include -: 23: -: 24:#include "QuantHash.h" -: 25: -: 26:typedef struct _HashNode { -: 27: struct _HashNode *next; -: 28: HashKey_t key; -: 29: HashVal_t value; -: 30:} HashNode; -: 31: -: 32:struct _HashTable { -: 33: HashNode **table; -: 34: uint32_t length; -: 35: uint32_t count; -: 36: HashFunc hashFunc; -: 37: HashCmpFunc cmpFunc; -: 38: void *userData; -: 39:}; -: 40: -: 41:#define MIN_LENGTH 11 -: 42:#define RESIZE_FACTOR 3 -: 43: -: 44:static int _hashtable_insert_node(HashTable *,HashNode *,int,int,CollisionFunc); -: 45: function hashtable_new called 24 returned 100% blocks executed 80% 24: 46:HashTable *hashtable_new(HashFunc hf,HashCmpFunc cf) { -: 47: HashTable *h; 24: 48: h=malloc(sizeof(HashTable)); 24: 49: if (!h) { return NULL; } branch 0 taken 100% (fallthrough) branch 1 taken 0% 24: 50: h->hashFunc=hf; 24: 51: h->cmpFunc=cf; 24: 52: h->length=MIN_LENGTH; 24: 53: h->count=0; 24: 54: h->userData=NULL; 24: 55: h->table=malloc(sizeof(HashNode *)*h->length); 24: 56: if (!h->table) { free(h); return NULL; } branch 0 taken 0% (fallthrough) branch 1 taken 100% 48: 57: memset (h->table,0,sizeof(HashNode *)*h->length); 24: 58: return h; -: 59:} -: 60: function _findPrime called 204 returned 100% blocks executed 92% 204: 61:static uint32_t _findPrime(uint32_t start,int dir) { -: 62: static int unit[]={0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0}; -: 63: uint32_t t; 568: 64: while (start>1) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 364: 65: if (!unit[start&0x0f]) { branch 0 taken 56% (fallthrough) branch 1 taken 44% 160: 66: start+=dir; 160: 67: continue; -: 68: } 3338: 69: for (t=2;t=sqrt((double)start)) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 75: break; -: 76: } #####: 77: start+=dir; -: 78: } 204: 79: return start; -: 80:} -: 81: function _hashtable_rehash called 140 returned 100% blocks executed 90% 140: 82:static void _hashtable_rehash(HashTable *h,CollisionFunc cf,uint32_t newSize) { 140: 83: HashNode **oldTable=h->table; -: 84: uint32_t i; -: 85: HashNode *n,*nn; -: 86: uint32_t oldSize; 140: 87: oldSize=h->length; 140: 88: h->table=malloc(sizeof(HashNode *)*newSize); 140: 89: if (!h->table) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 90: h->table=oldTable; #####: 91: return; -: 92: } 140: 93: h->length=newSize; 140: 94: h->count=0; 280: 95: memset (h->table,0,sizeof(HashNode *)*h->length); 78728: 96: for (i=0;inext; 235904: 99: _hashtable_insert_node(h,n,0,0,cf); -: 100: } -: 101: } 140: 102: free(oldTable); -: 103:} -: 104: function _hashtable_resize called 137036 returned 100% blocks executed 100% 137036: 105:static void _hashtable_resize(HashTable *h) { -: 106: uint32_t newSize; -: 107: uint32_t oldSize; 137036: 108: oldSize=h->length; 137036: 109: newSize=oldSize; 137036: 110: if (h->count*RESIZE_FACTORlength) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 64: 111: newSize=_findPrime(h->length/2-1,-1); call 0 returned 100% 136972: 112: } else if (h->length*RESIZE_FACTORcount) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 140: 113: newSize=_findPrime(h->length*2+1,+1); call 0 returned 100% -: 114: } 137036: 115: if (newSizehashFunc(h,node->key)%h->length; call 0 returned 100% -: 123: HashNode **n,*nv; -: 124: int i; -: 125: 324142: 126: for (n=&(h->table[hash]);*n;n=&((*n)->next)) { branch 0 taken 47% branch 1 taken 53% (fallthrough) 153268: 127: nv=*n; 153268: 128: i=h->cmpFunc(h,nv->key,node->key); call 0 returned 100% 153268: 129: if (!i) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 130: if (cf) { branch 0 never executed branch 1 never executed #####: 131: nv->key=node->key; #####: 132: cf(h,&(nv->key),&(nv->value),node->key,node->value); call 0 never executed #####: 133: free(node); #####: 134: return 1; -: 135: } else { #####: 136: nv->key=node->key; #####: 137: nv->value=node->value; #####: 138: free(node); #####: 139: return 1; -: 140: } 153268: 141: } else if (i>0) { branch 0 taken 58% (fallthrough) branch 1 taken 42% -: 142: break; -: 143: } -: 144: } 235904: 145: if (!update) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 235904: 146: node->next=*n; 235904: 147: *n=node; 235904: 148: h->count++; 235904: 149: if (resize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 150: _hashtable_resize(h); call 0 never executed -: 151: } -: 152: return 1; -: 153: } else { -: 154: return 0; -: 155: } -: 156:} -: 157: function _hashtable_insert called 137036 returned 100% blocks executed 100% 137036: 158:static int _hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val,int resize,int update) { -: 159: HashNode **n,*nv; -: 160: HashNode *t; -: 161: int i; 137036: 162: uint32_t hash=h->hashFunc(h,key)%h->length; call 0 returned 100% -: 163: 278356: 164: for (n=&(h->table[hash]);*n;n=&((*n)->next)) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 248150: 165: nv=*n; 248150: 166: i=h->cmpFunc(h,nv->key,key); call 0 returned 100% 248150: 167: if (!i) { branch 0 taken 28% (fallthrough) branch 1 taken 72% 68518: 168: nv->value=val; 68518: 169: return 1; 179632: 170: } else if (i>0) { branch 0 taken 79% (fallthrough) branch 1 taken 21% -: 171: break; -: 172: } -: 173: } 68518: 174: if (!update) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 68518: 175: t=malloc(sizeof(HashNode)); 68518: 176: if (!t) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 177: return 0; -: 178: } 68518: 179: t->next=*n; 68518: 180: *n=t; 68518: 181: t->key=key; 68518: 182: t->value=val; 68518: 183: h->count++; 68518: 184: if (resize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 68518: 185: _hashtable_resize(h); call 0 returned 100% -: 186: } -: 187: return 1; -: 188: } else { -: 189: return 0; -: 190: } -: 191:} -: 192: function hashtable_insert_or_update_computed called 679268 returned 100% blocks executed 94% 679268: 193:int hashtable_insert_or_update_computed(HashTable *h, -: 194: HashKey_t key, -: 195: ComputeFunc newFunc, -: 196: ComputeFunc existsFunc) { -: 197: HashNode **n,*nv; -: 198: HashNode *t; -: 199: int i; 679268: 200: uint32_t hash=h->hashFunc(h,key)%h->length; call 0 returned 100% -: 201: 1100518: 202: for (n=&(h->table[hash]);*n;n=&((*n)->next)) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 1069889: 203: nv=*n; 1069889: 204: i=h->cmpFunc(h,nv->key,key); call 0 returned 100% 1069889: 205: if (!i) { branch 0 taken 57% (fallthrough) branch 1 taken 43% 610750: 206: if (existsFunc) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 610750: 207: existsFunc(h,nv->key,&(nv->value)); call 0 returned 100% -: 208: } else { -: 209: return 0; -: 210: } 610750: 211: return 1; 459139: 212: } else if (i>0) { branch 0 taken 92% (fallthrough) branch 1 taken 8% -: 213: break; -: 214: } -: 215: } 68518: 216: t=malloc(sizeof(HashNode)); 68518: 217: if (!t) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 218: return 0; -: 219: } 68518: 220: t->key=key; 68518: 221: t->next=*n; 68518: 222: *n=t; 68518: 223: if (newFunc) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 68518: 224: newFunc(h,t->key,&(t->value)); call 0 returned 100% -: 225: } else { #####: 226: free(t); #####: 227: return 0; -: 228: } 68518: 229: h->count++; 68518: 230: _hashtable_resize(h); call 0 returned 100% 68518: 231: return 1; -: 232:} -: 233: function hashtable_insert called 137036 returned 100% blocks executed 100% 137036: 234:int hashtable_insert(HashTable *h,HashKey_t key,HashVal_t val) { 137036: 235: return _hashtable_insert(h,key,val,1,0); call 0 returned 100% -: 236:} -: 237: function hashtable_foreach_update called 0 returned 0% blocks executed 0% #####: 238:void hashtable_foreach_update(HashTable *h,IteratorUpdateFunc i,void *u) { -: 239: HashNode *n; -: 240: uint32_t x; -: 241: #####: 242: if (h->table) { branch 0 never executed branch 1 never executed #####: 243: for (x=0;xlength;x++) { branch 0 never executed branch 1 never executed #####: 244: for (n=h->table[x];n;n=n->next) { branch 0 never executed branch 1 never executed #####: 245: i(h,n->key,&(n->value),u); call 0 never executed -: 246: } -: 247: } -: 248: } #####: 249:} -: 250: function hashtable_foreach called 12 returned 100% blocks executed 100% 12: 251:void hashtable_foreach(HashTable *h,IteratorFunc i,void *u) { -: 252: HashNode *n; -: 253: uint32_t x; -: 254: 12: 255: if (h->table) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 39544: 256: for (x=0;xlength;x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 108062: 257: for (n=h->table[x];n;n=n->next) { branch 0 taken 63% branch 1 taken 37% (fallthrough) 68518: 258: i(h,n->key,n->value,u); call 0 returned 100% -: 259: } -: 260: } -: 261: } 12: 262:} -: 263: function hashtable_free called 24 returned 100% blocks executed 100% 24: 264:void hashtable_free(HashTable *h) { -: 265: HashNode *n,*nn; -: 266: uint32_t i; -: 267: 24: 268: if (h->table) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 79088: 269: for (i=0;ilength;i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 216124: 270: for (n=h->table[i];n;n=nn) { branch 0 taken 63% branch 1 taken 37% (fallthrough) 137036: 271: nn=n->next; 137036: 272: free(n); -: 273: } -: 274: } 24: 275: free(h->table); -: 276: } 24: 277: free(h); 24: 278:} -: 279: function hashtable_rehash_compute called 0 returned 0% blocks executed 0% #####: 280:void hashtable_rehash_compute(HashTable *h,CollisionFunc cf) { #####: 281: _hashtable_rehash(h,cf,h->length); call 0 never executed #####: 282:} -: 283: function hashtable_lookup called 1427054 returned 100% blocks executed 100% 1427054: 284:int hashtable_lookup(const HashTable *h,const HashKey_t key,HashVal_t *valp) { 1427054: 285: uint32_t hash=h->hashFunc(h,key)%h->length; call 0 returned 100% -: 286: HashNode *n; -: 287: int i; -: 288: 2104753: 289: for (n=h->table[hash];n;n=n->next) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 2074547: 290: i=h->cmpFunc(h,n->key,key); call 0 returned 100% 2074547: 291: if (!i) { branch 0 taken 65% (fallthrough) branch 1 taken 35% 1358536: 292: *valp=n->value; 1358536: 293: return 1; 716011: 294: } else if (i>0) { branch 0 taken 95% (fallthrough) branch 1 taken 5% -: 295: break; -: 296: } -: 297: } -: 298: return 0; -: 299:} -: 300: function hashtable_get_count called 679268 returned 100% blocks executed 100% 679268: 301:uint32_t hashtable_get_count(const HashTable *h) { 679268: 302: return h->count; -: 303:} -: 304: function hashtable_get_user_data called 4100384 returned 100% blocks executed 100% 4100384: 305:void *hashtable_get_user_data(const HashTable *h) { 4100384: 306: return h->userData; -: 307:} -: 308: function hashtable_set_user_data called 12 returned 100% blocks executed 100% 12: 309:void *hashtable_set_user_data(HashTable *h,void *data) { 12: 310: void *r=h->userData; 12: 311: h->userData=data; 12: 312: return r; -: 313:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Palette.c.gcov -: 0:Source:src/libImaging/Palette.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Palette.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Palette.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * imaging palette object -: 6: * -: 7: * history: -: 8: * 1996-05-05 fl Added to library -: 9: * 1996-05-27 fl Added colour mapping stuff -: 10: * 1997-05-12 fl Support RGBA palettes -: 11: * 2005-02-09 fl Removed grayscale entries from web palette -: 12: * -: 13: * Copyright (c) Secret Labs AB 1997-2005. All rights reserved. -: 14: * Copyright (c) Fredrik Lundh 1995-1997. -: 15: * -: 16: * See the README file for information on usage and redistribution. -: 17: */ -: 18: -: 19: -: 20:#include "Imaging.h" -: 21: -: 22:#include -: 23: -: 24: -: 25:ImagingPalette function ImagingPaletteNew called 3048 returned 100% blocks executed 77% 3048: 26:ImagingPaletteNew(const char* mode) -: 27:{ -: 28: /* Create a palette object */ -: 29: -: 30: int i; -: 31: ImagingPalette palette; -: 32: 3048: 33: if (strcmp(mode, "RGB") && strcmp(mode, "RGBA")) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 never executed branch 9 never executed #####: 34: return (ImagingPalette) ImagingError_ModeError(); call 0 never executed -: 35: } -: 36: 3048: 37: palette = calloc(1, sizeof(struct ImagingPaletteInstance)); 3048: 38: if (!palette) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 39: return (ImagingPalette) ImagingError_MemoryError(); call 0 never executed -: 40: } -: 41: 6096: 42: strncpy(palette->mode, mode, IMAGING_MODE_LENGTH-1); 3048: 43: palette->mode[IMAGING_MODE_LENGTH-1] = 0; -: 44: -: 45: /* Initialize to ramp */ 783336: 46: for (i = 0; i < 256; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 780288: 47: palette->palette[i*4+0] = 1560576: 48: palette->palette[i*4+1] = 780288: 49: palette->palette[i*4+2] = (UINT8) i; 780288: 50: palette->palette[i*4+3] = 255; /* opaque */ -: 51: } -: 52: -: 53: return palette; -: 54:} -: 55: -: 56:ImagingPalette function ImagingPaletteNewBrowser called 70 returned 100% blocks executed 100% 70: 57:ImagingPaletteNewBrowser(void) -: 58:{ -: 59: /* Create a standard "browser" palette object */ -: 60: -: 61: int i, r, g, b; -: 62: ImagingPalette palette; -: 63: 70: 64: palette = ImagingPaletteNew("RGB"); call 0 returned 100% 70: 65: if (!palette) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 66: return NULL; -: 67: } -: 68: -: 69: /* Blank out unused entries */ -: 70: /* FIXME: Add 10-level windows palette here? */ -: 71: 700: 72: for (i = 0; i < 10; i++) { branch 0 taken 91% branch 1 taken 9% (fallthrough) 700: 73: palette->palette[i*4+0] = 1400: 74: palette->palette[i*4+1] = 700: 75: palette->palette[i*4+2] = 0; -: 76: } -: 77: -: 78: /* Simple 6x6x6 colour cube */ -: 79: 420: 80: for (b = 0; b < 256; b += 51) { branch 0 taken 86% (fallthrough) branch 1 taken 14% 2520: 81: for (g = 0; g < 256; g += 51) { branch 0 taken 86% (fallthrough) branch 1 taken 14% 15120: 82: for (r = 0; r < 256; r += 51) { branch 0 taken 86% branch 1 taken 14% (fallthrough) 15120: 83: palette->palette[i*4+0] = r; 15120: 84: palette->palette[i*4+1] = g; 15120: 85: palette->palette[i*4+2] = b; 15120: 86: i++; -: 87: } -: 88: } -: 89: } -: 90: -: 91: /* Blank out unused entries */ -: 92: /* FIXME: add 30-level greyscale wedge here? */ -: 93: 2100: 94: for (; i < 256; i++) { branch 0 taken 97% branch 1 taken 3% (fallthrough) 2100: 95: palette->palette[i*4+0] = 4200: 96: palette->palette[i*4+1] = 2100: 97: palette->palette[i*4+2] = 0; -: 98: } -: 99: -: 100: return palette; -: 101:} -: 102: -: 103:ImagingPalette function ImagingPaletteDuplicate called 1421 returned 100% blocks executed 80% 1421: 104:ImagingPaletteDuplicate(ImagingPalette palette) -: 105:{ -: 106: /* Duplicate palette descriptor */ -: 107: -: 108: ImagingPalette new_palette; -: 109: 1421: 110: if (!palette) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 111: return NULL; -: 112: } -: 113: /* malloc check ok, small constant allocation */ 1421: 114: new_palette = malloc(sizeof(struct ImagingPaletteInstance)); 1421: 115: if (!new_palette) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 116: return (ImagingPalette) ImagingError_MemoryError(); call 0 never executed -: 117: } -: 118: 1421: 119: memcpy(new_palette, palette, sizeof(struct ImagingPaletteInstance)); -: 120: -: 121: /* Don't share the cache */ 1421: 122: new_palette->cache = NULL; -: 123: 1421: 124: return new_palette; -: 125:} -: 126: -: 127:void function ImagingPaletteDelete called 4596 returned 100% blocks executed 100% 4596: 128:ImagingPaletteDelete(ImagingPalette palette) -: 129:{ -: 130: /* Destroy palette object */ -: 131: 4596: 132: if (palette) { branch 0 taken 97% (fallthrough) branch 1 taken 3% 4469: 133: if (palette->cache) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 4: 134: free(palette->cache); -: 135: } 4469: 136: free(palette); -: 137: } 4596: 138:} -: 139: -: 140: -: 141:/* -------------------------------------------------------------------- */ -: 142:/* Colour mapping */ -: 143:/* -------------------------------------------------------------------- */ -: 144: -: 145:/* This code is used to map RGB triplets to palette indices, using -: 146: a palette index cache. */ -: 147: -: 148:/* -: 149: * This implementation is loosely based on the corresponding code in -: 150: * the IJG JPEG library by Thomas G. Lane. Original algorithms by -: 151: * Paul Heckbert and Spencer W. Thomas. -: 152: * -: 153: * The IJG JPEG library is copyright (C) 1991-1995, Thomas G. Lane. */ -: 154: -: 155:#define DIST(a, b, s) (a - b) * (a - b) * s -: 156: -: 157:/* Colour weights (no scaling, for now) */ -: 158:#define RSCALE 1 -: 159:#define GSCALE 1 -: 160:#define BSCALE 1 -: 161: -: 162:/* Calculated scaled distances */ -: 163:#define RDIST(a, b) DIST(a, b, RSCALE*RSCALE) -: 164:#define GDIST(a, b) DIST(a, b, GSCALE*GSCALE) -: 165:#define BDIST(a, b) DIST(a, b, BSCALE*BSCALE) -: 166: -: 167:/* Incremental steps */ -: 168:#define RSTEP (4 * RSCALE) -: 169:#define GSTEP (4 * GSCALE) -: 170:#define BSTEP (4 * BSCALE) -: 171: -: 172:#define BOX 8 -: 173: -: 174:#define BOXVOLUME BOX*BOX*BOX -: 175: -: 176:void function ImagingPaletteCacheUpdate called 6190 returned 100% blocks executed 100% 6190: 177:ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) -: 178:{ -: 179: int i, j; -: 180: unsigned int dmin[256], dmax; -: 181: int r0, g0, b0; -: 182: int r1, g1, b1; -: 183: int rc, gc, bc; -: 184: unsigned int d[BOXVOLUME]; -: 185: UINT8 c[BOXVOLUME]; -: 186: -: 187: /* Get box boundaries for the given (r,g,b)-triplet. Each box -: 188: covers eight cache slots (32 colour values, that is). */ -: 189: 6190: 190: r0 = r & 0xe0; r1 = r0 + 0x1f; rc = (r0 + r1) / 2; 6190: 191: g0 = g & 0xe0; g1 = g0 + 0x1f; gc = (g0 + g1) / 2; 6190: 192: b0 = b & 0xe0; b1 = b0 + 0x1f; bc = (b0 + b1) / 2; -: 193: -: 194: /* Step 1 -- Select relevant palette entries (after Heckbert) */ -: 195: -: 196: /* For each palette entry, calculate the min and max distances to -: 197: * any position in the box given by the colour we're looking for. */ -: 198: 6190: 199: dmax = (unsigned int) ~0; -: 200: 1590830: 201: for (i = 0; i < 256; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 202: -: 203: int r, g, b; -: 204: unsigned int tmin, tmax; -: 205: -: 206: /* Find min and max distances to any point in the box */ 1584640: 207: r = palette->palette[i*4+0]; 1584640: 208: tmin = (r < r0) ? RDIST(r, r1) : (r > r1) ? RDIST(r, r0) : 0; branch 0 taken 58% (fallthrough) branch 1 taken 42% branch 2 taken 73% (fallthrough) branch 3 taken 27% 1584640: 209: tmax = (r <= rc) ? RDIST(r, r1) : RDIST(r, r0); branch 0 taken 64% (fallthrough) branch 1 taken 36% -: 210: 1584640: 211: g = palette->palette[i*4+1]; 1584640: 212: tmin += (g < g0) ? GDIST(g, g1) : (g > g1) ? GDIST(g, g0) : 0; branch 0 taken 45% (fallthrough) branch 1 taken 55% branch 2 taken 78% (fallthrough) branch 3 taken 22% 1584640: 213: tmax += (g <= gc) ? GDIST(g, g1) : GDIST(g, g0); branch 0 taken 52% (fallthrough) branch 1 taken 48% -: 214: 1584640: 215: b = palette->palette[i*4+2]; 1584640: 216: tmin += (b < b0) ? BDIST(b, b1) : (b > b1) ? BDIST(b, b0) : 0; branch 0 taken 46% (fallthrough) branch 1 taken 54% branch 2 taken 78% (fallthrough) branch 3 taken 22% 1584640: 217: tmax += (b <= bc) ? BDIST(b, b1) : BDIST(b, b0); branch 0 taken 53% (fallthrough) branch 1 taken 47% -: 218: 1584640: 219: dmin[i] = tmin; 1584640: 220: if (tmax < dmax) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 125602: 221: dmax = tmax; /* keep the smallest max distance only */ -: 222: } -: 223: -: 224: } -: 225: -: 226: /* Step 2 -- Incrementally update cache slot (after Thomas) */ -: 227: -: 228: /* Find the box containing the nearest palette entry, and update -: 229: * all slots in that box. We only check boxes for which the min -: 230: * distance is less than or equal the smallest max distance */ -: 231: 3169280: 232: for (i = 0; i < BOXVOLUME; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3169280: 233: d[i] = (unsigned int) ~0; -: 234: } -: 235: 1584640: 236: for (i = 0; i < 256; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 237: 1584640: 238: if (dmin[i] <= dmax) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 239: -: 240: int rd, gd, bd; -: 241: int ri, gi, bi; -: 242: int rx, gx, bx; -: 243: 18473: 244: ri = (r0 - palette->palette[i*4+0]) * RSCALE; 18473: 245: gi = (g0 - palette->palette[i*4+1]) * GSCALE; 18473: 246: bi = (b0 - palette->palette[i*4+2]) * BSCALE; -: 247: 18473: 248: rd = ri*ri + gi*gi + bi*bi; -: 249: 18473: 250: ri = ri * (2 * RSTEP) + RSTEP * RSTEP; 18473: 251: gi = gi * (2 * GSTEP) + GSTEP * GSTEP; 18473: 252: bi = bi * (2 * BSTEP) + BSTEP * BSTEP; -: 253: 18473: 254: rx = ri; 166257: 255: for (r = j = 0; r < BOX; r++) { branch 0 taken 89% (fallthrough) branch 1 taken 11% -: 256: gd = rd; gx = gi; 1182272: 257: for (g = 0; g < BOX; g++) { branch 0 taken 89% (fallthrough) branch 1 taken 11% -: 258: bd = gd; bx = bi; 9458176: 259: for (b = 0; b < BOX; b++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 9458176: 260: if ((unsigned int) bd < d[j]) { branch 0 taken 60% (fallthrough) branch 1 taken 40% 5655490: 261: d[j] = bd; 5655490: 262: c[j] = (UINT8) i; -: 263: } 9458176: 264: bd += bx; 9458176: 265: bx += 2 * BSTEP * BSTEP; 9458176: 266: j++; -: 267: } 1182272: 268: gd += gx; 1182272: 269: gx += 2 * GSTEP * GSTEP; -: 270: } 147784: 271: rd += rx; 147784: 272: rx += 2 * RSTEP * RSTEP; -: 273: } -: 274: } -: 275: } -: 276: -: 277: /* Step 3 -- Update cache */ -: 278: -: 279: /* The c array now contains the closest match for each -: 280: * cache slot in the box. Update the cache. */ -: 281: -: 282: j = 0; 49520: 283: for (r = r0; r < r1; r+=4) { branch 0 taken 89% (fallthrough) branch 1 taken 11% 396160: 284: for (g = g0; g < g1; g+=4) { branch 0 taken 89% (fallthrough) branch 1 taken 11% 3169280: 285: for (b = b0; b < b1; b+=4) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 3169280: 286: ImagingPaletteCache(palette, r, g, b) = c[j++]; -: 287: } -: 288: } -: 289: } 6190: 290:} -: 291: -: 292: -: 293:int function ImagingPaletteCachePrepare called 75 returned 100% blocks executed 75% 75: 294:ImagingPaletteCachePrepare(ImagingPalette palette) -: 295:{ -: 296: /* Add a colour cache to a palette */ -: 297: -: 298: int i; 75: 299: int entries = 64*64*64; -: 300: 75: 301: if (palette->cache == NULL) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 302: -: 303: /* The cache is 512k. It might be a good idea to break it -: 304: up into a pointer array (e.g. an 8-bit image?) */ -: 305: -: 306: /* malloc check ok, small constant allocation */ 74: 307: palette->cache = (INT16*) malloc(entries * sizeof(INT16)); 74: 308: if (!palette->cache) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 309: (void) ImagingError_MemoryError(); call 0 never executed #####: 310: return -1; -: 311: } -: 312: -: 313: /* Mark all entries as empty */ 19398656: 314: for (i = 0; i < entries; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 19398656: 315: palette->cache[i] = 0x100; -: 316: } -: 317: -: 318: } -: 319: -: 320: return 0; -: 321:} -: 322: -: 323: -: 324:void function ImagingPaletteCacheDelete called 70 returned 100% blocks executed 100% 70: 325:ImagingPaletteCacheDelete(ImagingPalette palette) -: 326:{ -: 327: /* Release the colour cache, if any */ -: 328: 70: 329: if (palette && palette->cache) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 70: 330: free(palette->cache); 70: 331: palette->cache = NULL; -: 332: } 70: 333:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ColorLUT.c.gcov -: 0:Source:src/libImaging/ColorLUT.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/ColorLUT.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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/#usr#include#webp#decode.h.gcov -: 0:Source:/usr/include/webp/decode.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/_webp.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/_webp.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:// Copyright 2010 Google Inc. All Rights Reserved. -: 2:// -: 3:// Use of this source code is governed by a BSD-style license -: 4:// that can be found in the COPYING file in the root of the source -: 5:// tree. An additional intellectual property rights grant can be found -: 6:// in the file PATENTS. All contributing project authors may -: 7:// be found in the AUTHORS file in the root of the source tree. -: 8:// ----------------------------------------------------------------------------- -: 9:// -: 10:// Main decoding functions for WebP images. -: 11:// -: 12:// Author: Skal (pascal.massimino@gmail.com) -: 13: -: 14:#ifndef WEBP_WEBP_DECODE_H_ -: 15:#define WEBP_WEBP_DECODE_H_ -: 16: -: 17:#include "./types.h" -: 18: -: 19:#ifdef __cplusplus -: 20:extern "C" { -: 21:#endif -: 22: -: 23:#define WEBP_DECODER_ABI_VERSION 0x0209 // MAJOR(8b) + MINOR(8b) -: 24: -: 25:// Note: forward declaring enumerations is not allowed in (strict) C and C++, -: 26:// the types are left here for reference. -: 27:// typedef enum VP8StatusCode VP8StatusCode; -: 28:// typedef enum WEBP_CSP_MODE WEBP_CSP_MODE; -: 29:typedef struct WebPRGBABuffer WebPRGBABuffer; -: 30:typedef struct WebPYUVABuffer WebPYUVABuffer; -: 31:typedef struct WebPDecBuffer WebPDecBuffer; -: 32:typedef struct WebPIDecoder WebPIDecoder; -: 33:typedef struct WebPBitstreamFeatures WebPBitstreamFeatures; -: 34:typedef struct WebPDecoderOptions WebPDecoderOptions; -: 35:typedef struct WebPDecoderConfig WebPDecoderConfig; -: 36: -: 37:// Return the decoder's version number, packed in hexadecimal using 8bits for -: 38:// each of major/minor/revision. E.g: v2.5.7 is 0x020507. -: 39:WEBP_EXTERN int WebPGetDecoderVersion(void); -: 40: -: 41:// Retrieve basic header information: width, height. -: 42:// This function will also validate the header, returning true on success, -: 43:// false otherwise. '*width' and '*height' are only valid on successful return. -: 44:// Pointers 'width' and 'height' can be passed NULL if deemed irrelevant. -: 45:// Note: The following chunk sequences (before the raw VP8/VP8L data) are -: 46:// considered valid by this function: -: 47:// RIFF + VP8(L) -: 48:// RIFF + VP8X + (optional chunks) + VP8(L) -: 49:// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose. -: 50:// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose. -: 51:WEBP_EXTERN int WebPGetInfo(const uint8_t* data, size_t data_size, -: 52: int* width, int* height); -: 53: -: 54:// Decodes WebP images pointed to by 'data' and returns RGBA samples, along -: 55:// with the dimensions in *width and *height. The ordering of samples in -: 56:// memory is R, G, B, A, R, G, B, A... in scan order (endian-independent). -: 57:// The returned pointer should be deleted calling WebPFree(). -: 58:// Returns NULL in case of error. -: 59:WEBP_EXTERN uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size, -: 60: int* width, int* height); -: 61: -: 62:// Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data. -: 63:WEBP_EXTERN uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size, -: 64: int* width, int* height); -: 65: -: 66:// Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data. -: 67:WEBP_EXTERN uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size, -: 68: int* width, int* height); -: 69: -: 70:// Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data. -: 71:// If the bitstream contains transparency, it is ignored. -: 72:WEBP_EXTERN uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, -: 73: int* width, int* height); -: 74: -: 75:// Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data. -: 76:WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size, -: 77: int* width, int* height); -: 78: -: 79: -: 80:// Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer -: 81:// returned is the Y samples buffer. Upon return, *u and *v will point to -: 82:// the U and V chroma data. These U and V buffers need NOT be passed to -: 83:// WebPFree(), unlike the returned Y luma one. The dimension of the U and V -: 84:// planes are both (*width + 1) / 2 and (*height + 1)/ 2. -: 85:// Upon return, the Y buffer has a stride returned as '*stride', while U and V -: 86:// have a common stride returned as '*uv_stride'. -: 87:// Return NULL in case of error. -: 88:// (*) Also named Y'CbCr. See: http://en.wikipedia.org/wiki/YCbCr -: 89:WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size, -: 90: int* width, int* height, -: 91: uint8_t** u, uint8_t** v, -: 92: int* stride, int* uv_stride); -: 93: -: 94:// These five functions are variants of the above ones, that decode the image -: 95:// directly into a pre-allocated buffer 'output_buffer'. The maximum storage -: 96:// available in this buffer is indicated by 'output_buffer_size'. If this -: 97:// storage is not sufficient (or an error occurred), NULL is returned. -: 98:// Otherwise, output_buffer is returned, for convenience. -: 99:// The parameter 'output_stride' specifies the distance (in bytes) -: 100:// between scanlines. Hence, output_buffer_size is expected to be at least -: 101:// output_stride x picture-height. -: 102:WEBP_EXTERN uint8_t* WebPDecodeRGBAInto( -: 103: const uint8_t* data, size_t data_size, -: 104: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 105:WEBP_EXTERN uint8_t* WebPDecodeARGBInto( -: 106: const uint8_t* data, size_t data_size, -: 107: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 108:WEBP_EXTERN uint8_t* WebPDecodeBGRAInto( -: 109: const uint8_t* data, size_t data_size, -: 110: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 111: -: 112:// RGB and BGR variants. Here too the transparency information, if present, -: 113:// will be dropped and ignored. -: 114:WEBP_EXTERN uint8_t* WebPDecodeRGBInto( -: 115: const uint8_t* data, size_t data_size, -: 116: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 117:WEBP_EXTERN uint8_t* WebPDecodeBGRInto( -: 118: const uint8_t* data, size_t data_size, -: 119: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 120: -: 121:// WebPDecodeYUVInto() is a variant of WebPDecodeYUV() that operates directly -: 122:// into pre-allocated luma/chroma plane buffers. This function requires the -: 123:// strides to be passed: one for the luma plane and one for each of the -: 124:// chroma ones. The size of each plane buffer is passed as 'luma_size', -: 125:// 'u_size' and 'v_size' respectively. -: 126:// Pointer to the luma plane ('*luma') is returned or NULL if an error occurred -: 127:// during decoding (or because some buffers were found to be too small). -: 128:WEBP_EXTERN uint8_t* WebPDecodeYUVInto( -: 129: const uint8_t* data, size_t data_size, -: 130: uint8_t* luma, size_t luma_size, int luma_stride, -: 131: uint8_t* u, size_t u_size, int u_stride, -: 132: uint8_t* v, size_t v_size, int v_stride); -: 133: -: 134://------------------------------------------------------------------------------ -: 135:// Output colorspaces and buffer -: 136: -: 137:// Colorspaces -: 138:// Note: the naming describes the byte-ordering of packed samples in memory. -: 139:// For instance, MODE_BGRA relates to samples ordered as B,G,R,A,B,G,R,A,... -: 140:// Non-capital names (e.g.:MODE_Argb) relates to pre-multiplied RGB channels. -: 141:// RGBA-4444 and RGB-565 colorspaces are represented by following byte-order: -: 142:// RGBA-4444: [r3 r2 r1 r0 g3 g2 g1 g0], [b3 b2 b1 b0 a3 a2 a1 a0], ... -: 143:// RGB-565: [r4 r3 r2 r1 r0 g5 g4 g3], [g2 g1 g0 b4 b3 b2 b1 b0], ... -: 144:// In the case WEBP_SWAP_16BITS_CSP is defined, the bytes are swapped for -: 145:// these two modes: -: 146:// RGBA-4444: [b3 b2 b1 b0 a3 a2 a1 a0], [r3 r2 r1 r0 g3 g2 g1 g0], ... -: 147:// RGB-565: [g2 g1 g0 b4 b3 b2 b1 b0], [r4 r3 r2 r1 r0 g5 g4 g3], ... -: 148: -: 149:typedef enum WEBP_CSP_MODE { -: 150: MODE_RGB = 0, MODE_RGBA = 1, -: 151: MODE_BGR = 2, MODE_BGRA = 3, -: 152: MODE_ARGB = 4, MODE_RGBA_4444 = 5, -: 153: MODE_RGB_565 = 6, -: 154: // RGB-premultiplied transparent modes (alpha value is preserved) -: 155: MODE_rgbA = 7, -: 156: MODE_bgrA = 8, -: 157: MODE_Argb = 9, -: 158: MODE_rgbA_4444 = 10, -: 159: // YUV modes must come after RGB ones. -: 160: MODE_YUV = 11, MODE_YUVA = 12, // yuv 4:2:0 -: 161: MODE_LAST = 13 -: 162:} WEBP_CSP_MODE; -: 163: -: 164:// Some useful macros: -: 165:static WEBP_INLINE int WebPIsPremultipliedMode(WEBP_CSP_MODE mode) { -: 166: return (mode == MODE_rgbA || mode == MODE_bgrA || mode == MODE_Argb || -: 167: mode == MODE_rgbA_4444); -: 168:} -: 169: -: 170:static WEBP_INLINE int WebPIsAlphaMode(WEBP_CSP_MODE mode) { -: 171: return (mode == MODE_RGBA || mode == MODE_BGRA || mode == MODE_ARGB || -: 172: mode == MODE_RGBA_4444 || mode == MODE_YUVA || -: 173: WebPIsPremultipliedMode(mode)); -: 174:} -: 175: -: 176:static WEBP_INLINE int WebPIsRGBMode(WEBP_CSP_MODE mode) { -: 177: return (mode < MODE_YUV); -: 178:} -: 179: -: 180://------------------------------------------------------------------------------ -: 181:// WebPDecBuffer: Generic structure for describing the output sample buffer. -: 182: -: 183:struct WebPRGBABuffer { // view as RGBA -: 184: uint8_t* rgba; // pointer to RGBA samples -: 185: int stride; // stride in bytes from one scanline to the next. -: 186: size_t size; // total size of the *rgba buffer. -: 187:}; -: 188: -: 189:struct WebPYUVABuffer { // view as YUVA -: 190: uint8_t* y, *u, *v, *a; // pointer to luma, chroma U/V, alpha samples -: 191: int y_stride; // luma stride -: 192: int u_stride, v_stride; // chroma strides -: 193: int a_stride; // alpha stride -: 194: size_t y_size; // luma plane size -: 195: size_t u_size, v_size; // chroma planes size -: 196: size_t a_size; // alpha-plane size -: 197:}; -: 198: -: 199:// Output buffer -: 200:struct WebPDecBuffer { -: 201: WEBP_CSP_MODE colorspace; // Colorspace. -: 202: int width, height; // Dimensions. -: 203: int is_external_memory; // If non-zero, 'internal_memory' pointer is not -: 204: // used. If value is '2' or more, the external -: 205: // memory is considered 'slow' and multiple -: 206: // read/write will be avoided. -: 207: union { -: 208: WebPRGBABuffer RGBA; -: 209: WebPYUVABuffer YUVA; -: 210: } u; // Nameless union of buffer parameters. -: 211: uint32_t pad[4]; // padding for later use -: 212: -: 213: uint8_t* private_memory; // Internally allocated memory (only when -: 214: // is_external_memory is 0). Should not be used -: 215: // externally, but accessed via the buffer union. -: 216:}; -: 217: -: 218:// Internal, version-checked, entry point -: 219:WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int); -: 220: -: 221:// Initialize the structure as empty. Must be called before any other use. -: 222:// Returns false in case of version mismatch -: 223:static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) { -: 224: return WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION); -: 225:} -: 226: -: 227:// Free any memory associated with the buffer. Must always be called last. -: 228:// Note: doesn't free the 'buffer' structure itself. -: 229:WEBP_EXTERN void WebPFreeDecBuffer(WebPDecBuffer* buffer); -: 230: -: 231://------------------------------------------------------------------------------ -: 232:// Enumeration of the status codes -: 233: -: 234:typedef enum VP8StatusCode { -: 235: VP8_STATUS_OK = 0, -: 236: VP8_STATUS_OUT_OF_MEMORY, -: 237: VP8_STATUS_INVALID_PARAM, -: 238: VP8_STATUS_BITSTREAM_ERROR, -: 239: VP8_STATUS_UNSUPPORTED_FEATURE, -: 240: VP8_STATUS_SUSPENDED, -: 241: VP8_STATUS_USER_ABORT, -: 242: VP8_STATUS_NOT_ENOUGH_DATA -: 243:} VP8StatusCode; -: 244: -: 245://------------------------------------------------------------------------------ -: 246:// Incremental decoding -: 247:// -: 248:// This API allows streamlined decoding of partial data. -: 249:// Picture can be incrementally decoded as data become available thanks to the -: 250:// WebPIDecoder object. This object can be left in a SUSPENDED state if the -: 251:// picture is only partially decoded, pending additional input. -: 252:// Code example: -: 253:// -: 254:// WebPInitDecBuffer(&output_buffer); -: 255:// output_buffer.colorspace = mode; -: 256:// ... -: 257:// WebPIDecoder* idec = WebPINewDecoder(&output_buffer); -: 258:// while (additional_data_is_available) { -: 259:// // ... (get additional data in some new_data[] buffer) -: 260:// status = WebPIAppend(idec, new_data, new_data_size); -: 261:// if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) { -: 262:// break; // an error occurred. -: 263:// } -: 264:// -: 265:// // The above call decodes the current available buffer. -: 266:// // Part of the image can now be refreshed by calling -: 267:// // WebPIDecGetRGB()/WebPIDecGetYUVA() etc. -: 268:// } -: 269:// WebPIDelete(idec); -: 270: -: 271:// Creates a new incremental decoder with the supplied buffer parameter. -: 272:// This output_buffer can be passed NULL, in which case a default output buffer -: 273:// is used (with MODE_RGB). Otherwise, an internal reference to 'output_buffer' -: 274:// is kept, which means that the lifespan of 'output_buffer' must be larger than -: 275:// that of the returned WebPIDecoder object. -: 276:// The supplied 'output_buffer' content MUST NOT be changed between calls to -: 277:// WebPIAppend() or WebPIUpdate() unless 'output_buffer.is_external_memory' is -: 278:// not set to 0. In such a case, it is allowed to modify the pointers, size and -: 279:// stride of output_buffer.u.RGBA or output_buffer.u.YUVA, provided they remain -: 280:// within valid bounds. -: 281:// All other fields of WebPDecBuffer MUST remain constant between calls. -: 282:// Returns NULL if the allocation failed. -: 283:WEBP_EXTERN WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer); -: 284: -: 285:// This function allocates and initializes an incremental-decoder object, which -: 286:// will output the RGB/A samples specified by 'csp' into a preallocated -: 287:// buffer 'output_buffer'. The size of this buffer is at least -: 288:// 'output_buffer_size' and the stride (distance in bytes between two scanlines) -: 289:// is specified by 'output_stride'. -: 290:// Additionally, output_buffer can be passed NULL in which case the output -: 291:// buffer will be allocated automatically when the decoding starts. The -: 292:// colorspace 'csp' is taken into account for allocating this buffer. All other -: 293:// parameters are ignored. -: 294:// Returns NULL if the allocation failed, or if some parameters are invalid. -: 295:WEBP_EXTERN WebPIDecoder* WebPINewRGB( -: 296: WEBP_CSP_MODE csp, -: 297: uint8_t* output_buffer, size_t output_buffer_size, int output_stride); -: 298: -: 299:// This function allocates and initializes an incremental-decoder object, which -: 300:// will output the raw luma/chroma samples into a preallocated planes if -: 301:// supplied. The luma plane is specified by its pointer 'luma', its size -: 302:// 'luma_size' and its stride 'luma_stride'. Similarly, the chroma-u plane -: 303:// is specified by the 'u', 'u_size' and 'u_stride' parameters, and the chroma-v -: 304:// plane by 'v' and 'v_size'. And same for the alpha-plane. The 'a' pointer -: 305:// can be pass NULL in case one is not interested in the transparency plane. -: 306:// Conversely, 'luma' can be passed NULL if no preallocated planes are supplied. -: 307:// In this case, the output buffer will be automatically allocated (using -: 308:// MODE_YUVA) when decoding starts. All parameters are then ignored. -: 309:// Returns NULL if the allocation failed or if a parameter is invalid. -: 310:WEBP_EXTERN WebPIDecoder* WebPINewYUVA( -: 311: uint8_t* luma, size_t luma_size, int luma_stride, -: 312: uint8_t* u, size_t u_size, int u_stride, -: 313: uint8_t* v, size_t v_size, int v_stride, -: 314: uint8_t* a, size_t a_size, int a_stride); -: 315: -: 316:// Deprecated version of the above, without the alpha plane. -: 317:// Kept for backward compatibility. -: 318:WEBP_EXTERN WebPIDecoder* WebPINewYUV( -: 319: uint8_t* luma, size_t luma_size, int luma_stride, -: 320: uint8_t* u, size_t u_size, int u_stride, -: 321: uint8_t* v, size_t v_size, int v_stride); -: 322: -: 323:// Deletes the WebPIDecoder object and associated memory. Must always be called -: 324:// if WebPINewDecoder, WebPINewRGB or WebPINewYUV succeeded. -: 325:WEBP_EXTERN void WebPIDelete(WebPIDecoder* idec); -: 326: -: 327:// Copies and decodes the next available data. Returns VP8_STATUS_OK when -: 328:// the image is successfully decoded. Returns VP8_STATUS_SUSPENDED when more -: 329:// data is expected. Returns error in other cases. -: 330:WEBP_EXTERN VP8StatusCode WebPIAppend( -: 331: WebPIDecoder* idec, const uint8_t* data, size_t data_size); -: 332: -: 333:// A variant of the above function to be used when data buffer contains -: 334:// partial data from the beginning. In this case data buffer is not copied -: 335:// to the internal memory. -: 336:// Note that the value of the 'data' pointer can change between calls to -: 337:// WebPIUpdate, for instance when the data buffer is resized to fit larger data. -: 338:WEBP_EXTERN VP8StatusCode WebPIUpdate( -: 339: WebPIDecoder* idec, const uint8_t* data, size_t data_size); -: 340: -: 341:// Returns the RGB/A image decoded so far. Returns NULL if output params -: 342:// are not initialized yet. The RGB/A output type corresponds to the colorspace -: 343:// specified during call to WebPINewDecoder() or WebPINewRGB(). -: 344:// *last_y is the index of last decoded row in raster scan order. Some pointers -: 345:// (*last_y, *width etc.) can be NULL if corresponding information is not -: 346:// needed. The values in these pointers are only valid on successful (non-NULL) -: 347:// return. -: 348:WEBP_EXTERN uint8_t* WebPIDecGetRGB( -: 349: const WebPIDecoder* idec, int* last_y, -: 350: int* width, int* height, int* stride); -: 351: -: 352:// Same as above function to get a YUVA image. Returns pointer to the luma -: 353:// plane or NULL in case of error. If there is no alpha information -: 354:// the alpha pointer '*a' will be returned NULL. -: 355:WEBP_EXTERN uint8_t* WebPIDecGetYUVA( -: 356: const WebPIDecoder* idec, int* last_y, -: 357: uint8_t** u, uint8_t** v, uint8_t** a, -: 358: int* width, int* height, int* stride, int* uv_stride, int* a_stride); -: 359: -: 360:// Deprecated alpha-less version of WebPIDecGetYUVA(): it will ignore the -: 361:// alpha information (if present). Kept for backward compatibility. -: 362:static WEBP_INLINE uint8_t* WebPIDecGetYUV( -: 363: const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v, -: 364: int* width, int* height, int* stride, int* uv_stride) { -: 365: return WebPIDecGetYUVA(idec, last_y, u, v, NULL, width, height, -: 366: stride, uv_stride, NULL); -: 367:} -: 368: -: 369:// Generic call to retrieve information about the displayable area. -: 370:// If non NULL, the left/right/width/height pointers are filled with the visible -: 371:// rectangular area so far. -: 372:// Returns NULL in case the incremental decoder object is in an invalid state. -: 373:// Otherwise returns the pointer to the internal representation. This structure -: 374:// is read-only, tied to WebPIDecoder's lifespan and should not be modified. -: 375:WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea( -: 376: const WebPIDecoder* idec, int* left, int* top, int* width, int* height); -: 377: -: 378://------------------------------------------------------------------------------ -: 379:// Advanced decoding parametrization -: 380:// -: 381:// Code sample for using the advanced decoding API -: 382:/* -: 383: // A) Init a configuration object -: 384: WebPDecoderConfig config; -: 385: CHECK(WebPInitDecoderConfig(&config)); -: 386: -: 387: // B) optional: retrieve the bitstream's features. -: 388: CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK); -: 389: -: 390: // C) Adjust 'config', if needed -: 391: config.no_fancy_upsampling = 1; -: 392: config.output.colorspace = MODE_BGRA; -: 393: // etc. -: 394: -: 395: // Note that you can also make config.output point to an externally -: 396: // supplied memory buffer, provided it's big enough to store the decoded -: 397: // picture. Otherwise, config.output will just be used to allocate memory -: 398: // and store the decoded picture. -: 399: -: 400: // D) Decode! -: 401: CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK); -: 402: -: 403: // E) Decoded image is now in config.output (and config.output.u.RGBA) -: 404: -: 405: // F) Reclaim memory allocated in config's object. It's safe to call -: 406: // this function even if the memory is external and wasn't allocated -: 407: // by WebPDecode(). -: 408: WebPFreeDecBuffer(&config.output); -: 409:*/ -: 410: -: 411:// Features gathered from the bitstream -: 412:struct WebPBitstreamFeatures { -: 413: int width; // Width in pixels, as read from the bitstream. -: 414: int height; // Height in pixels, as read from the bitstream. -: 415: int has_alpha; // True if the bitstream contains an alpha channel. -: 416: int has_animation; // True if the bitstream is an animation. -: 417: int format; // 0 = undefined (/mixed), 1 = lossy, 2 = lossless -: 418: -: 419: uint32_t pad[5]; // padding for later use -: 420:}; -: 421: -: 422:// Internal, version-checked, entry point -: 423:WEBP_EXTERN VP8StatusCode WebPGetFeaturesInternal( -: 424: const uint8_t*, size_t, WebPBitstreamFeatures*, int); -: 425: -: 426:// Retrieve features from the bitstream. The *features structure is filled -: 427:// with information gathered from the bitstream. -: 428:// Returns VP8_STATUS_OK when the features are successfully retrieved. Returns -: 429:// VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the -: 430:// features from headers. Returns error in other cases. -: 431:// Note: The following chunk sequences (before the raw VP8/VP8L data) are -: 432:// considered valid by this function: -: 433:// RIFF + VP8(L) -: 434:// RIFF + VP8X + (optional chunks) + VP8(L) -: 435:// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose. -: 436:// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose. -: 437:static WEBP_INLINE VP8StatusCode WebPGetFeatures( -: 438: const uint8_t* data, size_t data_size, -: 439: WebPBitstreamFeatures* features) { 160: 440: return WebPGetFeaturesInternal(data, data_size, features, call 0 never executed call 1 returned 100% -: 441: WEBP_DECODER_ABI_VERSION); -: 442:} -: 443: -: 444:// Decoding options -: 445:struct WebPDecoderOptions { -: 446: int bypass_filtering; // if true, skip the in-loop filtering -: 447: int no_fancy_upsampling; // if true, use faster pointwise upsampler -: 448: int use_cropping; // if true, cropping is applied _first_ -: 449: int crop_left, crop_top; // top-left position for cropping. -: 450: // Will be snapped to even values. -: 451: int crop_width, crop_height; // dimension of the cropping area -: 452: int use_scaling; // if true, scaling is applied _afterward_ -: 453: int scaled_width, scaled_height; // final resolution -: 454: int use_threads; // if true, use multi-threaded decoding -: 455: int dithering_strength; // dithering strength (0=Off, 100=full) -: 456: int flip; // flip output vertically -: 457: int alpha_dithering_strength; // alpha dithering strength in [0..100] -: 458: -: 459: uint32_t pad[5]; // padding for later use -: 460:}; -: 461: -: 462:// Main object storing the configuration for advanced decoding. -: 463:struct WebPDecoderConfig { -: 464: WebPBitstreamFeatures input; // Immutable bitstream features (optional) -: 465: WebPDecBuffer output; // Output buffer (can point to external mem) -: 466: WebPDecoderOptions options; // Decoding options -: 467:}; -: 468: -: 469:// Internal, version-checked, entry point -: 470:WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*, int); -: 471: -: 472:// Initialize the configuration as empty. This function must always be -: 473:// called first, unless WebPGetFeatures() is to be called. -: 474:// Returns false in case of mismatched version. -: 475:static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) { #####: 476: return WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION); call 0 never executed -: 477:} -: 478: -: 479:// Instantiate a new incremental decoder object with the requested -: 480:// configuration. The bitstream can be passed using 'data' and 'data_size' -: 481:// parameter, in which case the features will be parsed and stored into -: 482:// config->input. Otherwise, 'data' can be NULL and no parsing will occur. -: 483:// Note that 'config' can be NULL too, in which case a default configuration -: 484:// is used. If 'config' is not NULL, it must outlive the WebPIDecoder object -: 485:// as some references to its fields will be used. No internal copy of 'config' -: 486:// is made. -: 487:// The return WebPIDecoder object must always be deleted calling WebPIDelete(). -: 488:// Returns NULL in case of error (and config->status will then reflect -: 489:// the error condition, if available). -: 490:WEBP_EXTERN WebPIDecoder* WebPIDecode(const uint8_t* data, size_t data_size, -: 491: WebPDecoderConfig* config); -: 492: -: 493:// Non-incremental version. This version decodes the full data at once, taking -: 494:// 'config' into account. Returns decoding status (which should be VP8_STATUS_OK -: 495:// if the decoding was successful). Note that 'config' cannot be NULL. -: 496:WEBP_EXTERN VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size, -: 497: WebPDecoderConfig* config); -: 498: -: 499:#ifdef __cplusplus -: 500:} // extern "C" -: 501:#endif -: 502: -: 503:#endif // WEBP_WEBP_DECODE_H_ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ModeFilter.c.gcov -: 0:Source:src/libImaging/ModeFilter.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/ModeFilter.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/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#PcxEncode.c.gcov -: 0:Source:src/libImaging/PcxEncode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/PcxEncode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/PcxEncode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * encoder for PCX data -: 6: * -: 7: * history: -: 8: * 99-02-07 fl created -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1999. -: 11: * Copyright (c) Secret Labs AB 1999. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19:enum { INIT, FETCH, ENCODE }; -: 20: -: 21:/* we're reusing "ystep" to store the last value */ -: 22:#define LAST ystep -: 23: -: 24:int function ImagingPcxEncode called 40 returned 100% blocks executed 96% 40: 25:ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes) -: 26:{ -: 27: UINT8* ptr; -: 28: int this; 40: 29: int bytes_per_line = 0; 40: 30: int padding = 0; 40: 31: int stride = 0; 40: 32: int bpp = 0; 40: 33: int planes = 1; -: 34: int i; -: 35: 40: 36: ptr = buf; -: 37: 40: 38: if (!state->state) { branch 0 taken 43% (fallthrough) branch 1 taken 58% -: 39: /* sanity check */ 17: 40: if (state->xsize <= 0 || state->ysize <= 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 41: state->errcode = IMAGING_CODEC_END; #####: 42: return 0; -: 43: } 17: 44: state->state = FETCH; -: 45: } -: 46: 40: 47: bpp = state->bits; 40: 48: if (state->bits == 24){ branch 0 taken 30% (fallthrough) branch 1 taken 70% 12: 49: planes = 3; 12: 50: bpp = 8; -: 51: } -: 52: 40: 53: bytes_per_line = (state->xsize*bpp + 7) / 8; -: 54: /* The stride here needs to be kept in sync with the version in -: 55: PcxImagePlugin.py. If it's not, the header and the body of the -: 56: image will be out of sync and bad things will happen on decode. -: 57: */ 40: 58: stride = bytes_per_line + (bytes_per_line % 2); -: 59: 40: 60: padding = stride - bytes_per_line; -: 61: -: 62: -: 63: for (;;) { -: 64: 3883: 65: switch (state->state) { branch 0 taken 0% branch 1 taken 99% branch 2 taken 1% -: 66: case FETCH: -: 67: -: 68: /* get a line of data */ 3860: 69: if (state->y >= state->ysize) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 17: 70: state->errcode = IMAGING_CODEC_END; 17: 71: return ptr - buf; -: 72: } -: 73: 7686: 74: state->shuffle(state->buffer, call 0 returned 100% 3843: 75: (UINT8*) im->image[state->y + state->yoff] + 3843: 76: state->xoff * im->pixelsize, state->xsize); -: 77: 3843: 78: state->y += 1; -: 79: 3843: 80: state->count = 1; 3843: 81: state->LAST = state->buffer[0]; -: 82: 3843: 83: state->x = 1; -: 84: 3843: 85: state->state = ENCODE; -: 86: /* fall through */ -: 87: -: 88: case ENCODE: -: 89: /* compress this line */ -: 90: -: 91: /* when we arrive here, "count" contains the number of -: 92: bytes having the value of "LAST" that we've already -: 93: seen */ -: 94: do { -: 95: /* If we're encoding an odd width file, and we've -: 96: got more than one plane, we need to pad each -: 97: color row with padding bytes at the end. Since -: 98: The pixels are stored RRRRRGGGGGBBBBB, so we need -: 99: to have the padding be RRRRRPGGGGGPBBBBBP. Hence -: 100: the double loop -: 101: */ 2430497: 102: while (state->x % bytes_per_line) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 103: 2425372: 104: if (state->count == 63) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 105: /* this run is full; flush it */ 239: 106: if (bytes < 2) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 107: return ptr - buf; -: 108: } 238: 109: ptr[0] = 0xff; 238: 110: ptr[1] = state->LAST; 238: 111: ptr += 2; 238: 112: bytes -= 2; -: 113: 238: 114: state->count = 0; -: 115: } -: 116: 2425371: 117: this = state->buffer[state->x]; -: 118: 2425371: 119: if (this == state->LAST) { branch 0 taken 63% (fallthrough) branch 1 taken 37% -: 120: /* extend the current run */ 1517079: 121: state->x += 1; 1517079: 122: state->count += 1; -: 123: -: 124: } else { -: 125: /* start a new run */ 908292: 126: if (state->count == 1 && (state->LAST < 0xc0)) { branch 0 taken 67% (fallthrough) branch 1 taken 33% branch 2 taken 87% (fallthrough) branch 3 taken 13% 531522: 127: if (bytes < 1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 5: 128: return ptr - buf; -: 129: } 531517: 130: ptr[0] = state->LAST; 531517: 131: ptr += 1; 531517: 132: bytes -= 1; -: 133: } else { 376770: 134: if (state->count > 0) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 376668: 135: if (bytes < 2) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 13: 136: return ptr - buf; -: 137: } 376655: 138: ptr[0] = 0xc0 | state->count; 376655: 139: ptr[1] = state->LAST; 376655: 140: ptr += 2; 376655: 141: bytes -= 2; -: 142: } -: 143: } -: 144: 908274: 145: state->LAST = this; 908274: 146: state->count = 1; -: 147: 908274: 148: state->x += 1; -: 149: } -: 150: } -: 151: -: 152: /* end of line; flush the current run */ 5125: 153: if (state->count == 1 && (state->LAST < 0xc0)) { branch 0 taken 26% (fallthrough) branch 1 taken 74% branch 2 taken 67% (fallthrough) branch 3 taken 33% 907: 154: if (bytes < 1 + padding) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2: 155: return ptr - buf; -: 156: } 905: 157: ptr[0] = state->LAST; 905: 158: ptr += 1; 905: 159: bytes -= 1; -: 160: } else { 4218: 161: if (state->count > 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 4218: 162: if (bytes < 2 + padding) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 2: 163: return ptr - buf; -: 164: } 4216: 165: ptr[0] = 0xc0 | state->count; 4216: 166: ptr[1] = state->LAST; 4216: 167: ptr += 2; 4216: 168: bytes -= 2; -: 169: } -: 170: } -: 171: /* add the padding */ 2816: 172: for (i = 0; i < padding; i++) { branch 0 taken 35% branch 1 taken 65% (fallthrough) 2816: 173: ptr[0] = 0; 2816: 174: ptr += 1; 2816: 175: bytes -= 1; -: 176: } -: 177: /* reset for the next color plane. */ 5121: 178: if (state->x < planes * bytes_per_line) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 1278: 179: state->count = 1; 1278: 180: state->LAST = state->buffer[state->x]; 1278: 181: state->x += 1; -: 182: } 5121: 183: } while (state->x < planes * bytes_per_line); branch 0 taken 25% branch 1 taken 75% (fallthrough) -: 184: -: 185: /* read next line */ 3843: 186: state->state = FETCH; 3843: 187: break; -: 188: } -: 189: } -: 190:} -: 191: <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#XbmDecode.c.gcov -: 0:Source:src/libImaging/XbmDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/XbmDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/XbmDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for XBM hex image data -: 6: * -: 7: * history: -: 8: * 96-04-13 fl Created -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1996. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19:#define HEX(v) ((v >= '0' && v <= '9') ? v - '0' :\ -: 20: (v >= 'a' && v <= 'f') ? v - 'a' + 10 :\ -: 21: (v >= 'A' && v <= 'F') ? v - 'A' + 10 : 0) -: 22: -: 23:int function ImagingXbmDecode called 3 returned 100% blocks executed 80% 3: 24:ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 25:{ -: 26: enum { BYTE = 1, SKIP }; -: 27: -: 28: UINT8* ptr; -: 29: 3: 30: if (!state->state) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 3: 31: state->state = SKIP; -: 32: } -: 33: -: 34: ptr = buf; -: 35: -: 36: for (;;) { -: 37: 127176: 38: if (state->state == SKIP) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 39: -: 40: /* Skip forward until next 'x' */ -: 41: 390136: 42: while (bytes > 0) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 390136: 43: if (*ptr == 'x') { branch 0 taken 67% (fallthrough) branch 1 taken 33% -: 44: break; -: 45: } 262960: 46: ptr++; 262960: 47: bytes--; -: 48: } -: 49: 127176: 50: if (bytes == 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 51: return ptr - buf; -: 52: } -: 53: 127176: 54: state->state = BYTE; -: 55: -: 56: } -: 57: 127176: 58: if (bytes < 3) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 59: return ptr - buf; -: 60: } -: 61: 127176: 62: state->buffer[state->x] = (HEX(ptr[1])<<4) + HEX(ptr[2]); branch 0 taken 74% (fallthrough) branch 1 taken 26% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 never executed branch 5 never executed branch 6 taken 74% (fallthrough) branch 7 taken 26% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 never executed branch 11 never executed -: 63: 127176: 64: if (++state->x >= state->bytes) { branch 0 taken 1% (fallthrough) branch 1 taken 99% -: 65: -: 66: /* Got a full line, unpack it */ 1160: 67: state->shuffle((UINT8*) im->image[state->y], state->buffer, call 0 returned 100% -: 68: state->xsize); -: 69: 1160: 70: state->x = 0; -: 71: 1160: 72: if (++state->y >= state->ysize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 73: /* End of file (errcode = 0) */ -: 74: return -1; -: 75: } -: 76: } -: 77: 127173: 78: ptr += 3; 127173: 79: bytes -= 3; -: 80: 127173: 81: state->state = SKIP; -: 82: 127173: 83: } -: 84: -: 85:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#UnpackYCC.c.gcov -: 0:Source:src/libImaging/UnpackYCC.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/UnpackYCC.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/UnpackYCC.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * code to convert and unpack PhotoYCC data -: 6: * -: 7: * history: -: 8: * 97-01-25 fl Moved from PcdDecode.c -: 9: * -: 10: * Copyright (c) Fredrik Lundh 1996-97. -: 11: * Copyright (c) Secret Labs AB 1997. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16: -: 17:#include "Imaging.h" -: 18: -: 19: -: 20:/* Tables generated by pcdtables.py, based on transforms taken from -: 21: the "Colour Space Conversions FAQ" by Roberts/Ford. */ -: 22: -: 23:static INT16 L[] = { 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, -: 24:19, 20, 22, 23, 24, 26, 27, 29, 30, 31, 33, 34, 35, 37, 38, 39, 41, -: 25:42, 43, 45, 46, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62, 64, -: 26:65, 67, 68, 69, 71, 72, 73, 75, 76, 77, 79, 80, 82, 83, 84, 86, 87, -: 27:88, 90, 91, 92, 94, 95, 96, 98, 99, 101, 102, 103, 105, 106, 107, 109, -: 28:110, 111, 113, 114, 115, 117, 118, 120, 121, 122, 124, 125, 126, 128, -: 29:129, 130, 132, 133, 134, 136, 137, 139, 140, 141, 143, 144, 145, 147, -: 30:148, 149, 151, 152, 153, 155, 156, 158, 159, 160, 162, 163, 164, 166, -: 31:167, 168, 170, 171, 173, 174, 175, 177, 178, 179, 181, 182, 183, 185, -: 32:186, 187, 189, 190, 192, 193, 194, 196, 197, 198, 200, 201, 202, 204, -: 33:205, 206, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 223, -: 34:224, 225, 227, 228, 230, 231, 232, 234, 235, 236, 238, 239, 240, 242, -: 35:243, 245, 246, 247, 249, 250, 251, 253, 254, 255, 257, 258, 259, 261, -: 36:262, 264, 265, 266, 268, 269, 270, 272, 273, 274, 276, 277, 278, 280, -: 37:281, 283, 284, 285, 287, 288, 289, 291, 292, 293, 295, 296, 297, 299, -: 38:300, 302, 303, 304, 306, 307, 308, 310, 311, 312, 314, 315, 317, 318, -: 39:319, 321, 322, 323, 325, 326, 327, 329, 330, 331, 333, 334, 336, 337, -: 40:338, 340, 341, 342, 344, 345, 346 }; -: 41: -: 42:static INT16 CB[] = { -345, -343, -341, -338, -336, -334, -332, -329, -: 43:-327, -325, -323, -321, -318, -316, -314, -312, -310, -307, -305, -: 44:-303, -301, -298, -296, -294, -292, -290, -287, -285, -283, -281, -: 45:-278, -276, -274, -272, -270, -267, -265, -263, -261, -258, -256, -: 46:-254, -252, -250, -247, -245, -243, -241, -239, -236, -234, -232, -: 47:-230, -227, -225, -223, -221, -219, -216, -214, -212, -210, -207, -: 48:-205, -203, -201, -199, -196, -194, -192, -190, -188, -185, -183, -: 49:-181, -179, -176, -174, -172, -170, -168, -165, -163, -161, -159, -: 50:-156, -154, -152, -150, -148, -145, -143, -141, -139, -137, -134, -: 51:-132, -130, -128, -125, -123, -121, -119, -117, -114, -112, -110, -: 52:-108, -105, -103, -101, -99, -97, -94, -92, -90, -88, -85, -83, -81, -: 53:-79, -77, -74, -72, -70, -68, -66, -63, -61, -59, -57, -54, -52, -50, -: 54:-48, -46, -43, -41, -39, -37, -34, -32, -30, -28, -26, -23, -21, -19, -: 55:-17, -15, -12, -10, -8, -6, -3, -1, 0, 2, 4, 7, 9, 11, 13, 16, 18, 20, -: 56:22, 24, 27, 29, 31, 33, 35, 38, 40, 42, 44, 47, 49, 51, 53, 55, 58, -: 57:60, 62, 64, 67, 69, 71, 73, 75, 78, 80, 82, 84, 86, 89, 91, 93, 95, -: 58:98, 100, 102, 104, 106, 109, 111, 113, 115, 118, 120, 122, 124, 126, -: 59:129, 131, 133, 135, 138, 140, 142, 144, 146, 149, 151, 153, 155, 157, -: 60:160, 162, 164, 166, 169, 171, 173, 175, 177, 180, 182, 184, 186, 189, -: 61:191, 193, 195, 197, 200, 202, 204, 206, 208, 211, 213, 215, 217, 220 }; -: 62: -: 63:static INT16 GB[] = { 67, 67, 66, 66, 65, 65, 65, 64, 64, 63, 63, 62, -: 64:62, 62, 61, 61, 60, 60, 59, 59, 59, 58, 58, 57, 57, 56, 56, 56, 55, -: 65:55, 54, 54, 53, 53, 52, 52, 52, 51, 51, 50, 50, 49, 49, 49, 48, 48, -: 66:47, 47, 46, 46, 46, 45, 45, 44, 44, 43, 43, 43, 42, 42, 41, 41, 40, -: 67:40, 40, 39, 39, 38, 38, 37, 37, 37, 36, 36, 35, 35, 34, 34, 34, 33, -: 68:33, 32, 32, 31, 31, 31, 30, 30, 29, 29, 28, 28, 28, 27, 27, 26, 26, -: 69:25, 25, 25, 24, 24, 23, 23, 22, 22, 22, 21, 21, 20, 20, 19, 19, 19, -: 70:18, 18, 17, 17, 16, 16, 15, 15, 15, 14, 14, 13, 13, 12, 12, 12, 11, -: 71:11, 10, 10, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 3, 3, 3, 2, 2, -: 72:1, 1, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -3, -3, -4, -4, -5, -5, -5, -: 73:-6, -6, -7, -7, -8, -8, -8, -9, -9, -10, -10, -11, -11, -11, -12, -12, -: 74:-13, -13, -14, -14, -14, -15, -15, -16, -16, -17, -17, -18, -18, -18, -: 75:-19, -19, -20, -20, -21, -21, -21, -22, -22, -23, -23, -24, -24, -24, -: 76:-25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, -: 77:-31, -31, -32, -32, -33, -33, -33, -34, -34, -35, -35, -36, -36, -36, -: 78:-37, -37, -38, -38, -39, -39, -39, -40, -40, -41, -41, -42 }; -: 79: -: 80:static INT16 CR[] = { -249, -247, -245, -243, -241, -239, -238, -236, -: 81:-234, -232, -230, -229, -227, -225, -223, -221, -219, -218, -216, -: 82:-214, -212, -210, -208, -207, -205, -203, -201, -199, -198, -196, -: 83:-194, -192, -190, -188, -187, -185, -183, -181, -179, -178, -176, -: 84:-174, -172, -170, -168, -167, -165, -163, -161, -159, -157, -156, -: 85:-154, -152, -150, -148, -147, -145, -143, -141, -139, -137, -136, -: 86:-134, -132, -130, -128, -127, -125, -123, -121, -119, -117, -116, -: 87:-114, -112, -110, -108, -106, -105, -103, -101, -99, -97, -96, -94, -: 88:-92, -90, -88, -86, -85, -83, -81, -79, -77, -76, -74, -72, -70, -68, -: 89:-66, -65, -63, -61, -59, -57, -55, -54, -52, -50, -48, -46, -45, -43, -: 90:-41, -39, -37, -35, -34, -32, -30, -28, -26, -25, -23, -21, -19, -17, -: 91:-15, -14, -12, -10, -8, -6, -4, -3, -1, 0, 2, 4, 5, 7, 9, 11, 13, 15, -: 92:16, 18, 20, 22, 24, 26, 27, 29, 31, 33, 35, 36, 38, 40, 42, 44, 46, -: 93:47, 49, 51, 53, 55, 56, 58, 60, 62, 64, 66, 67, 69, 71, 73, 75, 77, -: 94:78, 80, 82, 84, 86, 87, 89, 91, 93, 95, 97, 98, 100, 102, 104, 106, -: 95:107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 129, 131, -: 96:133, 135, 137, 138, 140, 142, 144, 146, 148, 149, 151, 153, 155, 157, -: 97:158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 179, 180, 182, -: 98:184, 186, 188, 189, 191, 193, 195, 197, 199, 200, 202, 204, 206, 208, -: 99:209, 211, 213, 215 }; -: 100: -: 101:static INT16 GR[] = { 127, 126, 125, 124, 123, 122, 121, 121, 120, 119, -: 102:118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 108, 107, 106, -: 103:105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 95, 94, 93, 92, 91, -: 104:90, 89, 88, 87, 86, 85, 84, 83, 83, 82, 81, 80, 79, 78, 77, 76, 75, -: 105:74, 73, 72, 71, 70, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, -: 106:58, 57, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 45, 44, -: 107:43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 32, 31, 30, 29, 28, -: 108:27, 26, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, -: 109:11, 10, 9, 8, 7, 6, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -5, -: 110:-6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -18, -19, -: 111:-20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -31, -32, -: 112:-33, -34, -35, -36, -37, -38, -39, -40, -41, -42, -43, -44, -44, -45, -: 113:-46, -47, -48, -49, -50, -51, -52, -53, -54, -55, -56, -56, -57, -58, -: 114:-59, -60, -61, -62, -63, -64, -65, -66, -67, -68, -69, -69, -70, -71, -: 115:-72, -73, -74, -75, -76, -77, -78, -79, -80, -81, -82, -82, -83, -84, -: 116:-85, -86, -87, -88, -89, -90, -91, -92, -93, -94, -94, -95, -96, -97, -: 117:-98, -99, -100, -101, -102, -103, -104, -105, -106, -107, -107, -108 }; -: 118: -: 119:#define R 0 -: 120:#define G 1 -: 121:#define B 2 -: 122:#define A 3 -: 123: -: 124:#define YCC2RGB(rgb, y, cb, cr) {\ -: 125: int l = L[y];\ -: 126: int r = l + CR[cr];\ -: 127: int g = l + GR[cr] + GB[cb];\ -: 128: int b = l + CB[cb];\ -: 129: rgb[0] = (r <= 0) ? 0 : (r >= 255) ? 255 : r;\ -: 130: rgb[1] = (g <= 0) ? 0 : (g >= 255) ? 255 : g;\ -: 131: rgb[2] = (b <= 0) ? 0 : (b >= 255) ? 255 : b;\ -: 132:} -: 133: -: 134:void function ImagingUnpackYCC called 514 returned 100% blocks executed 100% 514: 135:ImagingUnpackYCC(UINT8* out, const UINT8* in, int pixels) -: 136:{ -: 137: int i; -: 138: /* PhotoYCC triplets */ 393738: 139: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 393224: 140: YCC2RGB(out, in[0], in[1], in[2]); branch 0 taken 52% (fallthrough) branch 1 taken 48% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 44% (fallthrough) branch 5 taken 56% 393224: 141: out[A] = 255; 393224: 142: out += 4; in += 3; -: 143: } 514: 144:} -: 145: -: 146:void function ImagingUnpackYCCA called 1 returned 100% blocks executed 100% 1: 147:ImagingUnpackYCCA(UINT8* out, const UINT8* in, int pixels) -: 148:{ -: 149: int i; -: 150: /* PhotoYCC triplets plus premultiplied alpha */ 5: 151: for (i = 0; i < pixels; i++) { branch 0 taken 80% branch 1 taken 20% (fallthrough) -: 152: /* Divide by alpha */ -: 153: UINT8 rgb[3]; 4: 154: rgb[0] = (in[3] == 0) ? 0 : (((int) in[0] * 255) / in[3]); branch 0 taken 100% (fallthrough) branch 1 taken 0% 4: 155: rgb[1] = (in[3] == 0) ? 0 : (((int) in[1] * 255) / in[3]); branch 0 taken 100% (fallthrough) branch 1 taken 0% 4: 156: rgb[2] = (in[3] == 0) ? 0 : (((int) in[2] * 255) / in[3]); branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 157: /* Convert non-multiplied data to RGB */ 4: 158: YCC2RGB(out, rgb[0], rgb[1], rgb[2]); branch 0 taken 50% (fallthrough) branch 1 taken 50% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 25% (fallthrough) branch 5 taken 75% 4: 159: out[A] = in[3]; 4: 160: out += 4; in += 4; -: 161: } 1: 162:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ConvertYCbCr.c.gcov -: 0:Source:src/libImaging/ConvertYCbCr.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/ConvertYCbCr.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/ConvertYCbCr.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * code to convert YCbCr data -: 6: * -: 7: * history: -: 8: * 98-07-01 hk Created -: 9: * -: 10: * Copyright (c) Secret Labs AB 1998 -: 11: * -: 12: * See the README file for information on usage and redistribution. -: 13: */ -: 14: -: 15:#include "Imaging.h" -: 16: -: 17:/* JPEG/JFIF YCbCr conversions -: 18: -: 19: Y = R * 0.29900 + G * 0.58700 + B * 0.11400 -: 20: Cb = R * -0.16874 + G * -0.33126 + B * 0.50000 + 128 -: 21: Cr = R * 0.50000 + G * -0.41869 + B * -0.08131 + 128 -: 22: -: 23: R = Y + + (Cr - 128) * 1.40200 -: 24: G = Y + (Cb - 128) * -0.34414 + (Cr - 128) * -0.71414 -: 25: B = Y + (Cb - 128) * 1.77200 -: 26: -: 27:*/ -: 28: -: 29:#define SCALE 6 /* bits */ -: 30: -: 31:static INT16 Y_R[] = { 0, 19, 38, 57, 77, 96, 115, 134, 153, 172, 191, -: 32:210, 230, 249, 268, 287, 306, 325, 344, 364, 383, 402, 421, 440, 459, -: 33:478, 498, 517, 536, 555, 574, 593, 612, 631, 651, 670, 689, 708, 727, -: 34:746, 765, 785, 804, 823, 842, 861, 880, 899, 919, 938, 957, 976, 995, -: 35:1014, 1033, 1052, 1072, 1091, 1110, 1129, 1148, 1167, 1186, 1206, -: 36:1225, 1244, 1263, 1282, 1301, 1320, 1340, 1359, 1378, 1397, 1416, -: 37:1435, 1454, 1473, 1493, 1512, 1531, 1550, 1569, 1588, 1607, 1627, -: 38:1646, 1665, 1684, 1703, 1722, 1741, 1761, 1780, 1799, 1818, 1837, -: 39:1856, 1875, 1894, 1914, 1933, 1952, 1971, 1990, 2009, 2028, 2048, -: 40:2067, 2086, 2105, 2124, 2143, 2162, 2182, 2201, 2220, 2239, 2258, -: 41:2277, 2296, 2315, 2335, 2354, 2373, 2392, 2411, 2430, 2449, 2469, -: 42:2488, 2507, 2526, 2545, 2564, 2583, 2602, 2622, 2641, 2660, 2679, -: 43:2698, 2717, 2736, 2756, 2775, 2794, 2813, 2832, 2851, 2870, 2890, -: 44:2909, 2928, 2947, 2966, 2985, 3004, 3023, 3043, 3062, 3081, 3100, -: 45:3119, 3138, 3157, 3177, 3196, 3215, 3234, 3253, 3272, 3291, 3311, -: 46:3330, 3349, 3368, 3387, 3406, 3425, 3444, 3464, 3483, 3502, 3521, -: 47:3540, 3559, 3578, 3598, 3617, 3636, 3655, 3674, 3693, 3712, 3732, -: 48:3751, 3770, 3789, 3808, 3827, 3846, 3865, 3885, 3904, 3923, 3942, -: 49:3961, 3980, 3999, 4019, 4038, 4057, 4076, 4095, 4114, 4133, 4153, -: 50:4172, 4191, 4210, 4229, 4248, 4267, 4286, 4306, 4325, 4344, 4363, -: 51:4382, 4401, 4420, 4440, 4459, 4478, 4497, 4516, 4535, 4554, 4574, -: 52:4593, 4612, 4631, 4650, 4669, 4688, 4707, 4727, 4746, 4765, 4784, -: 53:4803, 4822, 4841, 4861, 4880 }; -: 54: -: 55:static INT16 Y_G[] = { 0, 38, 75, 113, 150, 188, 225, 263, 301, 338, -: 56:376, 413, 451, 488, 526, 564, 601, 639, 676, 714, 751, 789, 826, 864, -: 57:902, 939, 977, 1014, 1052, 1089, 1127, 1165, 1202, 1240, 1277, 1315, -: 58:1352, 1390, 1428, 1465, 1503, 1540, 1578, 1615, 1653, 1691, 1728, -: 59:1766, 1803, 1841, 1878, 1916, 1954, 1991, 2029, 2066, 2104, 2141, -: 60:2179, 2217, 2254, 2292, 2329, 2367, 2404, 2442, 2479, 2517, 2555, -: 61:2592, 2630, 2667, 2705, 2742, 2780, 2818, 2855, 2893, 2930, 2968, -: 62:3005, 3043, 3081, 3118, 3156, 3193, 3231, 3268, 3306, 3344, 3381, -: 63:3419, 3456, 3494, 3531, 3569, 3607, 3644, 3682, 3719, 3757, 3794, -: 64:3832, 3870, 3907, 3945, 3982, 4020, 4057, 4095, 4132, 4170, 4208, -: 65:4245, 4283, 4320, 4358, 4395, 4433, 4471, 4508, 4546, 4583, 4621, -: 66:4658, 4696, 4734, 4771, 4809, 4846, 4884, 4921, 4959, 4997, 5034, -: 67:5072, 5109, 5147, 5184, 5222, 5260, 5297, 5335, 5372, 5410, 5447, -: 68:5485, 5522, 5560, 5598, 5635, 5673, 5710, 5748, 5785, 5823, 5861, -: 69:5898, 5936, 5973, 6011, 6048, 6086, 6124, 6161, 6199, 6236, 6274, -: 70:6311, 6349, 6387, 6424, 6462, 6499, 6537, 6574, 6612, 6650, 6687, -: 71:6725, 6762, 6800, 6837, 6875, 6913, 6950, 6988, 7025, 7063, 7100, -: 72:7138, 7175, 7213, 7251, 7288, 7326, 7363, 7401, 7438, 7476, 7514, -: 73:7551, 7589, 7626, 7664, 7701, 7739, 7777, 7814, 7852, 7889, 7927, -: 74:7964, 8002, 8040, 8077, 8115, 8152, 8190, 8227, 8265, 8303, 8340, -: 75:8378, 8415, 8453, 8490, 8528, 8566, 8603, 8641, 8678, 8716, 8753, -: 76:8791, 8828, 8866, 8904, 8941, 8979, 9016, 9054, 9091, 9129, 9167, -: 77:9204, 9242, 9279, 9317, 9354, 9392, 9430, 9467, 9505, 9542, 9580 }; -: 78: -: 79:static INT16 Y_B[] = { 0, 7, 15, 22, 29, 36, 44, 51, 58, 66, 73, 80, -: 80:88, 95, 102, 109, 117, 124, 131, 139, 146, 153, 161, 168, 175, 182, -: 81:190, 197, 204, 212, 219, 226, 233, 241, 248, 255, 263, 270, 277, 285, -: 82:292, 299, 306, 314, 321, 328, 336, 343, 350, 358, 365, 372, 379, 387, -: 83:394, 401, 409, 416, 423, 430, 438, 445, 452, 460, 467, 474, 482, 489, -: 84:496, 503, 511, 518, 525, 533, 540, 547, 554, 562, 569, 576, 584, 591, -: 85:598, 606, 613, 620, 627, 635, 642, 649, 657, 664, 671, 679, 686, 693, -: 86:700, 708, 715, 722, 730, 737, 744, 751, 759, 766, 773, 781, 788, 795, -: 87:803, 810, 817, 824, 832, 839, 846, 854, 861, 868, 876, 883, 890, 897, -: 88:905, 912, 919, 927, 934, 941, 948, 956, 963, 970, 978, 985, 992, 1000, -: 89:1007, 1014, 1021, 1029, 1036, 1043, 1051, 1058, 1065, 1073, 1080, -: 90:1087, 1094, 1102, 1109, 1116, 1124, 1131, 1138, 1145, 1153, 1160, -: 91:1167, 1175, 1182, 1189, 1197, 1204, 1211, 1218, 1226, 1233, 1240, -: 92:1248, 1255, 1262, 1270, 1277, 1284, 1291, 1299, 1306, 1313, 1321, -: 93:1328, 1335, 1342, 1350, 1357, 1364, 1372, 1379, 1386, 1394, 1401, -: 94:1408, 1415, 1423, 1430, 1437, 1445, 1452, 1459, 1466, 1474, 1481, -: 95:1488, 1496, 1503, 1510, 1518, 1525, 1532, 1539, 1547, 1554, 1561, -: 96:1569, 1576, 1583, 1591, 1598, 1605, 1612, 1620, 1627, 1634, 1642, -: 97:1649, 1656, 1663, 1671, 1678, 1685, 1693, 1700, 1707, 1715, 1722, -: 98:1729, 1736, 1744, 1751, 1758, 1766, 1773, 1780, 1788, 1795, 1802, -: 99:1809, 1817, 1824, 1831, 1839, 1846, 1853, 1860 }; -: 100: -: 101:static INT16 Cb_R[] = { 0, -10, -21, -31, -42, -53, -64, -75, -85, -: 102:-96, -107, -118, -129, -139, -150, -161, -172, -183, -193, -204, -215, -: 103:-226, -237, -247, -258, -269, -280, -291, -301, -312, -323, -334, -: 104:-345, -355, -366, -377, -388, -399, -409, -420, -431, -442, -453, -: 105:-463, -474, -485, -496, -507, -517, -528, -539, -550, -561, -571, -: 106:-582, -593, -604, -615, -625, -636, -647, -658, -669, -679, -690, -: 107:-701, -712, -723, -733, -744, -755, -766, -777, -787, -798, -809, -: 108:-820, -831, -841, -852, -863, -874, -885, -895, -906, -917, -928, -: 109:-939, -949, -960, -971, -982, -993, -1003, -1014, -1025, -1036, -1047, -: 110:-1057, -1068, -1079, -1090, -1101, -1111, -1122, -1133, -1144, -1155, -: 111:-1165, -1176, -1187, -1198, -1209, -1219, -1230, -1241, -1252, -1263, -: 112:-1273, -1284, -1295, -1306, -1317, -1327, -1338, -1349, -1360, -1371, -: 113:-1381, -1392, -1403, -1414, -1425, -1435, -1446, -1457, -1468, -1479, -: 114:-1489, -1500, -1511, -1522, -1533, -1543, -1554, -1565, -1576, -1587, -: 115:-1597, -1608, -1619, -1630, -1641, -1651, -1662, -1673, -1684, -1694, -: 116:-1705, -1716, -1727, -1738, -1748, -1759, -1770, -1781, -1792, -1802, -: 117:-1813, -1824, -1835, -1846, -1856, -1867, -1878, -1889, -1900, -1910, -: 118:-1921, -1932, -1943, -1954, -1964, -1975, -1986, -1997, -2008, -2018, -: 119:-2029, -2040, -2051, -2062, -2072, -2083, -2094, -2105, -2116, -2126, -: 120:-2137, -2148, -2159, -2170, -2180, -2191, -2202, -2213, -2224, -2234, -: 121:-2245, -2256, -2267, -2278, -2288, -2299, -2310, -2321, -2332, -2342, -: 122:-2353, -2364, -2375, -2386, -2396, -2407, -2418, -2429, -2440, -2450, -: 123:-2461, -2472, -2483, -2494, -2504, -2515, -2526, -2537, -2548, -2558, -: 124:-2569, -2580, -2591, -2602, -2612, -2623, -2634, -2645, -2656, -2666, -: 125:-2677, -2688, -2699, -2710, -2720, -2731, -2742, -2753 }; -: 126: -: 127:static INT16 Cb_G[] = { 0, -20, -41, -63, -84, -105, -126, -147, -169, -: 128:-190, -211, -232, -253, -275, -296, -317, -338, -359, -381, -402, -: 129:-423, -444, -465, -487, -508, -529, -550, -571, -593, -614, -635, -: 130:-656, -677, -699, -720, -741, -762, -783, -805, -826, -847, -868, -: 131:-889, -911, -932, -953, -974, -995, -1017, -1038, -1059, -1080, -1101, -: 132:-1123, -1144, -1165, -1186, -1207, -1229, -1250, -1271, -1292, -1313, -: 133:-1335, -1356, -1377, -1398, -1419, -1441, -1462, -1483, -1504, -1525, -: 134:-1547, -1568, -1589, -1610, -1631, -1653, -1674, -1695, -1716, -1737, -: 135:-1759, -1780, -1801, -1822, -1843, -1865, -1886, -1907, -1928, -1949, -: 136:-1971, -1992, -2013, -2034, -2055, -2077, -2098, -2119, -2140, -2161, -: 137:-2183, -2204, -2225, -2246, -2267, -2289, -2310, -2331, -2352, -2373, -: 138:-2395, -2416, -2437, -2458, -2479, -2501, -2522, -2543, -2564, -2585, -: 139:-2607, -2628, -2649, -2670, -2691, -2713, -2734, -2755, -2776, -2797, -: 140:-2819, -2840, -2861, -2882, -2903, -2925, -2946, -2967, -2988, -3009, -: 141:-3031, -3052, -3073, -3094, -3115, -3137, -3158, -3179, -3200, -3221, -: 142:-3243, -3264, -3285, -3306, -3328, -3349, -3370, -3391, -3412, -3434, -: 143:-3455, -3476, -3497, -3518, -3540, -3561, -3582, -3603, -3624, -3646, -: 144:-3667, -3688, -3709, -3730, -3752, -3773, -3794, -3815, -3836, -3858, -: 145:-3879, -3900, -3921, -3942, -3964, -3985, -4006, -4027, -4048, -4070, -: 146:-4091, -4112, -4133, -4154, -4176, -4197, -4218, -4239, -4260, -4282, -: 147:-4303, -4324, -4345, -4366, -4388, -4409, -4430, -4451, -4472, -4494, -: 148:-4515, -4536, -4557, -4578, -4600, -4621, -4642, -4663, -4684, -4706, -: 149:-4727, -4748, -4769, -4790, -4812, -4833, -4854, -4875, -4896, -4918, -: 150:-4939, -4960, -4981, -5002, -5024, -5045, -5066, -5087, -5108, -5130, -: 151:-5151, -5172, -5193, -5214, -5236, -5257, -5278, -5299, -5320, -5342, -: 152:-5363, -5384, -5405 }; -: 153: -: 154:static INT16 Cb_B[] = { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, -: 155:320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, -: 156:768, 800, 832, 864, 896, 928, 960, 992, 1024, 1056, 1088, 1120, 1152, -: 157:1184, 1216, 1248, 1280, 1312, 1344, 1376, 1408, 1440, 1472, 1504, -: 158:1536, 1568, 1600, 1632, 1664, 1696, 1728, 1760, 1792, 1824, 1856, -: 159:1888, 1920, 1952, 1984, 2016, 2048, 2080, 2112, 2144, 2176, 2208, -: 160:2240, 2272, 2304, 2336, 2368, 2400, 2432, 2464, 2496, 2528, 2560, -: 161:2592, 2624, 2656, 2688, 2720, 2752, 2784, 2816, 2848, 2880, 2912, -: 162:2944, 2976, 3008, 3040, 3072, 3104, 3136, 3168, 3200, 3232, 3264, -: 163:3296, 3328, 3360, 3392, 3424, 3456, 3488, 3520, 3552, 3584, 3616, -: 164:3648, 3680, 3712, 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968, -: 165:4000, 4032, 4064, 4096, 4128, 4160, 4192, 4224, 4256, 4288, 4320, -: 166:4352, 4384, 4416, 4448, 4480, 4512, 4544, 4576, 4608, 4640, 4672, -: 167:4704, 4736, 4768, 4800, 4832, 4864, 4896, 4928, 4960, 4992, 5024, -: 168:5056, 5088, 5120, 5152, 5184, 5216, 5248, 5280, 5312, 5344, 5376, -: 169:5408, 5440, 5472, 5504, 5536, 5568, 5600, 5632, 5664, 5696, 5728, -: 170:5760, 5792, 5824, 5856, 5888, 5920, 5952, 5984, 6016, 6048, 6080, -: 171:6112, 6144, 6176, 6208, 6240, 6272, 6304, 6336, 6368, 6400, 6432, -: 172:6464, 6496, 6528, 6560, 6592, 6624, 6656, 6688, 6720, 6752, 6784, -: 173:6816, 6848, 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104, 7136, -: 174:7168, 7200, 7232, 7264, 7296, 7328, 7360, 7392, 7424, 7456, 7488, -: 175:7520, 7552, 7584, 7616, 7648, 7680, 7712, 7744, 7776, 7808, 7840, -: 176:7872, 7904, 7936, 7968, 8000, 8032, 8064, 8096, 8128, 8160 }; -: 177: -: 178:#define Cr_R Cb_B -: 179: -: 180:static INT16 Cr_G[] = { 0, -26, -53, -79, -106, -133, -160, -187, -: 181:-213, -240, -267, -294, -321, -347, -374, -401, -428, -455, -481, -: 182:-508, -535, -562, -589, -615, -642, -669, -696, -722, -749, -776, -: 183:-803, -830, -856, -883, -910, -937, -964, -990, -1017, -1044, -1071, -: 184:-1098, -1124, -1151, -1178, -1205, -1232, -1258, -1285, -1312, -1339, -: 185:-1366, -1392, -1419, -1446, -1473, -1500, -1526, -1553, -1580, -1607, -: 186:-1634, -1660, -1687, -1714, -1741, -1768, -1794, -1821, -1848, -1875, -: 187:-1902, -1928, -1955, -1982, -2009, -2036, -2062, -2089, -2116, -2143, -: 188:-2169, -2196, -2223, -2250, -2277, -2303, -2330, -2357, -2384, -2411, -: 189:-2437, -2464, -2491, -2518, -2545, -2571, -2598, -2625, -2652, -2679, -: 190:-2705, -2732, -2759, -2786, -2813, -2839, -2866, -2893, -2920, -2947, -: 191:-2973, -3000, -3027, -3054, -3081, -3107, -3134, -3161, -3188, -3215, -: 192:-3241, -3268, -3295, -3322, -3349, -3375, -3402, -3429, -3456, -3483, -: 193:-3509, -3536, -3563, -3590, -3616, -3643, -3670, -3697, -3724, -3750, -: 194:-3777, -3804, -3831, -3858, -3884, -3911, -3938, -3965, -3992, -4018, -: 195:-4045, -4072, -4099, -4126, -4152, -4179, -4206, -4233, -4260, -4286, -: 196:-4313, -4340, -4367, -4394, -4420, -4447, -4474, -4501, -4528, -4554, -: 197:-4581, -4608, -4635, -4662, -4688, -4715, -4742, -4769, -4796, -4822, -: 198:-4849, -4876, -4903, -4929, -4956, -4983, -5010, -5037, -5063, -5090, -: 199:-5117, -5144, -5171, -5197, -5224, -5251, -5278, -5305, -5331, -5358, -: 200:-5385, -5412, -5439, -5465, -5492, -5519, -5546, -5573, -5599, -5626, -: 201:-5653, -5680, -5707, -5733, -5760, -5787, -5814, -5841, -5867, -5894, -: 202:-5921, -5948, -5975, -6001, -6028, -6055, -6082, -6109, -6135, -6162, -: 203:-6189, -6216, -6243, -6269, -6296, -6323, -6350, -6376, -6403, -6430, -: 204:-6457, -6484, -6510, -6537, -6564, -6591, -6618, -6644, -6671, -6698, -: 205:-6725, -6752, -6778, -6805, -6832 }; -: 206: -: 207:static INT16 Cr_B[] = { 0, -4, -9, -15, -20, -25, -30, -35, -41, -46, -: 208:-51, -56, -61, -67, -72, -77, -82, -87, -93, -98, -103, -108, -113, -: 209:-119, -124, -129, -134, -140, -145, -150, -155, -160, -166, -171, -: 210:-176, -181, -186, -192, -197, -202, -207, -212, -218, -223, -228, -: 211:-233, -238, -244, -249, -254, -259, -264, -270, -275, -280, -285, -: 212:-290, -296, -301, -306, -311, -316, -322, -327, -332, -337, -342, -: 213:-348, -353, -358, -363, -368, -374, -379, -384, -389, -394, -400, -: 214:-405, -410, -415, -421, -426, -431, -436, -441, -447, -452, -457, -: 215:-462, -467, -473, -478, -483, -488, -493, -499, -504, -509, -514, -: 216:-519, -525, -530, -535, -540, -545, -551, -556, -561, -566, -571, -: 217:-577, -582, -587, -592, -597, -603, -608, -613, -618, -623, -629, -: 218:-634, -639, -644, -649, -655, -660, -665, -670, -675, -681, -686, -: 219:-691, -696, -702, -707, -712, -717, -722, -728, -733, -738, -743, -: 220:-748, -754, -759, -764, -769, -774, -780, -785, -790, -795, -800, -: 221:-806, -811, -816, -821, -826, -832, -837, -842, -847, -852, -858, -: 222:-863, -868, -873, -878, -884, -889, -894, -899, -904, -910, -915, -: 223:-920, -925, -930, -936, -941, -946, -951, -957, -962, -967, -972, -: 224:-977, -983, -988, -993, -998, -1003, -1009, -1014, -1019, -1024, -: 225:-1029, -1035, -1040, -1045, -1050, -1055, -1061, -1066, -1071, -1076, -: 226:-1081, -1087, -1092, -1097, -1102, -1107, -1113, -1118, -1123, -1128, -: 227:-1133, -1139, -1144, -1149, -1154, -1159, -1165, -1170, -1175, -1180, -: 228:-1185, -1191, -1196, -1201, -1206, -1211, -1217, -1222, -1227, -1232, -: 229:-1238, -1243, -1248, -1253, -1258, -1264, -1269, -1274, -1279, -1284, -: 230:-1290, -1295, -1300, -1305, -1310, -1316, -1321, -1326 }; -: 231: -: 232:static INT16 R_Cr[] = { -11484, -11394, -11305, -11215, -11125, -: 233:-11036, -10946, -10856, -10766, -10677, -10587, -10497, -10407, -: 234:-10318, -10228, -10138, -10049, -9959, -9869, -9779, -9690, -9600, -: 235:-9510, -9420, -9331, -9241, -9151, -9062, -8972, -8882, -8792, -8703, -: 236:-8613, -8523, -8433, -8344, -8254, -8164, -8075, -7985, -7895, -7805, -: 237:-7716, -7626, -7536, -7446, -7357, -7267, -7177, -7088, -6998, -6908, -: 238:-6818, -6729, -6639, -6549, -6459, -6370, -6280, -6190, -6101, -6011, -: 239:-5921, -5831, -5742, -5652, -5562, -5472, -5383, -5293, -5203, -5113, -: 240:-5024, -4934, -4844, -4755, -4665, -4575, -4485, -4396, -4306, -4216, -: 241:-4126, -4037, -3947, -3857, -3768, -3678, -3588, -3498, -3409, -3319, -: 242:-3229, -3139, -3050, -2960, -2870, -2781, -2691, -2601, -2511, -2422, -: 243:-2332, -2242, -2152, -2063, -1973, -1883, -1794, -1704, -1614, -1524, -: 244:-1435, -1345, -1255, -1165, -1076, -986, -896, -807, -717, -627, -537, -: 245:-448, -358, -268, -178, -89, 0, 90, 179, 269, 359, 449, 538, 628, 718, -: 246:808, 897, 987, 1077, 1166, 1256, 1346, 1436, 1525, 1615, 1705, 1795, -: 247:1884, 1974, 2064, 2153, 2243, 2333, 2423, 2512, 2602, 2692, 2782, -: 248:2871, 2961, 3051, 3140, 3230, 3320, 3410, 3499, 3589, 3679, 3769, -: 249:3858, 3948, 4038, 4127, 4217, 4307, 4397, 4486, 4576, 4666, 4756, -: 250:4845, 4935, 5025, 5114, 5204, 5294, 5384, 5473, 5563, 5653, 5743, -: 251:5832, 5922, 6012, 6102, 6191, 6281, 6371, 6460, 6550, 6640, 6730, -: 252:6819, 6909, 6999, 7089, 7178, 7268, 7358, 7447, 7537, 7627, 7717, -: 253:7806, 7896, 7986, 8076, 8165, 8255, 8345, 8434, 8524, 8614, 8704, -: 254:8793, 8883, 8973, 9063, 9152, 9242, 9332, 9421, 9511, 9601, 9691, -: 255:9780, 9870, 9960, 10050, 10139, 10229, 10319, 10408, 10498, 10588, -: 256:10678, 10767, 10857, 10947, 11037, 11126, 11216, 11306, 11395 }; -: 257: -: 258:static INT16 G_Cb[] = { 2819, 2797, 2775, 2753, 2731, 2709, 2687, -: 259:2665, 2643, 2621, 2599, 2577, 2555, 2533, 2511, 2489, 2467, 2445, -: 260:2423, 2401, 2379, 2357, 2335, 2313, 2291, 2269, 2247, 2225, 2202, -: 261:2180, 2158, 2136, 2114, 2092, 2070, 2048, 2026, 2004, 1982, 1960, -: 262:1938, 1916, 1894, 1872, 1850, 1828, 1806, 1784, 1762, 1740, 1718, -: 263:1696, 1674, 1652, 1630, 1608, 1586, 1564, 1542, 1520, 1498, 1476, -: 264:1454, 1432, 1410, 1388, 1366, 1344, 1321, 1299, 1277, 1255, 1233, -: 265:1211, 1189, 1167, 1145, 1123, 1101, 1079, 1057, 1035, 1013, 991, 969, -: 266:947, 925, 903, 881, 859, 837, 815, 793, 771, 749, 727, 705, 683, 661, -: 267:639, 617, 595, 573, 551, 529, 507, 485, 463, 440, 418, 396, 374, 352, -: 268:330, 308, 286, 264, 242, 220, 198, 176, 154, 132, 110, 88, 66, 44, 22, -: 269:0, -21, -43, -65, -87, -109, -131, -153, -175, -197, -219, -241, -263, -: 270:-285, -307, -329, -351, -373, -395, -417, -439, -462, -484, -506, -: 271:-528, -550, -572, -594, -616, -638, -660, -682, -704, -726, -748, -: 272:-770, -792, -814, -836, -858, -880, -902, -924, -946, -968, -990, -: 273:-1012, -1034, -1056, -1078, -1100, -1122, -1144, -1166, -1188, -1210, -: 274:-1232, -1254, -1276, -1298, -1320, -1343, -1365, -1387, -1409, -1431, -: 275:-1453, -1475, -1497, -1519, -1541, -1563, -1585, -1607, -1629, -1651, -: 276:-1673, -1695, -1717, -1739, -1761, -1783, -1805, -1827, -1849, -1871, -: 277:-1893, -1915, -1937, -1959, -1981, -2003, -2025, -2047, -2069, -2091, -: 278:-2113, -2135, -2157, -2179, -2201, -2224, -2246, -2268, -2290, -2312, -: 279:-2334, -2356, -2378, -2400, -2422, -2444, -2466, -2488, -2510, -2532, -: 280:-2554, -2576, -2598, -2620, -2642, -2664, -2686, -2708, -2730, -2752, -: 281:-2774, -2796 }; -: 282: -: 283:static INT16 G_Cr[] = { 5850, 5805, 5759, 5713, 5667, 5622, 5576, -: 284:5530, 5485, 5439, 5393, 5347, 5302, 5256, 5210, 5165, 5119, 5073, -: 285:5028, 4982, 4936, 4890, 4845, 4799, 4753, 4708, 4662, 4616, 4570, -: 286:4525, 4479, 4433, 4388, 4342, 4296, 4251, 4205, 4159, 4113, 4068, -: 287:4022, 3976, 3931, 3885, 3839, 3794, 3748, 3702, 3656, 3611, 3565, -: 288:3519, 3474, 3428, 3382, 3336, 3291, 3245, 3199, 3154, 3108, 3062, -: 289:3017, 2971, 2925, 2879, 2834, 2788, 2742, 2697, 2651, 2605, 2559, -: 290:2514, 2468, 2422, 2377, 2331, 2285, 2240, 2194, 2148, 2102, 2057, -: 291:2011, 1965, 1920, 1874, 1828, 1782, 1737, 1691, 1645, 1600, 1554, -: 292:1508, 1463, 1417, 1371, 1325, 1280, 1234, 1188, 1143, 1097, 1051, -: 293:1006, 960, 914, 868, 823, 777, 731, 686, 640, 594, 548, 503, 457, 411, -: 294:366, 320, 274, 229, 183, 137, 91, 46, 0, -45, -90, -136, -182, -228, -: 295:-273, -319, -365, -410, -456, -502, -547, -593, -639, -685, -730, -: 296:-776, -822, -867, -913, -959, -1005, -1050, -1096, -1142, -1187, -: 297:-1233, -1279, -1324, -1370, -1416, -1462, -1507, -1553, -1599, -1644, -: 298:-1690, -1736, -1781, -1827, -1873, -1919, -1964, -2010, -2056, -2101, -: 299:-2147, -2193, -2239, -2284, -2330, -2376, -2421, -2467, -2513, -2558, -: 300:-2604, -2650, -2696, -2741, -2787, -2833, -2878, -2924, -2970, -3016, -: 301:-3061, -3107, -3153, -3198, -3244, -3290, -3335, -3381, -3427, -3473, -: 302:-3518, -3564, -3610, -3655, -3701, -3747, -3793, -3838, -3884, -3930, -: 303:-3975, -4021, -4067, -4112, -4158, -4204, -4250, -4295, -4341, -4387, -: 304:-4432, -4478, -4524, -4569, -4615, -4661, -4707, -4752, -4798, -4844, -: 305:-4889, -4935, -4981, -5027, -5072, -5118, -5164, -5209, -5255, -5301, -: 306:-5346, -5392, -5438, -5484, -5529, -5575, -5621, -5666, -5712, -5758, -: 307:-5804 }; -: 308: -: 309:static INT16 B_Cb[] = { -14515, -14402, -14288, -14175, -14062, -: 310:-13948, -13835, -13721, -13608, -13495, -13381, -13268, -13154, -: 311:-13041, -12928, -12814, -12701, -12587, -12474, -12360, -12247, -: 312:-12134, -12020, -11907, -11793, -11680, -11567, -11453, -11340, -: 313:-11226, -11113, -11000, -10886, -10773, -10659, -10546, -10433, -: 314:-10319, -10206, -10092, -9979, -9865, -9752, -9639, -9525, -9412, -: 315:-9298, -9185, -9072, -8958, -8845, -8731, -8618, -8505, -8391, -8278, -: 316:-8164, -8051, -7938, -7824, -7711, -7597, -7484, -7371, -7257, -7144, -: 317:-7030, -6917, -6803, -6690, -6577, -6463, -6350, -6236, -6123, -6010, -: 318:-5896, -5783, -5669, -5556, -5443, -5329, -5216, -5102, -4989, -4876, -: 319:-4762, -4649, -4535, -4422, -4309, -4195, -4082, -3968, -3855, -3741, -: 320:-3628, -3515, -3401, -3288, -3174, -3061, -2948, -2834, -2721, -2607, -: 321:-2494, -2381, -2267, -2154, -2040, -1927, -1814, -1700, -1587, -1473, -: 322:-1360, -1246, -1133, -1020, -906, -793, -679, -566, -453, -339, -226, -: 323:-112, 0, 113, 227, 340, 454, 567, 680, 794, 907, 1021, 1134, 1247, -: 324:1361, 1474, 1588, 1701, 1815, 1928, 2041, 2155, 2268, 2382, 2495, -: 325:2608, 2722, 2835, 2949, 3062, 3175, 3289, 3402, 3516, 3629, 3742, -: 326:3856, 3969, 4083, 4196, 4310, 4423, 4536, 4650, 4763, 4877, 4990, -: 327:5103, 5217, 5330, 5444, 5557, 5670, 5784, 5897, 6011, 6124, 6237, -: 328:6351, 6464, 6578, 6691, 6804, 6918, 7031, 7145, 7258, 7372, 7485, -: 329:7598, 7712, 7825, 7939, 8052, 8165, 8279, 8392, 8506, 8619, 8732, -: 330:8846, 8959, 9073, 9186, 9299, 9413, 9526, 9640, 9753, 9866, 9980, -: 331:10093, 10207, 10320, 10434, 10547, 10660, 10774, 10887, 11001, 11114, -: 332:11227, 11341, 11454, 11568, 11681, 11794, 11908, 12021, 12135, 12248, -: 333:12361, 12475, 12588, 12702, 12815, 12929, 13042, 13155, 13269, 13382, -: 334:13496, 13609, 13722, 13836, 13949, 14063, 14176, 14289, 14403 }; -: 335: -: 336: -: 337:void function ImagingConvertRGB2YCbCr called 1280 returned 100% blocks executed 100% 1280: 338:ImagingConvertRGB2YCbCr(UINT8* out, const UINT8* in, int pixels) -: 339:{ -: 340: int x; -: 341: UINT8 a; -: 342: int r, g, b; -: 343: int y, cr, cb; -: 344: 165120: 345: for (x = 0; x < pixels; x++, in +=4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 346: 163840: 347: r = in[0]; 163840: 348: g = in[1]; 163840: 349: b = in[2]; 163840: 350: a = in[3]; -: 351: 163840: 352: y = (Y_R[r] + Y_G[g] + Y_B[b]) >> SCALE; 163840: 353: cb = ((Cb_R[r] + Cb_G[g] + Cb_B[b]) >> SCALE) + 128; 163840: 354: cr = ((Cr_R[r] + Cr_G[g] + Cr_B[b]) >> SCALE) + 128; -: 355: 163840: 356: out[0] = (UINT8) y; 163840: 357: out[1] = (UINT8) cb; 163840: 358: out[2] = (UINT8) cr; 163840: 359: out[3] = a; -: 360: } 1280: 361:} -: 362: -: 363:void function ImagingConvertYCbCr2RGB called 1280 returned 100% blocks executed 100% 1280: 364:ImagingConvertYCbCr2RGB(UINT8* out, const UINT8* in, int pixels) -: 365:{ -: 366: int x; -: 367: UINT8 a; -: 368: int r, g, b; -: 369: int y, cr, cb; -: 370: 165120: 371: for (x = 0; x < pixels; x++, in += 4, out += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 372: 163840: 373: y = in[0]; 163840: 374: cb = in[1]; 163840: 375: cr = in[2]; 163840: 376: a = in[3]; -: 377: 163840: 378: r = y + (( R_Cr[cr]) >> SCALE); 163840: 379: g = y + ((G_Cb[cb] + G_Cr[cr]) >> SCALE); 163840: 380: b = y + ((B_Cb[cb] ) >> SCALE); -: 381: 163840: 382: out[0] = (r <= 0) ? 0 : (r >= 255) ? 255 : r; branch 0 taken 99% (fallthrough) branch 1 taken 1% 163840: 383: out[1] = (g <= 0) ? 0 : (g >= 255) ? 255 : g; branch 0 taken 99% (fallthrough) branch 1 taken 1% 163840: 384: out[2] = (b <= 0) ? 0 : (b >= 255) ? 255 : b; branch 0 taken 99% (fallthrough) branch 1 taken 1% 163840: 385: out[3] = a; -: 386: } 1280: 387:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#ZipDecode.c.gcov -: 0:Source:src/libImaging/ZipDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/ZipDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/ZipDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for ZIP (deflated) image data. -: 6: * -: 7: * history: -: 8: * 1996-12-14 fl Created (for PNG) -: 9: * 1997-01-15 fl Prepared to read TIFF/ZIP -: 10: * 2001-11-19 fl PNG incomplete read patch (from Bernhard Herzog) -: 11: * -: 12: * Copyright (c) Fredrik Lundh 1996. -: 13: * Copyright (c) Secret Labs AB 1997-2001. -: 14: * -: 15: * See the README file for information on usage and redistribution. -: 16: */ -: 17: -: 18: -: 19:#include "Imaging.h" -: 20: -: 21:#ifdef HAVE_LIBZ -: 22: -: 23:#include "ZipCodecs.h" -: 24: -: 25:static const int OFFSET[] = { 7, 3, 3, 1, 1, 0, 0 }; -: 26:static const int STARTING_COL[] = { 0, 4, 0, 2, 0, 1, 0 }; -: 27:static const int STARTING_ROW[] = { 0, 0, 4, 0, 2, 0, 1 }; -: 28:static const int COL_INCREMENT[] = { 8, 8, 4, 4, 2, 2, 1 }; -: 29:static const int ROW_INCREMENT[] = { 8, 8, 8, 4, 4, 2, 2 }; -: 30: -: 31:/* Get the length in bytes of a scanline in the pass specified, -: 32: * for interlaced images */ -: 33:static int get_row_len(ImagingCodecState state, int pass) -: 34:{ 124: 35: int row_len = (state->xsize + OFFSET[pass]) / COL_INCREMENT[pass]; 124: 36: return ((row_len * state->bits) + 7) / 8; -: 37:} -: 38: -: 39:/* -------------------------------------------------------------------- */ -: 40:/* Decoder */ -: 41:/* -------------------------------------------------------------------- */ -: 42: -: 43:int function ImagingZipDecode called 1501 returned 100% blocks executed 80% 1501: 44:ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 45:{ 1501: 46: ZIPSTATE* context = (ZIPSTATE*) state->context; -: 47: int err; -: 48: int n; -: 49: UINT8* ptr; -: 50: int i, bpp; -: 51: int row_len; -: 52: 1501: 53: if (!state->state) { branch 0 taken 68% (fallthrough) branch 1 taken 32% -: 54: -: 55: /* Initialization */ 1015: 56: if (context->mode == ZIP_PNG || context->mode == ZIP_PNG_PALETTE) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1015: 57: context->prefix = 1; /* PNG */ -: 58: } -: 59: -: 60: /* overflow check for malloc */ 1015: 61: if (state->bytes > INT_MAX - 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 62: state->errcode = IMAGING_CODEC_MEMORY; #####: 63: return -1; -: 64: } -: 65: /* Expand standard buffer to make room for the (optional) filter -: 66: prefix, and allocate a buffer to hold the previous line */ 1015: 67: free(state->buffer); -: 68: /* malloc check ok, overflow checked above */ 1015: 69: state->buffer = (UINT8*) malloc(state->bytes+1); 1015: 70: context->previous = (UINT8*) malloc(state->bytes+1); 1015: 71: if (!state->buffer || !context->previous) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 72: state->errcode = IMAGING_CODEC_MEMORY; #####: 73: return -1; -: 74: } -: 75: 1015: 76: context->last_output = 0; -: 77: -: 78: /* Initialize to black */ 2030: 79: memset(context->previous, 0, state->bytes+1); -: 80: -: 81: /* Setup decompression context */ 1015: 82: context->z_stream.zalloc = (alloc_func) NULL; 1015: 83: context->z_stream.zfree = (free_func) NULL; 1015: 84: context->z_stream.opaque = (voidpf) NULL; -: 85: 1015: 86: err = inflateInit(&context->z_stream); call 0 returned 100% 1015: 87: if (err < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 88: state->errcode = IMAGING_CODEC_CONFIG; #####: 89: free(context->previous); #####: 90: context->previous = NULL; #####: 91: return -1; -: 92: } -: 93: 1015: 94: if (context->interlaced) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 15: 95: context->pass = 0; 15: 96: state->y = STARTING_ROW[context->pass]; -: 97: } -: 98: -: 99: /* Ready to decode */ 1015: 100: state->state = 1; -: 101: -: 102: } -: 103: 1501: 104: if (context->interlaced) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 68: 105: row_len = get_row_len(state, context->pass); -: 106: } else { 1467: 107: row_len = state->bytes; -: 108: } -: 109: -: 110: /* Setup the source buffer */ 1501: 111: context->z_stream.next_in = buf; 1501: 112: context->z_stream.avail_in = bytes; -: 113: -: 114: /* Decompress what we've got this far */ 176563: 115: while (context->z_stream.avail_in > 0) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 116: 175050: 117: context->z_stream.next_out = state->buffer + context->last_output; 175050: 118: context->z_stream.avail_out = 175050: 119: row_len + context->prefix - context->last_output; -: 120: 175050: 121: err = inflate(&context->z_stream, Z_NO_FLUSH); call 0 returned 100% -: 122: 175050: 123: if (err < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% -: 124: /* Something went wrong inside the compression library */ #####: 125: if (err == Z_DATA_ERROR) { branch 0 never executed branch 1 never executed #####: 126: state->errcode = IMAGING_CODEC_BROKEN; #####: 127: } else if (err == Z_MEM_ERROR) { branch 0 never executed branch 1 never executed #####: 128: state->errcode = IMAGING_CODEC_MEMORY; -: 129: } else { #####: 130: state->errcode = IMAGING_CODEC_CONFIG; -: 131: } #####: 132: free(context->previous); #####: 133: context->previous = NULL; #####: 134: inflateEnd(&context->z_stream); call 0 never executed #####: 135: return -1; -: 136: } -: 137: 175050: 138: n = row_len + context->prefix - context->z_stream.avail_out; -: 139: 175050: 140: if (n < row_len + context->prefix) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 580: 141: context->last_output = n; 580: 142: break; /* need more input data */ -: 143: } -: 144: -: 145: /* Apply predictor */ 174470: 146: switch (context->mode) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% -: 147: case ZIP_PNG: 174470: 148: switch (state->buffer[0]) { branch 0 taken 41% branch 1 taken 5% branch 2 taken 2% branch 3 taken 16% branch 4 taken 1% branch 5 taken 36% -: 149: case 0: -: 150: break; -: 151: case 1: -: 152: /* prior */ 8668: 153: bpp = (state->bits + 7) / 8; 11359273: 154: for (i = bpp+1; i <= row_len; i++) { branch 0 taken 99% branch 1 taken 1% 11350605: 155: state->buffer[i] += state->buffer[i-bpp]; -: 156: } -: 157: break; -: 158: case 2: -: 159: /* up */ 209240594: 160: for (i = 1; i <= row_len; i++) { branch 0 taken 99% branch 1 taken 1% 209240594: 161: state->buffer[i] += context->previous[i]; -: 162: } -: 163: break; -: 164: case 3: -: 165: /* average */ 2624: 166: bpp = (state->bits + 7) / 8; 10757: 167: for (i = 1; i <= bpp; i++) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 8133: 168: state->buffer[i] += context->previous[i]/2; -: 169: } 2705611: 170: for (; i <= row_len; i++) { branch 0 taken 99% branch 1 taken 1% 5411222: 171: state->buffer[i] += 2705611: 172: (state->buffer[i-bpp] + context->previous[i])/2; -: 173: } -: 174: break; -: 175: case 4: -: 176: /* paeth filtering */ 27894: 177: bpp = (state->bits + 7) / 8; 106501: 178: for (i = 1; i <= bpp; i++) { branch 0 taken 74% branch 1 taken 26% (fallthrough) 78607: 179: state->buffer[i] += context->previous[i]; -: 180: } 61557676: 181: for (; i <= row_len; i++) { branch 0 taken 99% branch 1 taken 1% -: 182: int a, b, c; -: 183: int pa, pb, pc; -: 184: -: 185: /* fetch pixels */ 61557676: 186: a = state->buffer[i-bpp]; 61557676: 187: b = context->previous[i]; 61557676: 188: c = context->previous[i-bpp]; -: 189: -: 190: /* distances to surrounding pixels */ 61557676: 191: pa = abs(b - c); 61557676: 192: pb = abs(a - c); 61557676: 193: pc = abs(a + b - 2*c); -: 194: -: 195: /* pick predictor with the shortest distance */ 123115352: 196: state->buffer[i] += branch 0 taken 28% (fallthrough) branch 1 taken 72% branch 2 taken 80% (fallthrough) branch 3 taken 20% 61557676: 197: (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c; -: 198: -: 199: } -: 200: break; -: 201: default: 3: 202: state->errcode = IMAGING_CODEC_UNKNOWN; 3: 203: free(context->previous); 3: 204: context->previous = NULL; 3: 205: inflateEnd(&context->z_stream); call 0 returned 100% 3: 206: return -1; -: 207: } -: 208: break; -: 209: case ZIP_TIFF_PREDICTOR: #####: 210: bpp = (state->bits + 7) / 8; #####: 211: for (i = bpp+1; i <= row_len; i++) { branch 0 never executed branch 1 never executed #####: 212: state->buffer[i] += state->buffer[i-bpp]; -: 213: } -: 214: break; -: 215: } -: 216: -: 217: /* Stuff data into the image */ 174467: 218: if (context->interlaced) { branch 0 taken 2% (fallthrough) branch 1 taken 98% 4230: 219: int col = STARTING_COL[context->pass]; 4230: 220: if (state->bits >= 8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 221: /* Stuff pixels in their correct location, one by one */ 364500: 222: for (i = 0; i < row_len; i += ((state->bits + 7) / 8)) { branch 0 taken 99% branch 1 taken 1% 1093500: 223: state->shuffle((UINT8*) im->image[state->y] + call 0 returned 100% 364500: 224: col * im->pixelsize, 364500: 225: state->buffer + context->prefix + i, 1); 364500: 226: col += COL_INCREMENT[context->pass]; -: 227: } -: 228: } else { -: 229: /* Handle case with more than a pixel in each byte */ #####: 230: int row_bits = ((state->xsize + OFFSET[context->pass]) #####: 231: / COL_INCREMENT[context->pass]) * state->bits; #####: 232: for (i = 0; i < row_bits; i += state->bits) { branch 0 never executed branch 1 never executed #####: 233: UINT8 byte = *(state->buffer + context->prefix + (i / 8)); #####: 234: byte <<= (i % 8); #####: 235: state->shuffle((UINT8*) im->image[state->y] + call 0 never executed #####: 236: col * im->pixelsize, &byte, 1); #####: 237: col += COL_INCREMENT[context->pass]; -: 238: } -: 239: } -: 240: /* Find next valid scanline */ 4230: 241: state->y += ROW_INCREMENT[context->pass]; 8550: 242: while (state->y >= state->ysize || row_len <= 0) { branch 0 taken 2% branch 1 taken 98% (fallthrough) branch 2 taken 0% branch 3 taken 100% 105: 243: context->pass++; 105: 244: if (context->pass == 7) { branch 0 taken 14% (fallthrough) branch 1 taken 86% -: 245: /* Force exit below */ 15: 246: state->y = state->ysize; 15: 247: break; -: 248: } 90: 249: state->y = STARTING_ROW[context->pass]; 180: 250: row_len = get_row_len(state, context->pass); -: 251: /* Since we're moving to the "first" line, the previous line -: 252: * should be black to make filters work correctly */ 90: 253: memset(state->buffer, 0, state->bytes+1); -: 254: } -: 255: } else { 510711: 256: state->shuffle((UINT8*) im->image[state->y + state->yoff] + call 0 returned 100% 170237: 257: state->xoff * im->pixelsize, 170237: 258: state->buffer + context->prefix, -: 259: state->xsize); 170237: 260: state->y++; -: 261: } -: 262: -: 263: /* all inflate output has been consumed */ 174467: 264: context->last_output = 0; -: 265: 174467: 266: if (state->y >= state->ysize || err == Z_STREAM_END) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 0% (fallthrough) branch 3 taken 100% -: 267: -: 268: /* The image and the data should end simultaneously */ -: 269: /* if (state->y < state->ysize || err != Z_STREAM_END) -: 270: state->errcode = IMAGING_CODEC_BROKEN; */ -: 271: 906: 272: free(context->previous); 906: 273: context->previous = NULL; 906: 274: inflateEnd(&context->z_stream); call 0 returned 100% 906: 275: return -1; /* end of file (errcode=0) */ -: 276: -: 277: } -: 278: -: 279: /* Swap buffer pointers */ 173561: 280: ptr = state->buffer; 173561: 281: state->buffer = context->previous; 173561: 282: context->previous = ptr; -: 283: -: 284: } -: 285: 592: 286: return bytes; /* consumed all of it */ -: 287: -: 288:} -: 289: -: 290: function ImagingZipDecodeCleanup called 2032 returned 100% blocks executed 100% 2032: 291:int ImagingZipDecodeCleanup(ImagingCodecState state){ -: 292: /* called to free the decompression engine when the decode terminates -: 293: due to a corrupt or truncated image -: 294: */ 2032: 295: ZIPSTATE* context = (ZIPSTATE*) state->context; -: 296: -: 297: /* Clean up */ 2032: 298: if (context->previous) { branch 0 taken 5% (fallthrough) branch 1 taken 95% 106: 299: inflateEnd(&context->z_stream); call 0 returned 100% 106: 300: free(context->previous); 106: 301: context->previous = NULL; -: 302: } 2032: 303: return -1; -: 304:} -: 305: -: 306:#endif <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/#usr#include#webp#mux.h.gcov -: 0:Source:/usr/include/webp/mux.h -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/_webp.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/_webp.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:// Copyright 2011 Google Inc. All Rights Reserved. -: 2:// -: 3:// Use of this source code is governed by a BSD-style license -: 4:// that can be found in the COPYING file in the root of the source -: 5:// tree. An additional intellectual property rights grant can be found -: 6:// in the file PATENTS. All contributing project authors may -: 7:// be found in the AUTHORS file in the root of the source tree. -: 8:// ----------------------------------------------------------------------------- -: 9:// -: 10:// RIFF container manipulation and encoding for WebP images. -: 11:// -: 12:// Authors: Urvang (urvang@google.com) -: 13:// Vikas (vikasa@google.com) -: 14: -: 15:#ifndef WEBP_WEBP_MUX_H_ -: 16:#define WEBP_WEBP_MUX_H_ -: 17: -: 18:#include "./mux_types.h" -: 19: -: 20:#ifdef __cplusplus -: 21:extern "C" { -: 22:#endif -: 23: -: 24:#define WEBP_MUX_ABI_VERSION 0x0108 // MAJOR(8b) + MINOR(8b) -: 25: -: 26://------------------------------------------------------------------------------ -: 27:// Mux API -: 28:// -: 29:// This API allows manipulation of WebP container images containing features -: 30:// like color profile, metadata, animation. -: 31:// -: 32:// Code Example#1: Create a WebPMux object with image data, color profile and -: 33:// XMP metadata. -: 34:/* -: 35: int copy_data = 0; -: 36: WebPMux* mux = WebPMuxNew(); -: 37: // ... (Prepare image data). -: 38: WebPMuxSetImage(mux, &image, copy_data); -: 39: // ... (Prepare ICCP color profile data). -: 40: WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data); -: 41: // ... (Prepare XMP metadata). -: 42: WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data); -: 43: // Get data from mux in WebP RIFF format. -: 44: WebPMuxAssemble(mux, &output_data); -: 45: WebPMuxDelete(mux); -: 46: // ... (Consume output_data; e.g. write output_data.bytes to file). -: 47: WebPDataClear(&output_data); -: 48:*/ -: 49: -: 50:// Code Example#2: Get image and color profile data from a WebP file. -: 51:/* -: 52: int copy_data = 0; -: 53: // ... (Read data from file). -: 54: WebPMux* mux = WebPMuxCreate(&data, copy_data); -: 55: WebPMuxGetFrame(mux, 1, &image); -: 56: // ... (Consume image; e.g. call WebPDecode() to decode the data). -: 57: WebPMuxGetChunk(mux, "ICCP", &icc_profile); -: 58: // ... (Consume icc_data). -: 59: WebPMuxDelete(mux); -: 60: WebPFree(data); -: 61:*/ -: 62: -: 63:// Note: forward declaring enumerations is not allowed in (strict) C and C++, -: 64:// the types are left here for reference. -: 65:// typedef enum WebPMuxError WebPMuxError; -: 66:// typedef enum WebPChunkId WebPChunkId; -: 67:typedef struct WebPMux WebPMux; // main opaque object. -: 68:typedef struct WebPMuxFrameInfo WebPMuxFrameInfo; -: 69:typedef struct WebPMuxAnimParams WebPMuxAnimParams; -: 70:typedef struct WebPAnimEncoderOptions WebPAnimEncoderOptions; -: 71: -: 72:// Error codes -: 73:typedef enum WebPMuxError { -: 74: WEBP_MUX_OK = 1, -: 75: WEBP_MUX_NOT_FOUND = 0, -: 76: WEBP_MUX_INVALID_ARGUMENT = -1, -: 77: WEBP_MUX_BAD_DATA = -2, -: 78: WEBP_MUX_MEMORY_ERROR = -3, -: 79: WEBP_MUX_NOT_ENOUGH_DATA = -4 -: 80:} WebPMuxError; -: 81: -: 82:// IDs for different types of chunks. -: 83:typedef enum WebPChunkId { -: 84: WEBP_CHUNK_VP8X, // VP8X -: 85: WEBP_CHUNK_ICCP, // ICCP -: 86: WEBP_CHUNK_ANIM, // ANIM -: 87: WEBP_CHUNK_ANMF, // ANMF -: 88: WEBP_CHUNK_DEPRECATED, // (deprecated from FRGM) -: 89: WEBP_CHUNK_ALPHA, // ALPH -: 90: WEBP_CHUNK_IMAGE, // VP8/VP8L -: 91: WEBP_CHUNK_EXIF, // EXIF -: 92: WEBP_CHUNK_XMP, // XMP -: 93: WEBP_CHUNK_UNKNOWN, // Other chunks. -: 94: WEBP_CHUNK_NIL -: 95:} WebPChunkId; -: 96: -: 97://------------------------------------------------------------------------------ -: 98: -: 99:// Returns the version number of the mux library, packed in hexadecimal using -: 100:// 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507. -: 101:WEBP_EXTERN int WebPGetMuxVersion(void); -: 102: -: 103://------------------------------------------------------------------------------ -: 104:// Life of a Mux object -: 105: -: 106:// Internal, version-checked, entry point -: 107:WEBP_EXTERN WebPMux* WebPNewInternal(int); -: 108: -: 109:// Creates an empty mux object. -: 110:// Returns: -: 111:// A pointer to the newly created empty mux object. -: 112:// Or NULL in case of memory error. -: 113:static WEBP_INLINE WebPMux* WebPMuxNew(void) { 16: 114: return WebPNewInternal(WEBP_MUX_ABI_VERSION); call 0 returned 100% -: 115:} -: 116: -: 117:// Deletes the mux object. -: 118:// Parameters: -: 119:// mux - (in/out) object to be deleted -: 120:WEBP_EXTERN void WebPMuxDelete(WebPMux* mux); -: 121: -: 122://------------------------------------------------------------------------------ -: 123:// Mux creation. -: 124: -: 125:// Internal, version-checked, entry point -: 126:WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int, int); -: 127: -: 128:// Creates a mux object from raw data given in WebP RIFF format. -: 129:// Parameters: -: 130:// bitstream - (in) the bitstream data in WebP RIFF format -: 131:// copy_data - (in) value 1 indicates given data WILL be copied to the mux -: 132:// object and value 0 indicates data will NOT be copied. -: 133:// Returns: -: 134:// A pointer to the mux object created from given data - on success. -: 135:// NULL - In case of invalid data or memory error. -: 136:static WEBP_INLINE WebPMux* WebPMuxCreate(const WebPData* bitstream, -: 137: int copy_data) { 1: 138: return WebPMuxCreateInternal(bitstream, copy_data, WEBP_MUX_ABI_VERSION); call 0 never executed call 1 returned 100% -: 139:} -: 140: -: 141://------------------------------------------------------------------------------ -: 142:// Non-image chunks. -: 143: -: 144:// Note: Only non-image related chunks should be managed through chunk APIs. -: 145:// (Image related chunks are: "ANMF", "VP8 ", "VP8L" and "ALPH"). -: 146:// To add, get and delete images, use WebPMuxSetImage(), WebPMuxPushFrame(), -: 147:// WebPMuxGetFrame() and WebPMuxDeleteFrame(). -: 148: -: 149:// Adds a chunk with id 'fourcc' and data 'chunk_data' in the mux object. -: 150:// Any existing chunk(s) with the same id will be removed. -: 151:// Parameters: -: 152:// mux - (in/out) object to which the chunk is to be added -: 153:// fourcc - (in) a character array containing the fourcc of the given chunk; -: 154:// e.g., "ICCP", "XMP ", "EXIF" etc. -: 155:// chunk_data - (in) the chunk data to be added -: 156:// copy_data - (in) value 1 indicates given data WILL be copied to the mux -: 157:// object and value 0 indicates data will NOT be copied. -: 158:// Returns: -: 159:// WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL -: 160:// or if fourcc corresponds to an image chunk. -: 161:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 162:// WEBP_MUX_OK - on success. -: 163:WEBP_EXTERN WebPMuxError WebPMuxSetChunk( -: 164: WebPMux* mux, const char fourcc[4], const WebPData* chunk_data, -: 165: int copy_data); -: 166: -: 167:// Gets a reference to the data of the chunk with id 'fourcc' in the mux object. -: 168:// The caller should NOT free the returned data. -: 169:// Parameters: -: 170:// mux - (in) object from which the chunk data is to be fetched -: 171:// fourcc - (in) a character array containing the fourcc of the chunk; -: 172:// e.g., "ICCP", "XMP ", "EXIF" etc. -: 173:// chunk_data - (out) returned chunk data -: 174:// Returns: -: 175:// WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL -: 176:// or if fourcc corresponds to an image chunk. -: 177:// WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given id. -: 178:// WEBP_MUX_OK - on success. -: 179:WEBP_EXTERN WebPMuxError WebPMuxGetChunk( -: 180: const WebPMux* mux, const char fourcc[4], WebPData* chunk_data); -: 181: -: 182:// Deletes the chunk with the given 'fourcc' from the mux object. -: 183:// Parameters: -: 184:// mux - (in/out) object from which the chunk is to be deleted -: 185:// fourcc - (in) a character array containing the fourcc of the chunk; -: 186:// e.g., "ICCP", "XMP ", "EXIF" etc. -: 187:// Returns: -: 188:// WEBP_MUX_INVALID_ARGUMENT - if mux or fourcc is NULL -: 189:// or if fourcc corresponds to an image chunk. -: 190:// WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given fourcc. -: 191:// WEBP_MUX_OK - on success. -: 192:WEBP_EXTERN WebPMuxError WebPMuxDeleteChunk( -: 193: WebPMux* mux, const char fourcc[4]); -: 194: -: 195://------------------------------------------------------------------------------ -: 196:// Images. -: 197: -: 198:// Encapsulates data about a single frame. -: 199:struct WebPMuxFrameInfo { -: 200: WebPData bitstream; // image data: can be a raw VP8/VP8L bitstream -: 201: // or a single-image WebP file. -: 202: int x_offset; // x-offset of the frame. -: 203: int y_offset; // y-offset of the frame. -: 204: int duration; // duration of the frame (in milliseconds). -: 205: -: 206: WebPChunkId id; // frame type: should be one of WEBP_CHUNK_ANMF -: 207: // or WEBP_CHUNK_IMAGE -: 208: WebPMuxAnimDispose dispose_method; // Disposal method for the frame. -: 209: WebPMuxAnimBlend blend_method; // Blend operation for the frame. -: 210: uint32_t pad[1]; // padding for later use -: 211:}; -: 212: -: 213:// Sets the (non-animated) image in the mux object. -: 214:// Note: Any existing images (including frames) will be removed. -: 215:// Parameters: -: 216:// mux - (in/out) object in which the image is to be set -: 217:// bitstream - (in) can be a raw VP8/VP8L bitstream or a single-image -: 218:// WebP file (non-animated) -: 219:// copy_data - (in) value 1 indicates given data WILL be copied to the mux -: 220:// object and value 0 indicates data will NOT be copied. -: 221:// Returns: -: 222:// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or bitstream is NULL. -: 223:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 224:// WEBP_MUX_OK - on success. -: 225:WEBP_EXTERN WebPMuxError WebPMuxSetImage( -: 226: WebPMux* mux, const WebPData* bitstream, int copy_data); -: 227: -: 228:// Adds a frame at the end of the mux object. -: 229:// Notes: (1) frame.id should be WEBP_CHUNK_ANMF -: 230:// (2) For setting a non-animated image, use WebPMuxSetImage() instead. -: 231:// (3) Type of frame being pushed must be same as the frames in mux. -: 232:// (4) As WebP only supports even offsets, any odd offset will be snapped -: 233:// to an even location using: offset &= ~1 -: 234:// Parameters: -: 235:// mux - (in/out) object to which the frame is to be added -: 236:// frame - (in) frame data. -: 237:// copy_data - (in) value 1 indicates given data WILL be copied to the mux -: 238:// object and value 0 indicates data will NOT be copied. -: 239:// Returns: -: 240:// WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL -: 241:// or if content of 'frame' is invalid. -: 242:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 243:// WEBP_MUX_OK - on success. -: 244:WEBP_EXTERN WebPMuxError WebPMuxPushFrame( -: 245: WebPMux* mux, const WebPMuxFrameInfo* frame, int copy_data); -: 246: -: 247:// Gets the nth frame from the mux object. -: 248:// The content of 'frame->bitstream' is allocated using WebPMalloc(), and NOT -: 249:// owned by the 'mux' object. It MUST be deallocated by the caller by calling -: 250:// WebPDataClear(). -: 251:// nth=0 has a special meaning - last position. -: 252:// Parameters: -: 253:// mux - (in) object from which the info is to be fetched -: 254:// nth - (in) index of the frame in the mux object -: 255:// frame - (out) data of the returned frame -: 256:// Returns: -: 257:// WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL. -: 258:// WEBP_MUX_NOT_FOUND - if there are less than nth frames in the mux object. -: 259:// WEBP_MUX_BAD_DATA - if nth frame chunk in mux is invalid. -: 260:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 261:// WEBP_MUX_OK - on success. -: 262:WEBP_EXTERN WebPMuxError WebPMuxGetFrame( -: 263: const WebPMux* mux, uint32_t nth, WebPMuxFrameInfo* frame); -: 264: -: 265:// Deletes a frame from the mux object. -: 266:// nth=0 has a special meaning - last position. -: 267:// Parameters: -: 268:// mux - (in/out) object from which a frame is to be deleted -: 269:// nth - (in) The position from which the frame is to be deleted -: 270:// Returns: -: 271:// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL. -: 272:// WEBP_MUX_NOT_FOUND - If there are less than nth frames in the mux object -: 273:// before deletion. -: 274:// WEBP_MUX_OK - on success. -: 275:WEBP_EXTERN WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth); -: 276: -: 277://------------------------------------------------------------------------------ -: 278:// Animation. -: 279: -: 280:// Animation parameters. -: 281:struct WebPMuxAnimParams { -: 282: uint32_t bgcolor; // Background color of the canvas stored (in MSB order) as: -: 283: // Bits 00 to 07: Alpha. -: 284: // Bits 08 to 15: Red. -: 285: // Bits 16 to 23: Green. -: 286: // Bits 24 to 31: Blue. -: 287: int loop_count; // Number of times to repeat the animation [0 = infinite]. -: 288:}; -: 289: -: 290:// Sets the animation parameters in the mux object. Any existing ANIM chunks -: 291:// will be removed. -: 292:// Parameters: -: 293:// mux - (in/out) object in which ANIM chunk is to be set/added -: 294:// params - (in) animation parameters. -: 295:// Returns: -: 296:// WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL. -: 297:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 298:// WEBP_MUX_OK - on success. -: 299:WEBP_EXTERN WebPMuxError WebPMuxSetAnimationParams( -: 300: WebPMux* mux, const WebPMuxAnimParams* params); -: 301: -: 302:// Gets the animation parameters from the mux object. -: 303:// Parameters: -: 304:// mux - (in) object from which the animation parameters to be fetched -: 305:// params - (out) animation parameters extracted from the ANIM chunk -: 306:// Returns: -: 307:// WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL. -: 308:// WEBP_MUX_NOT_FOUND - if ANIM chunk is not present in mux object. -: 309:// WEBP_MUX_OK - on success. -: 310:WEBP_EXTERN WebPMuxError WebPMuxGetAnimationParams( -: 311: const WebPMux* mux, WebPMuxAnimParams* params); -: 312: -: 313://------------------------------------------------------------------------------ -: 314:// Misc Utilities. -: 315: -: 316:// Sets the canvas size for the mux object. The width and height can be -: 317:// specified explicitly or left as zero (0, 0). -: 318:// * When width and height are specified explicitly, then this frame bound is -: 319:// enforced during subsequent calls to WebPMuxAssemble() and an error is -: 320:// reported if any animated frame does not completely fit within the canvas. -: 321:// * When unspecified (0, 0), the constructed canvas will get the frame bounds -: 322:// from the bounding-box over all frames after calling WebPMuxAssemble(). -: 323:// Parameters: -: 324:// mux - (in) object to which the canvas size is to be set -: 325:// width - (in) canvas width -: 326:// height - (in) canvas height -: 327:// Returns: -: 328:// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL; or -: 329:// width or height are invalid or out of bounds -: 330:// WEBP_MUX_OK - on success. -: 331:WEBP_EXTERN WebPMuxError WebPMuxSetCanvasSize(WebPMux* mux, -: 332: int width, int height); -: 333: -: 334:// Gets the canvas size from the mux object. -: 335:// Note: This method assumes that the VP8X chunk, if present, is up-to-date. -: 336:// That is, the mux object hasn't been modified since the last call to -: 337:// WebPMuxAssemble() or WebPMuxCreate(). -: 338:// Parameters: -: 339:// mux - (in) object from which the canvas size is to be fetched -: 340:// width - (out) canvas width -: 341:// height - (out) canvas height -: 342:// Returns: -: 343:// WEBP_MUX_INVALID_ARGUMENT - if mux, width or height is NULL. -: 344:// WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid. -: 345:// WEBP_MUX_OK - on success. -: 346:WEBP_EXTERN WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux, -: 347: int* width, int* height); -: 348: -: 349:// Gets the feature flags from the mux object. -: 350:// Note: This method assumes that the VP8X chunk, if present, is up-to-date. -: 351:// That is, the mux object hasn't been modified since the last call to -: 352:// WebPMuxAssemble() or WebPMuxCreate(). -: 353:// Parameters: -: 354:// mux - (in) object from which the features are to be fetched -: 355:// flags - (out) the flags specifying which features are present in the -: 356:// mux object. This will be an OR of various flag values. -: 357:// Enum 'WebPFeatureFlags' can be used to test individual flag values. -: 358:// Returns: -: 359:// WEBP_MUX_INVALID_ARGUMENT - if mux or flags is NULL. -: 360:// WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid. -: 361:// WEBP_MUX_OK - on success. -: 362:WEBP_EXTERN WebPMuxError WebPMuxGetFeatures(const WebPMux* mux, -: 363: uint32_t* flags); -: 364: -: 365:// Gets number of chunks with the given 'id' in the mux object. -: 366:// Parameters: -: 367:// mux - (in) object from which the info is to be fetched -: 368:// id - (in) chunk id specifying the type of chunk -: 369:// num_elements - (out) number of chunks with the given chunk id -: 370:// Returns: -: 371:// WEBP_MUX_INVALID_ARGUMENT - if mux, or num_elements is NULL. -: 372:// WEBP_MUX_OK - on success. -: 373:WEBP_EXTERN WebPMuxError WebPMuxNumChunks(const WebPMux* mux, -: 374: WebPChunkId id, int* num_elements); -: 375: -: 376:// Assembles all chunks in WebP RIFF format and returns in 'assembled_data'. -: 377:// This function also validates the mux object. -: 378:// Note: The content of 'assembled_data' will be ignored and overwritten. -: 379:// Also, the content of 'assembled_data' is allocated using WebPMalloc(), and -: 380:// NOT owned by the 'mux' object. It MUST be deallocated by the caller by -: 381:// calling WebPDataClear(). It's always safe to call WebPDataClear() upon -: 382:// return, even in case of error. -: 383:// Parameters: -: 384:// mux - (in/out) object whose chunks are to be assembled -: 385:// assembled_data - (out) assembled WebP data -: 386:// Returns: -: 387:// WEBP_MUX_BAD_DATA - if mux object is invalid. -: 388:// WEBP_MUX_INVALID_ARGUMENT - if mux or assembled_data is NULL. -: 389:// WEBP_MUX_MEMORY_ERROR - on memory allocation error. -: 390:// WEBP_MUX_OK - on success. -: 391:WEBP_EXTERN WebPMuxError WebPMuxAssemble(WebPMux* mux, -: 392: WebPData* assembled_data); -: 393: -: 394://------------------------------------------------------------------------------ -: 395:// WebPAnimEncoder API -: 396:// -: 397:// This API allows encoding (possibly) animated WebP images. -: 398:// -: 399:// Code Example: -: 400:/* -: 401: WebPAnimEncoderOptions enc_options; -: 402: WebPAnimEncoderOptionsInit(&enc_options); -: 403: // Tune 'enc_options' as needed. -: 404: WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options); -: 405: while() { -: 406: WebPConfig config; -: 407: WebPConfigInit(&config); -: 408: // Tune 'config' as needed. -: 409: WebPAnimEncoderAdd(enc, frame, timestamp_ms, &config); -: 410: } -: 411: WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL); -: 412: WebPAnimEncoderAssemble(enc, webp_data); -: 413: WebPAnimEncoderDelete(enc); -: 414: // Write the 'webp_data' to a file, or re-mux it further. -: 415:*/ -: 416: -: 417:typedef struct WebPAnimEncoder WebPAnimEncoder; // Main opaque object. -: 418: -: 419:// Forward declarations. Defined in encode.h. -: 420:struct WebPPicture; -: 421:struct WebPConfig; -: 422: -: 423:// Global options. -: 424:struct WebPAnimEncoderOptions { -: 425: WebPMuxAnimParams anim_params; // Animation parameters. -: 426: int minimize_size; // If true, minimize the output size (slow). Implicitly -: 427: // disables key-frame insertion. -: 428: int kmin; -: 429: int kmax; // Minimum and maximum distance between consecutive key -: 430: // frames in the output. The library may insert some key -: 431: // frames as needed to satisfy this criteria. -: 432: // Note that these conditions should hold: kmax > kmin -: 433: // and kmin >= kmax / 2 + 1. Also, if kmax <= 0, then -: 434: // key-frame insertion is disabled; and if kmax == 1, -: 435: // then all frames will be key-frames (kmin value does -: 436: // not matter for these special cases). -: 437: int allow_mixed; // If true, use mixed compression mode; may choose -: 438: // either lossy and lossless for each frame. -: 439: int verbose; // If true, print info and warning messages to stderr. -: 440: -: 441: uint32_t padding[4]; // Padding for later use. -: 442:}; -: 443: -: 444:// Internal, version-checked, entry point. -: 445:WEBP_EXTERN int WebPAnimEncoderOptionsInitInternal( -: 446: WebPAnimEncoderOptions*, int); -: 447: -: 448:// Should always be called, to initialize a fresh WebPAnimEncoderOptions -: 449:// structure before modification. Returns false in case of version mismatch. -: 450:// WebPAnimEncoderOptionsInit() must have succeeded before using the -: 451:// 'enc_options' object. -: 452:static WEBP_INLINE int WebPAnimEncoderOptionsInit( -: 453: WebPAnimEncoderOptions* enc_options) { 7: 454: return WebPAnimEncoderOptionsInitInternal(enc_options, WEBP_MUX_ABI_VERSION); call 0 returned 100% -: 455:} -: 456: -: 457:// Internal, version-checked, entry point. -: 458:WEBP_EXTERN WebPAnimEncoder* WebPAnimEncoderNewInternal( -: 459: int, int, const WebPAnimEncoderOptions*, int); -: 460: -: 461:// Creates and initializes a WebPAnimEncoder object. -: 462:// Parameters: -: 463:// width/height - (in) canvas width and height of the animation. -: 464:// enc_options - (in) encoding options; can be passed NULL to pick -: 465:// reasonable defaults. -: 466:// Returns: -: 467:// A pointer to the newly created WebPAnimEncoder object. -: 468:// Or NULL in case of memory error. -: 469:static WEBP_INLINE WebPAnimEncoder* WebPAnimEncoderNew( -: 470: int width, int height, const WebPAnimEncoderOptions* enc_options) { 7: 471: return WebPAnimEncoderNewInternal(width, height, enc_options, call 0 returned 100% -: 472: WEBP_MUX_ABI_VERSION); -: 473:} -: 474: -: 475:// Optimize the given frame for WebP, encode it and add it to the -: 476:// WebPAnimEncoder object. -: 477:// The last call to 'WebPAnimEncoderAdd' should be with frame = NULL, which -: 478:// indicates that no more frames are to be added. This call is also used to -: 479:// determine the duration of the last frame. -: 480:// Parameters: -: 481:// enc - (in/out) object to which the frame is to be added. -: 482:// frame - (in/out) frame data in ARGB or YUV(A) format. If it is in YUV(A) -: 483:// format, it will be converted to ARGB, which incurs a small loss. -: 484:// timestamp_ms - (in) timestamp of this frame in milliseconds. -: 485:// Duration of a frame would be calculated as -: 486:// "timestamp of next frame - timestamp of this frame". -: 487:// Hence, timestamps should be in non-decreasing order. -: 488:// config - (in) encoding options; can be passed NULL to pick -: 489:// reasonable defaults. -: 490:// Returns: -: 491:// On error, returns false and frame->error_code is set appropriately. -: 492:// Otherwise, returns true. -: 493:WEBP_EXTERN int WebPAnimEncoderAdd( -: 494: WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms, -: 495: const struct WebPConfig* config); -: 496: -: 497:// Assemble all frames added so far into a WebP bitstream. -: 498:// This call should be preceded by a call to 'WebPAnimEncoderAdd' with -: 499:// frame = NULL; if not, the duration of the last frame will be internally -: 500:// estimated. -: 501:// Parameters: -: 502:// enc - (in/out) object from which the frames are to be assembled. -: 503:// webp_data - (out) generated WebP bitstream. -: 504:// Returns: -: 505:// True on success. -: 506:WEBP_EXTERN int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, -: 507: WebPData* webp_data); -: 508: -: 509:// Get error string corresponding to the most recent call using 'enc'. The -: 510:// returned string is owned by 'enc' and is valid only until the next call to -: 511:// WebPAnimEncoderAdd() or WebPAnimEncoderAssemble() or WebPAnimEncoderDelete(). -: 512:// Parameters: -: 513:// enc - (in/out) object from which the error string is to be fetched. -: 514:// Returns: -: 515:// NULL if 'enc' is NULL. Otherwise, returns the error string if the last call -: 516:// to 'enc' had an error, or an empty string if the last call was a success. -: 517:WEBP_EXTERN const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc); -: 518: -: 519:// Deletes the WebPAnimEncoder object. -: 520:// Parameters: -: 521:// enc - (in/out) object to be deleted -: 522:WEBP_EXTERN void WebPAnimEncoderDelete(WebPAnimEncoder* enc); -: 523: -: 524://------------------------------------------------------------------------------ -: 525: -: 526:#ifdef __cplusplus -: 527:} // extern "C" -: 528:#endif -: 529: -: 530:#endif // WEBP_WEBP_MUX_H_ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#QuantHeap.c.gcov -: 0:Source:src/libImaging/QuantHeap.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/QuantHeap.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/QuantHeap.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * heap data type used by the image quantizer -: 6: * -: 7: * history: -: 8: * 98-09-10 tjs Contributed -: 9: * 98-12-29 fl Added to PIL 1.0b1 -: 10: * -: 11: * Written by Toby J Sargeant . -: 12: * -: 13: * Copyright (c) 1998 by Toby J Sargeant -: 14: * Copyright (c) 1998 by Secret Labs AB -: 15: * -: 16: * See the README file for information on usage and redistribution. -: 17: */ -: 18: -: 19:#include -: 20:#include -: 21:#include -: 22:#include -: 23:#include -: 24: -: 25:#include "QuantHeap.h" -: 26: -: 27:struct _Heap { -: 28: void **heap; -: 29: unsigned int heapsize; -: 30: unsigned int heapcount; -: 31: HeapCmpFunc cf; -: 32:}; -: 33: -: 34:#define INITIAL_SIZE 256 -: 35: -: 36:// #define DEBUG -: 37: -: 38:#ifdef DEBUG -: 39:static int _heap_test(Heap *); -: 40:#endif -: 41: function ImagingQuantHeapFree called 12 returned 100% blocks executed 100% 12: 42:void ImagingQuantHeapFree(Heap *h) { 12: 43: free(h->heap); 12: 44: free(h); 12: 45:} -: 46: function _heap_grow.isra.0 called 1 returned 100% blocks executed 100% 1: 47:static int _heap_grow(Heap *h,unsigned int newsize) { -: 48: void *newheap; 1: 49: if (!newsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 1: 50: newsize=h->heapsize<<1; -: 51: } 1: 52: if (newsizeheapsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 53: return 0; -: 54: } 1: 55: if (newsize > INT_MAX / sizeof(void *)){ branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 56: return 0; -: 57: } -: 58: /* malloc check ok, using calloc for overflow, also checking -: 59: above due to memcpy below*/ 1: 60: newheap=calloc(newsize, sizeof(void *)); 1: 61: if (!newheap) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 62: return 0; -: 63: } 2: 64: memcpy(newheap,h->heap,sizeof(void *)*h->heapsize); 1: 65: free(h->heap); 1: 66: h->heap=newheap; 1: 67: h->heapsize=newsize; -: 68: return 1; -: 69:} -: 70: -: 71:#ifdef DEBUG -: 72:static int _heap_test(Heap *h) { -: 73: unsigned int k; -: 74: for (k=1;k*2<=h->heapcount;k++) { -: 75: if (h->cf(h,h->heap[k],h->heap[k*2])<0) { -: 76: printf ("heap is bad\n"); -: 77: return 0; -: 78: } -: 79: if (k*2+1<=h->heapcount && h->cf(h,h->heap[k],h->heap[k*2+1])<0) { -: 80: printf ("heap is bad\n"); -: 81: return 0; -: 82: } -: 83: } -: 84: return 1; -: 85:} -: 86:#endif -: 87: function ImagingQuantHeapRemove called 2367 returned 100% blocks executed 100% 2367: 88:int ImagingQuantHeapRemove(Heap* h,void **r) { -: 89: unsigned int k,l; -: 90: void *v; -: 91: 2367: 92: if (!h->heapcount) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 93: return 0; -: 94: } 2363: 95: *r=h->heap[1]; 2363: 96: v=h->heap[h->heapcount--]; 14863: 97: for (k=1;k*2<=h->heapcount;k=l) { branch 0 taken 85% branch 1 taken 15% (fallthrough) 12623: 98: l=k*2; 12623: 99: if (lheapcount) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 12533: 100: if (h->cf(h,h->heap[l],h->heap[l+1])<0) { call 0 returned 100% branch 1 taken 48% (fallthrough) branch 2 taken 52% 6005: 101: l++; -: 102: } -: 103: } 12623: 104: if (h->cf(h,v,h->heap[l])>0) { call 0 returned 100% branch 1 taken 99% (fallthrough) branch 2 taken 1% -: 105: break; -: 106: } 12500: 107: h->heap[k]=h->heap[l]; -: 108: } 2363: 109: h->heap[k]=v; -: 110:#ifdef DEBUG -: 111: if (!_heap_test(h)) { printf ("oops - heap_remove messed up the heap\n"); exit(1); } -: 112:#endif 2363: 113: return 1; -: 114:} -: 115: function ImagingQuantHeapAdd called 4108 returned 100% blocks executed 100% 4108: 116:int ImagingQuantHeapAdd(Heap *h,void *val) { -: 117: int k; 4108: 118: if (h->heapcount==h->heapsize-1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 119: _heap_grow(h,0); call 0 returned 100% -: 120: } 4108: 121: k=++h->heapcount; 10466: 122: while (k!=1) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 6318: 123: if (h->cf(h,val,h->heap[k/2])<=0) { call 0 returned 100% branch 1 taken 36% (fallthrough) branch 2 taken 64% -: 124: break; -: 125: } 2250: 126: h->heap[k]=h->heap[k/2]; 2250: 127: k>>=1; -: 128: } 4108: 129: h->heap[k]=val; -: 130:#ifdef DEBUG -: 131: if (!_heap_test(h)) { printf ("oops - heap_add messed up the heap\n"); exit(1); } -: 132:#endif 4108: 133: return 1; -: 134:} -: 135: function ImagingQuantHeapTop called 0 returned 0% blocks executed 0% #####: 136:int ImagingQuantHeapTop(Heap *h,void **r) { #####: 137: if (!h->heapcount) { branch 0 never executed branch 1 never executed -: 138: return 0; -: 139: } #####: 140: *r=h->heap[1]; #####: 141: return 1; -: 142:} -: 143: function ImagingQuantHeapNew called 12 returned 100% blocks executed 80% 12: 144:Heap *ImagingQuantHeapNew(HeapCmpFunc cf) { -: 145: Heap *h; -: 146: -: 147: /* malloc check ok, small constant allocation */ 12: 148: h=malloc(sizeof(Heap)); 12: 149: if (!h) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 150: return NULL; -: 151: } 12: 152: h->heapsize=INITIAL_SIZE; -: 153: /* malloc check ok, using calloc for overflow */ 12: 154: h->heap=calloc(h->heapsize, sizeof(void *)); 12: 155: if (!h->heap) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 156: free(h); #####: 157: return NULL; -: 158: } 12: 159: h->heapcount=0; 12: 160: h->cf=cf; 12: 161: return h; -: 162:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#SgiRleDecode.c.gcov -: 0:Source:src/libImaging/SgiRleDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/SgiRleDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/SgiRleDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for Sgi RLE data. -: 6: * -: 7: * history: -: 8: * 2017-07-28 mb fixed for images larger than 64KB -: 9: * 2017-07-20 mb created -: 10: * -: 11: * Copyright (c) Mickael Bonfill 2017. -: 12: * -: 13: * See the README file for information on usage and redistribution. -: 14: */ -: 15: -: 16:#include "Imaging.h" -: 17:#include "Sgi.h" -: 18: -: 19:#define SGI_HEADER_SIZE 512 -: 20:#define RLE_COPY_FLAG 0x80 -: 21:#define RLE_MAX_RUN 0x7f -: 22: -: 23:static void read4B(UINT32* dest, UINT8* buf) -: 24:{ 7310: 25: *dest = (UINT32)((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]); -: 26:} -: 27: function expandrow called 390 returned 100% blocks executed 100% 390: 28:static int expandrow(UINT8* dest, UINT8* src, int n, int z, int xsize) -: 29:{ -: 30: UINT8 pixel, count; 390: 31: int x = 0; -: 32: 4029: 33: for (;n > 0; n--) branch 0 taken 100% branch 1 taken 0% (fallthrough) -: 34: { 4029: 35: pixel = *src++; 4029: 36: if (n == 1 && pixel != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 37: return n; -: 38: } 4029: 39: count = pixel & RLE_MAX_RUN; 4029: 40: if (!count) { branch 0 taken 10% (fallthrough) branch 1 taken 90% 389: 41: return count; -: 42: } 3640: 43: if (x + count > xsize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 44: return -1; -: 45: } 3639: 46: x += count; 3639: 47: if (pixel & RLE_COPY_FLAG) { branch 0 taken 42% (fallthrough) branch 1 taken 58% 44413: 48: while(count--) { branch 0 taken 97% branch 1 taken 3% 42875: 49: *dest = *src++; 42875: 50: dest += z; -: 51: } -: 52: -: 53: } -: 54: else { 2101: 55: pixel = *src++; 10993: 56: while (count--) { branch 0 taken 76% branch 1 taken 24% (fallthrough) 6791: 57: *dest = pixel; 6791: 58: dest += z; -: 59: } -: 60: } -: 61: -: 62: } -: 63: return 0; -: 64:} -: 65: function expandrow2 called 2289 returned 100% blocks executed 100% 2289: 66:static int expandrow2(UINT8* dest, const UINT8* src, int n, int z, int xsize) -: 67:{ -: 68: UINT8 pixel, count; -: 69: 2289: 70: int x = 0; -: 71: 27832: 72: for (;n > 0; n--) branch 0 taken 100% branch 1 taken 0% (fallthrough) -: 73: { 27832: 74: pixel = src[1]; 27832: 75: src+=2; 27832: 76: if (n == 1 && pixel != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 77: return n; -: 78: } 27832: 79: count = pixel & RLE_MAX_RUN; 27832: 80: if (!count) { branch 0 taken 8% (fallthrough) branch 1 taken 92% 2286: 81: return count; -: 82: } 25546: 83: if (x + count > xsize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% -: 84: return -1; -: 85: } 25543: 86: x += count; 25543: 87: if (pixel & RLE_COPY_FLAG) { branch 0 taken 57% (fallthrough) branch 1 taken 43% 790014: 88: while(count--) { branch 0 taken 99% branch 1 taken 1% 778949: 89: memcpy(dest, src, 2); 778949: 90: src += 2; 778949: 91: dest += z * 2; -: 92: } -: 93: } -: 94: else { 699326: 95: while (count--) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 684848: 96: memcpy(dest, src, 2); 684848: 97: dest += z * 2; -: 98: } 14478: 99: src+=2; -: 100: } -: 101: } -: 102: return 0; -: 103:} -: 104: -: 105: -: 106:int function ImagingSgiRleDecode called 7 returned 100% blocks executed 97% 7: 107:ImagingSgiRleDecode(Imaging im, ImagingCodecState state, -: 108: UINT8* buf, Py_ssize_t bytes) -: 109:{ -: 110: UINT8 *ptr; -: 111: SGISTATE *c; 7: 112: int err = 0; -: 113: int status; -: 114: -: 115: /* Get all data from File descriptor */ 7: 116: c = (SGISTATE*)state->context; 7: 117: _imaging_seek_pyFd(state->fd, 0L, SEEK_END); call 0 returned 100% 7: 118: c->bufsize = _imaging_tell_pyFd(state->fd); call 0 returned 100% 7: 119: c->bufsize -= SGI_HEADER_SIZE; 7: 120: ptr = malloc(sizeof(UINT8) * c->bufsize); 7: 121: if (!ptr) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 122: return IMAGING_CODEC_MEMORY; -: 123: } 7: 124: _imaging_seek_pyFd(state->fd, SGI_HEADER_SIZE, SEEK_SET); call 0 returned 100% 7: 125: _imaging_read_pyFd(state->fd, (char*)ptr, c->bufsize); call 0 returned 100% -: 126: -: 127: -: 128: /* decoder initialization */ 7: 129: state->count = 0; 7: 130: state->y = 0; 7: 131: if (state->ystep < 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 7: 132: state->y = im->ysize - 1; -: 133: } else { #####: 134: state->ystep = 1; -: 135: } -: 136: 14: 137: if (im->xsize > INT_MAX / im->bands || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 7: 138: im->ysize > INT_MAX / im->bands) { -: 139: err = IMAGING_CODEC_MEMORY; -: 140: goto sgi_finish_decode; -: 141: } -: 142: -: 143: /* Allocate memory for RLE tables and rows */ 7: 144: free(state->buffer); 7: 145: state->buffer = NULL; -: 146: /* malloc overflow check above */ 7: 147: state->buffer = calloc(im->xsize * im->bands, sizeof(UINT8) * 2); 7: 148: c->tablen = im->bands * im->ysize; 7: 149: c->starttab = calloc(c->tablen, sizeof(UINT32)); 7: 150: c->lengthtab = calloc(c->tablen, sizeof(UINT32)); 7: 151: if (!state->buffer || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 7: 152: !c->starttab || branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 153: !c->lengthtab) { -: 154: err = IMAGING_CODEC_MEMORY; -: 155: goto sgi_finish_decode; -: 156: } -: 157: /* populate offsets table */ 3662: 158: for (c->tabindex = 0, c->bufindex = 0; c->tabindex < c->tablen; c->tabindex++, c->bufindex+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 7310: 159: read4B(&c->starttab[c->tabindex], &ptr[c->bufindex]); -: 160: } -: 161: /* populate lengths table */ 3662: 162: for (c->tabindex = 0, c->bufindex = c->tablen * sizeof(UINT32); c->tabindex < c->tablen; c->tabindex++, c->bufindex+=4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 7310: 163: read4B(&c->lengthtab[c->tabindex], &ptr[c->bufindex]); -: 164: } -: 165: 7: 166: state->count += c->tablen * sizeof(UINT32) * 2; -: 167: -: 168: /* read compressed rows */ 898: 169: for (c->rowno = 0; c->rowno < im->ysize; c->rowno++, state->y += state->ystep) branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 170: { 3571: 171: for (c->channo = 0; c->channo < im->bands; c->channo++) branch 0 taken 75% branch 1 taken 25% (fallthrough) -: 172: { 2680: 173: c->rleoffset = c->starttab[c->rowno + c->channo * im->ysize]; 2680: 174: c->rlelength = c->lengthtab[c->rowno + c->channo * im->ysize]; 2680: 175: c->rleoffset -= SGI_HEADER_SIZE; -: 176: 2680: 177: if (c->rleoffset + c->rlelength > c->bufsize) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 1: 178: state->errcode = IMAGING_CODEC_OVERRUN; 1: 179: return -1; -: 180: } -: 181: -: 182: /* row decompression */ 2679: 183: if (c->bpc ==1) { branch 0 taken 15% (fallthrough) branch 1 taken 85% 390: 184: status = expandrow(&state->buffer[c->channo], &ptr[c->rleoffset], c->rlelength, im->bands, im->xsize); call 0 returned 100% -: 185: } -: 186: else { 2289: 187: status = expandrow2(&state->buffer[c->channo * 2], &ptr[c->rleoffset], c->rlelength, im->bands, im->xsize); call 0 returned 100% -: 188: } 2679: 189: if (status == -1) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 4: 190: state->errcode = IMAGING_CODEC_OVERRUN; 4: 191: return -1; 2675: 192: } else if (status == 1) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 193: goto sgi_finish_decode; -: 194: } -: 195: 2675: 196: state->count += c->rlelength; -: 197: } -: 198: -: 199: /* store decompressed data in image */ 891: 200: state->shuffle((UINT8*)im->image[state->y], state->buffer, im->xsize); call 0 returned 100% -: 201: -: 202: } -: 203: 2: 204: c->bufsize++; -: 205: -: 206:sgi_finish_decode: ; -: 207: 2: 208: free(c->starttab); 2: 209: free(c->lengthtab); 2: 210: free(ptr); 2: 211: if (err != 0){ branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 212: return err; -: 213: } 2: 214: return state->count - c->bufsize; -: 215:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Jpeg2KDecode.c.gcov -: 0:Source:src/libImaging/Jpeg2KDecode.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Jpeg2KDecode.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Jpeg2KDecode.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * decoder for JPEG2000 image data. -: 6: * -: 7: * history: -: 8: * 2014-03-12 ajh Created -: 9: * -: 10: * Copyright (c) 2014 Coriolis Systems Limited -: 11: * Copyright (c) 2014 Alastair Houghton -: 12: * -: 13: * See the README file for details on usage and redistribution. -: 14: */ -: 15: -: 16:#include "Imaging.h" -: 17: -: 18:#ifdef HAVE_OPENJPEG -: 19: -: 20:#include -: 21:#include "Jpeg2K.h" -: 22: -: 23:typedef struct { -: 24: OPJ_UINT32 tile_index; -: 25: OPJ_UINT32 data_size; -: 26: OPJ_INT32 x0, y0, x1, y1; -: 27: OPJ_UINT32 nb_comps; -: 28:} JPEG2KTILEINFO; -: 29: -: 30:/* -------------------------------------------------------------------- */ -: 31:/* Error handler */ -: 32:/* -------------------------------------------------------------------- */ -: 33: -: 34:static void function j2k_error called 0 returned 0% blocks executed 0% #####: 35:j2k_error(const char *msg, void *client_data) -: 36:{ #####: 37: JPEG2KDECODESTATE *state = (JPEG2KDECODESTATE *) client_data; #####: 38: free((void *)state->error_msg); #####: 39: state->error_msg = strdup(msg); call 0 never executed #####: 40:} -: 41: -: 42:/* -------------------------------------------------------------------- */ -: 43:/* Buffer input stream */ -: 44:/* -------------------------------------------------------------------- */ -: 45: -: 46:static OPJ_SIZE_T function j2k_read called 62 returned 100% blocks executed 100% 62: 47:j2k_read(void *p_buffer, OPJ_SIZE_T p_nb_bytes, void *p_user_data) -: 48:{ 62: 49: ImagingCodecState state = (ImagingCodecState)p_user_data; -: 50: 62: 51: size_t len = _imaging_read_pyFd(state->fd, p_buffer, p_nb_bytes); call 0 returned 100% -: 52: 62: 53: return len ? len : (OPJ_SIZE_T)-1; branch 0 taken 53% (fallthrough) branch 1 taken 47% -: 54:} -: 55: -: 56:static OPJ_OFF_T function j2k_skip called 0 returned 0% blocks executed 0% #####: 57:j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) -: 58:{ -: 59: off_t pos; #####: 60: ImagingCodecState state = (ImagingCodecState)p_user_data; -: 61: #####: 62: _imaging_seek_pyFd(state->fd, p_nb_bytes, SEEK_CUR); call 0 never executed #####: 63: pos = _imaging_tell_pyFd(state->fd); call 0 never executed -: 64: #####: 65: return pos ? pos : (OPJ_OFF_T)-1; branch 0 never executed branch 1 never executed -: 66:} -: 67: -: 68:/* -------------------------------------------------------------------- */ -: 69:/* Unpackers */ -: 70:/* -------------------------------------------------------------------- */ -: 71: -: 72:typedef void (*j2k_unpacker_t)(opj_image_t *in, -: 73: const JPEG2KTILEINFO *tileInfo, -: 74: const UINT8 *data, -: 75: Imaging im); -: 76: -: 77:struct j2k_decode_unpacker { -: 78: const char *mode; -: 79: OPJ_COLOR_SPACE color_space; -: 80: unsigned components; -: 81: j2k_unpacker_t unpacker; -: 82:}; -: 83: -: 84:static inline -: 85:unsigned j2ku_shift(unsigned x, int n) -: 86:{ 19927296: 87: if (n < 0) { branch 0 never executed branch 1 never executed branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 never executed branch 5 never executed branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 taken 0% (fallthrough) branch 21 taken 100% branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed #####: 88: return x >> -n; -: 89: } else { 19927296: 90: return x << n; -: 91: } -: 92:} -: 93: -: 94:static void function j2ku_gray_l called 0 returned 0% blocks executed 0% #####: 95:j2ku_gray_l(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 96: const UINT8 *tiledata, Imaging im) -: 97:{ #####: 98: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 99: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 100: unsigned h = tileinfo->y1 - tileinfo->y0; -: 101: #####: 102: int shift = 8 - in->comps[0].prec; #####: 103: int offset = in->comps[0].sgnd ? 1 << (in->comps[0].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 104: int csiz = (in->comps[0].prec + 7) >> 3; -: 105: -: 106: unsigned x, y; -: 107: #####: 108: if (csiz == 3) { branch 0 never executed branch 1 never executed #####: 109: csiz = 4; -: 110: } -: 111: #####: 112: if (shift < 0) { branch 0 never executed branch 1 never executed #####: 113: offset += 1 << (-shift - 1); -: 114: } -: 115: -: 116: /* csiz*h*w + offset = tileinfo.datasize */ #####: 117: switch (csiz) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 118: case 1: #####: 119: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 120: const UINT8 *data = &tiledata[y * w]; #####: 121: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 122: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 123: *row++ = j2ku_shift(offset + *data++, shift); -: 124: } -: 125: } -: 126: break; -: 127: case 2: #####: 128: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 129: const UINT16 *data = (const UINT16 *)&tiledata[2 * y * w]; #####: 130: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 131: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 132: *row++ = j2ku_shift(offset + *data++, shift); -: 133: } -: 134: } -: 135: break; -: 136: case 4: #####: 137: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 138: const UINT32 *data = (const UINT32 *)&tiledata[4 * y * w]; #####: 139: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 140: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 141: *row++ = j2ku_shift(offset + *data++, shift); -: 142: } -: 143: } -: 144: break; -: 145: } #####: 146:} -: 147: -: 148: -: 149:static void function j2ku_gray_i called 8 returned 100% blocks executed 37% 8: 150:j2ku_gray_i(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 151: const UINT8 *tiledata, Imaging im) -: 152:{ 8: 153: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; 8: 154: unsigned w = tileinfo->x1 - tileinfo->x0; 8: 155: unsigned h = tileinfo->y1 - tileinfo->y0; -: 156: 8: 157: int shift = 16 - in->comps[0].prec; 8: 158: int offset = in->comps[0].sgnd ? 1 << (in->comps[0].prec - 1) : 0; branch 0 taken 0% (fallthrough) branch 1 taken 100% 8: 159: int csiz = (in->comps[0].prec + 7) >> 3; -: 160: -: 161: unsigned x, y; -: 162: 8: 163: if (csiz == 3) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 164: csiz = 4; -: 165: } -: 166: 8: 167: if (shift < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 168: offset += 1 << (-shift - 1); -: 169: } -: 170: 8: 171: switch (csiz) { branch 0 taken 0% branch 1 taken 100% branch 2 taken 0% branch 3 taken 0% -: 172: case 1: #####: 173: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 174: const UINT8 *data = &tiledata[y * w]; #####: 175: UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; #####: 176: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 177: *row++ = j2ku_shift(offset + *data++, shift); -: 178: } -: 179: } -: 180: break; -: 181: case 2: 512: 182: for (y = 0; y < h; ++y) { branch 0 taken 98% branch 1 taken 2% 512: 183: const UINT16 *data = (const UINT16 *)&tiledata[2 * y * w]; 512: 184: UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; 33280: 185: for (x = 0; x < w; ++x) { branch 0 taken 98% branch 1 taken 2% (fallthrough) 65536: 186: *row++ = j2ku_shift(offset + *data++, shift); -: 187: } -: 188: } -: 189: break; -: 190: case 4: #####: 191: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 192: const UINT32 *data = (const UINT32 *)&tiledata[4 * y * w]; #####: 193: UINT16 *row = (UINT16 *)im->image[y0 + y] + x0; #####: 194: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 195: *row++ = j2ku_shift(offset + *data++, shift); -: 196: } -: 197: } -: 198: break; -: 199: } 8: 200:} -: 201: -: 202: -: 203:static void function j2ku_gray_rgb called 0 returned 0% blocks executed 0% #####: 204:j2ku_gray_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 205: const UINT8 *tiledata, Imaging im) -: 206:{ #####: 207: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 208: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 209: unsigned h = tileinfo->y1 - tileinfo->y0; -: 210: #####: 211: int shift = 8 - in->comps[0].prec; #####: 212: int offset = in->comps[0].sgnd ? 1 << (in->comps[0].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 213: int csiz = (in->comps[0].prec + 7) >> 3; -: 214: -: 215: unsigned x, y; -: 216: #####: 217: if (shift < 0) { branch 0 never executed branch 1 never executed #####: 218: offset += 1 << (-shift - 1); -: 219: } -: 220: #####: 221: if (csiz == 3) { branch 0 never executed branch 1 never executed #####: 222: csiz = 4; -: 223: } -: 224: #####: 225: switch (csiz) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed -: 226: case 1: #####: 227: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 228: const UINT8 *data = &tiledata[y * w]; #####: 229: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 230: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 231: UINT8 byte = j2ku_shift(offset + *data++, shift); #####: 232: row[0] = row[1] = row[2] = byte; #####: 233: row[3] = 0xff; #####: 234: row += 4; -: 235: } -: 236: } -: 237: break; -: 238: case 2: #####: 239: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 240: const UINT16 *data = (UINT16 *)&tiledata[2 * y * w]; #####: 241: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 242: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 243: UINT8 byte = j2ku_shift(offset + *data++, shift); #####: 244: row[0] = row[1] = row[2] = byte; #####: 245: row[3] = 0xff; #####: 246: row += 4; -: 247: } -: 248: } -: 249: break; -: 250: case 4: #####: 251: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 252: const UINT32 *data = (UINT32 *)&tiledata[4 * y * w]; #####: 253: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0; #####: 254: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 255: UINT8 byte = j2ku_shift(offset + *data++, shift); #####: 256: row[0] = row[1] = row[2] = byte; #####: 257: row[3] = 0xff; #####: 258: row += 4; -: 259: } -: 260: } -: 261: break; -: 262: } #####: 263:} -: 264: -: 265:static void function j2ku_graya_la called 0 returned 0% blocks executed 0% #####: 266:j2ku_graya_la(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 267: const UINT8 *tiledata, Imaging im) -: 268:{ #####: 269: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 270: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 271: unsigned h = tileinfo->y1 - tileinfo->y0; -: 272: #####: 273: int shift = 8 - in->comps[0].prec; #####: 274: int offset = in->comps[0].sgnd ? 1 << (in->comps[0].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 275: int csiz = (in->comps[0].prec + 7) >> 3; #####: 276: int ashift = 8 - in->comps[1].prec; #####: 277: int aoffset = in->comps[1].sgnd ? 1 << (in->comps[1].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 278: int acsiz = (in->comps[1].prec + 7) >> 3; -: 279: const UINT8 *atiledata; -: 280: -: 281: unsigned x, y; -: 282: #####: 283: if (csiz == 3) { branch 0 never executed branch 1 never executed #####: 284: csiz = 4; -: 285: } #####: 286: if (acsiz == 3) { branch 0 never executed branch 1 never executed #####: 287: acsiz = 4; -: 288: } -: 289: #####: 290: if (shift < 0) { branch 0 never executed branch 1 never executed #####: 291: offset += 1 << (-shift - 1); -: 292: } #####: 293: if (ashift < 0) { branch 0 never executed branch 1 never executed #####: 294: aoffset += 1 << (-ashift - 1); -: 295: } -: 296: #####: 297: atiledata = tiledata + csiz * w * h; -: 298: #####: 299: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed #####: 300: const UINT8 *data = &tiledata[csiz * y * w]; #####: 301: const UINT8 *adata = &atiledata[acsiz * y * w]; #####: 302: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; #####: 303: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 304: UINT32 word = 0, aword = 0, byte; -: 305: #####: 306: switch (csiz) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 307: case 1: word = *data++; break; #####: 308: case 2: word = *(const UINT16 *)data; data += 2; break; #####: 309: case 4: word = *(const UINT32 *)data; data += 4; break; -: 310: } -: 311: #####: 312: switch (acsiz) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 313: case 1: aword = *adata++; break; #####: 314: case 2: aword = *(const UINT16 *)adata; adata += 2; break; #####: 315: case 4: aword = *(const UINT32 *)adata; adata += 4; break; -: 316: } -: 317: #####: 318: byte = j2ku_shift(offset + word, shift); #####: 319: row[0] = row[1] = row[2] = byte; #####: 320: row[3] = j2ku_shift(aoffset + aword, ashift); #####: 321: row += 4; -: 322: } -: 323: } #####: 324:} -: 325: -: 326:static void function j2ku_srgb_rgb called 76 returned 100% blocks executed 79% 76: 327:j2ku_srgb_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 328: const UINT8 *tiledata, Imaging im) -: 329:{ 76: 330: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; 76: 331: unsigned w = tileinfo->x1 - tileinfo->x0; 76: 332: unsigned h = tileinfo->y1 - tileinfo->y0; -: 333: -: 334: int shifts[3], offsets[3], csiz[3]; -: 335: const UINT8 *cdata[3]; 76: 336: const UINT8 *cptr = tiledata; -: 337: unsigned n, x, y; -: 338: 304: 339: for (n = 0; n < 3; ++n) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 228: 340: cdata[n] = cptr; 228: 341: shifts[n] = 8 - in->comps[n].prec; 228: 342: offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; branch 0 taken 0% (fallthrough) branch 1 taken 100% 228: 343: csiz[n] = (in->comps[n].prec + 7) >> 3; -: 344: 228: 345: if (csiz[n] == 3) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 346: csiz[n] = 4; -: 347: } -: 348: 228: 349: if (shifts[n] < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 350: offsets[n] += 1 << (-shifts[n] - 1); -: 351: } -: 352: 228: 353: cptr += csiz[n] * w * h; -: 354: } -: 355: 13080: 356: for (y = 0; y < h; ++y) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 357: const UINT8 *data[3]; 13080: 358: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; 52320: 359: for (n = 0; n < 3; ++n) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 39240: 360: data[n] = &cdata[n][csiz[n] * y * w]; -: 361: } -: 362: 4320000: 363: for (x = 0; x < w; ++x) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 12960000: 364: for (n = 0; n < 3; ++n) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 12960000: 365: UINT32 word = 0; -: 366: 12960000: 367: switch (csiz[n]) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% 12960000: 368: case 1: word = *data[n]++; break; #####: 369: case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; #####: 370: case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; -: 371: } -: 372: 25920000: 373: row[n] = j2ku_shift(offsets[n] + word, shifts[n]); -: 374: } 4320000: 375: row[3] = 0xff; 4320000: 376: row += 4; -: 377: } -: 378: } 76: 379:} -: 380: -: 381:static void function j2ku_sycc_rgb called 0 returned 0% blocks executed 0% #####: 382:j2ku_sycc_rgb(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 383: const UINT8 *tiledata, Imaging im) -: 384:{ #####: 385: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 386: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 387: unsigned h = tileinfo->y1 - tileinfo->y0; -: 388: -: 389: int shifts[3], offsets[3], csiz[3]; -: 390: const UINT8 *cdata[3]; #####: 391: const UINT8 *cptr = tiledata; -: 392: unsigned n, x, y; -: 393: #####: 394: for (n = 0; n < 3; ++n) { branch 0 never executed branch 1 never executed #####: 395: cdata[n] = cptr; #####: 396: shifts[n] = 8 - in->comps[n].prec; #####: 397: offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 398: csiz[n] = (in->comps[n].prec + 7) >> 3; -: 399: #####: 400: if (csiz[n] == 3) { branch 0 never executed branch 1 never executed #####: 401: csiz[n] = 4; -: 402: } -: 403: #####: 404: if (shifts[n] < 0) { branch 0 never executed branch 1 never executed #####: 405: offsets[n] += 1 << (-shifts[n] - 1); -: 406: } -: 407: #####: 408: cptr += csiz[n] * w * h; -: 409: } -: 410: #####: 411: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed -: 412: const UINT8 *data[3]; #####: 413: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; #####: 414: UINT8 *row_start = row; #####: 415: for (n = 0; n < 3; ++n) { branch 0 never executed branch 1 never executed #####: 416: data[n] = &cdata[n][csiz[n] * y * w]; -: 417: } -: 418: #####: 419: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 420: for (n = 0; n < 3; ++n) { branch 0 never executed branch 1 never executed #####: 421: UINT32 word = 0; -: 422: #####: 423: switch (csiz[n]) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 424: case 1: word = *data[n]++; break; #####: 425: case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; #####: 426: case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; -: 427: } -: 428: #####: 429: row[n] = j2ku_shift(offsets[n] + word, shifts[n]); -: 430: } #####: 431: row[3] = 0xff; #####: 432: row += 4; -: 433: } -: 434: #####: 435: ImagingConvertYCbCr2RGB(row_start, row_start, w); call 0 never executed -: 436: } #####: 437:} -: 438: -: 439:static void function j2ku_srgba_rgba called 10 returned 100% blocks executed 79% 10: 440:j2ku_srgba_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 441: const UINT8 *tiledata, Imaging im) -: 442:{ 10: 443: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; 10: 444: unsigned w = tileinfo->x1 - tileinfo->x0; 10: 445: unsigned h = tileinfo->y1 - tileinfo->y0; -: 446: -: 447: int shifts[4], offsets[4], csiz[4]; -: 448: const UINT8 *cdata[4]; 10: 449: const UINT8 *cptr = tiledata; -: 450: unsigned n, x, y; -: 451: 50: 452: for (n = 0; n < 4; ++n) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 40: 453: cdata[n] = cptr; 40: 454: shifts[n] = 8 - in->comps[n].prec; 40: 455: offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; branch 0 taken 0% (fallthrough) branch 1 taken 100% 40: 456: csiz[n] = (in->comps[n].prec + 7) >> 3; -: 457: 40: 458: if (csiz[n] == 3) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 459: csiz[n] = 4; -: 460: } -: 461: 40: 462: if (shifts[n] < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 463: offsets[n] += 1 << (-shifts[n] - 1); -: 464: } -: 465: 40: 466: cptr += csiz[n] * w * h; -: 467: } -: 468: 2912: 469: for (y = 0; y < h; ++y) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 470: const UINT8 *data[4]; 2912: 471: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; 14560: 472: for (n = 0; n < 4; ++n) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 11648: 473: data[n] = &cdata[n][csiz[n] * y * w]; -: 474: } -: 475: 1733632: 476: for (x = 0; x < w; ++x) { branch 0 taken 99% (fallthrough) branch 1 taken 1% 6934528: 477: for (n = 0; n < 4; ++n) { branch 0 taken 80% branch 1 taken 20% (fallthrough) 6934528: 478: UINT32 word = 0; -: 479: 6934528: 480: switch (csiz[n]) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% 6934528: 481: case 1: word = *data[n]++; break; #####: 482: case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; #####: 483: case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; -: 484: } -: 485: 13869056: 486: row[n] = j2ku_shift(offsets[n] + word, shifts[n]); -: 487: } 1733632: 488: row += 4; -: 489: } -: 490: } 10: 491:} -: 492: -: 493:static void function j2ku_sycca_rgba called 0 returned 0% blocks executed 0% #####: 494:j2ku_sycca_rgba(opj_image_t *in, const JPEG2KTILEINFO *tileinfo, -: 495: const UINT8 *tiledata, Imaging im) -: 496:{ #####: 497: unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0; #####: 498: unsigned w = tileinfo->x1 - tileinfo->x0; #####: 499: unsigned h = tileinfo->y1 - tileinfo->y0; -: 500: -: 501: int shifts[4], offsets[4], csiz[4]; -: 502: const UINT8 *cdata[4]; #####: 503: const UINT8 *cptr = tiledata; -: 504: unsigned n, x, y; -: 505: #####: 506: for (n = 0; n < 4; ++n) { branch 0 never executed branch 1 never executed #####: 507: cdata[n] = cptr; #####: 508: shifts[n] = 8 - in->comps[n].prec; #####: 509: offsets[n] = in->comps[n].sgnd ? 1 << (in->comps[n].prec - 1) : 0; branch 0 never executed branch 1 never executed #####: 510: csiz[n] = (in->comps[n].prec + 7) >> 3; -: 511: #####: 512: if (csiz[n] == 3) { branch 0 never executed branch 1 never executed #####: 513: csiz[n] = 4; -: 514: } -: 515: #####: 516: if (shifts[n] < 0) { branch 0 never executed branch 1 never executed #####: 517: offsets[n] += 1 << (-shifts[n] - 1); -: 518: } -: 519: #####: 520: cptr += csiz[n] * w * h; -: 521: } -: 522: #####: 523: for (y = 0; y < h; ++y) { branch 0 never executed branch 1 never executed -: 524: const UINT8 *data[4]; #####: 525: UINT8 *row = (UINT8 *)im->image[y0 + y] + x0 * 4; #####: 526: UINT8 *row_start = row; #####: 527: for (n = 0; n < 4; ++n) { branch 0 never executed branch 1 never executed #####: 528: data[n] = &cdata[n][csiz[n] * y * w]; -: 529: } -: 530: #####: 531: for (x = 0; x < w; ++x) { branch 0 never executed branch 1 never executed #####: 532: for (n = 0; n < 4; ++n) { branch 0 never executed branch 1 never executed #####: 533: UINT32 word = 0; -: 534: #####: 535: switch (csiz[n]) { branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed #####: 536: case 1: word = *data[n]++; break; #####: 537: case 2: word = *(const UINT16 *)data[n]; data[n] += 2; break; #####: 538: case 4: word = *(const UINT32 *)data[n]; data[n] += 4; break; -: 539: } -: 540: #####: 541: row[n] = j2ku_shift(offsets[n] + word, shifts[n]); -: 542: } #####: 543: row += 4; -: 544: } -: 545: #####: 546: ImagingConvertYCbCr2RGB(row_start, row_start, w); call 0 never executed -: 547: } #####: 548:} -: 549: -: 550:static const struct j2k_decode_unpacker j2k_unpackers[] = { -: 551: { "L", OPJ_CLRSPC_GRAY, 1, j2ku_gray_l }, -: 552: { "I;16", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i }, -: 553: { "I;16B", OPJ_CLRSPC_GRAY, 1, j2ku_gray_i }, -: 554: { "LA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la }, -: 555: { "RGB", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb }, -: 556: { "RGB", OPJ_CLRSPC_GRAY, 2, j2ku_gray_rgb }, -: 557: { "RGB", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb }, -: 558: { "RGB", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb }, -: 559: { "RGB", OPJ_CLRSPC_SRGB, 4, j2ku_srgb_rgb }, -: 560: { "RGB", OPJ_CLRSPC_SYCC, 4, j2ku_sycc_rgb }, -: 561: { "RGBA", OPJ_CLRSPC_GRAY, 1, j2ku_gray_rgb }, -: 562: { "RGBA", OPJ_CLRSPC_GRAY, 2, j2ku_graya_la }, -: 563: { "RGBA", OPJ_CLRSPC_SRGB, 3, j2ku_srgb_rgb }, -: 564: { "RGBA", OPJ_CLRSPC_SYCC, 3, j2ku_sycc_rgb }, -: 565: { "RGBA", OPJ_CLRSPC_SRGB, 4, j2ku_srgba_rgba }, -: 566: { "RGBA", OPJ_CLRSPC_SYCC, 4, j2ku_sycca_rgba }, -: 567:}; -: 568: -: 569:/* -------------------------------------------------------------------- */ -: 570:/* Decoder */ -: 571:/* -------------------------------------------------------------------- */ -: 572: -: 573:enum { -: 574: J2K_STATE_START = 0, -: 575: J2K_STATE_DECODING = 1, -: 576: J2K_STATE_DONE = 2, -: 577: J2K_STATE_FAILED = 3, -: 578:}; -: 579: -: 580:static int function j2k_decode_entry called 33 returned 100% blocks executed 80% 33: 581:j2k_decode_entry(Imaging im, ImagingCodecState state) -: 582:{ 33: 583: JPEG2KDECODESTATE *context = (JPEG2KDECODESTATE *) state->context; 33: 584: opj_stream_t *stream = NULL; 33: 585: opj_image_t *image = NULL; 33: 586: opj_codec_t *codec = NULL; -: 587: opj_dparameters_t params; -: 588: OPJ_COLOR_SPACE color_space; 33: 589: j2k_unpacker_t unpack = NULL; 33: 590: size_t buffer_size = 0, tile_bytes = 0; -: 591: unsigned n, tile_height, tile_width; -: 592: int components; -: 593: -: 594: 33: 595: stream = opj_stream_create(BUFFER_SIZE, OPJ_TRUE); call 0 returned 100% -: 596: 33: 597: if (!stream) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 598: state->errcode = IMAGING_CODEC_BROKEN; #####: 599: state->state = J2K_STATE_FAILED; #####: 600: goto quick_exit; -: 601: } -: 602: 33: 603: opj_stream_set_read_function(stream, j2k_read); call 0 returned 100% 33: 604: opj_stream_set_skip_function(stream, j2k_skip); call 0 returned 100% -: 605: -: 606: /* OpenJPEG 2.0 doesn't have OPJ_VERSION_MAJOR */ -: 607:#ifndef OPJ_VERSION_MAJOR -: 608: opj_stream_set_user_data(stream, state); -: 609:#else 33: 610: opj_stream_set_user_data(stream, state, NULL); call 0 returned 100% -: 611: -: 612: /* Hack: if we don't know the length, the largest file we can -: 613: possibly support is 4GB. We can't go larger than this, because -: 614: OpenJPEG truncates this value for the final box in the file, and -: 615: the box lengths in OpenJPEG are currently 32 bit. */ 33: 616: if (context->length < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 617: opj_stream_set_user_data_length(stream, 0xffffffff); call 0 never executed -: 618: } else { 33: 619: opj_stream_set_user_data_length(stream, context->length); call 0 returned 100% -: 620: } -: 621:#endif -: 622: -: 623: /* Setup decompression context */ 33: 624: context->error_msg = NULL; -: 625: 33: 626: opj_set_default_decoder_parameters(¶ms); call 0 returned 100% 33: 627: params.cp_reduce = context->reduce; 33: 628: params.cp_layer = context->layers; -: 629: 33: 630: codec = opj_create_decompress(context->format); call 0 returned 100% -: 631: 33: 632: if (!codec) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 633: state->errcode = IMAGING_CODEC_BROKEN; #####: 634: state->state = J2K_STATE_FAILED; #####: 635: goto quick_exit; -: 636: } -: 637: 33: 638: opj_set_error_handler(codec, j2k_error, context); call 0 returned 100% 33: 639: opj_setup_decoder(codec, ¶ms); call 0 returned 100% -: 640: 33: 641: if (!opj_read_header(stream, codec, &image)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 642: state->errcode = IMAGING_CODEC_BROKEN; #####: 643: state->state = J2K_STATE_FAILED; #####: 644: goto quick_exit; -: 645: } -: 646: -: 647: /* Check that this image is something we can handle */ 33: 648: if (image->numcomps < 1 || image->numcomps > 4 branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 649: || image->color_space == OPJ_CLRSPC_UNKNOWN) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 650: state->errcode = IMAGING_CODEC_BROKEN; #####: 651: state->state = J2K_STATE_FAILED; #####: 652: goto quick_exit; -: 653: } -: 654: 60: 655: for (n = 1; n < image->numcomps; ++n) { branch 0 taken 65% branch 1 taken 35% (fallthrough) 60: 656: if (image->comps[n].dx != 1 || image->comps[n].dy != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 657: state->errcode = IMAGING_CODEC_BROKEN; #####: 658: state->state = J2K_STATE_FAILED; #####: 659: goto quick_exit; -: 660: } -: 661: } -: 662: -: 663: /* -: 664: Colorspace Number of components PIL mode -: 665: ------------------------------------------------------ -: 666: sRGB 3 RGB -: 667: sRGB 4 RGBA -: 668: gray 1 L or I -: 669: gray 2 LA -: 670: YCC 3 YCbCr -: 671: -: 672: -: 673: If colorspace is unspecified, we assume: -: 674: -: 675: Number of components Colorspace -: 676: ----------------------------------------- -: 677: 1 gray -: 678: 2 gray (+ alpha) -: 679: 3 sRGB -: 680: 4 sRGB (+ alpha) -: 681: -: 682: */ -: 683: -: 684: /* Find the correct unpacker */ 33: 685: color_space = image->color_space; -: 686: 33: 687: if (color_space == OPJ_CLRSPC_UNSPECIFIED) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 688: switch (image->numcomps) { branch 0 taken 24% branch 1 taken 76% branch 2 taken 0% 8: 689: case 1: case 2: color_space = OPJ_CLRSPC_GRAY; break; 25: 690: case 3: case 4: color_space = OPJ_CLRSPC_SRGB; break; -: 691: } -: 692: } -: 693: 271: 694: for (n = 0; n < sizeof(j2k_unpackers) / sizeof (j2k_unpackers[0]); ++n) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 271: 695: if (color_space == j2k_unpackers[n].color_space branch 0 taken 26% (fallthrough) branch 1 taken 74% 71: 696: && image->numcomps == j2k_unpackers[n].components branch 0 taken 72% (fallthrough) branch 1 taken 28% 51: 697: && strcmp (im->mode, j2k_unpackers[n].mode) == 0) { branch 0 taken 65% (fallthrough) branch 1 taken 35% 33: 698: unpack = j2k_unpackers[n].unpacker; 33: 699: break; -: 700: } -: 701: } -: 702: 33: 703: if (!unpack) { branch 0 taken 100% (fallthrough) branch 1 taken 0% #####: 704: state->errcode = IMAGING_CODEC_BROKEN; #####: 705: state->state = J2K_STATE_FAILED; #####: 706: goto quick_exit; -: 707: } -: 708: -: 709: /* Decode the image tile-by-tile; this means we only need use as much -: 710: memory as is required for one tile's worth of components. */ -: 711: for (;;) { -: 712: JPEG2KTILEINFO tile_info; -: 713: OPJ_BOOL should_continue; 127: 714: unsigned correction = (1 << params.cp_reduce) - 1; -: 715: 127: 716: if (!opj_read_tile_header(codec, call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 717: stream, -: 718: &tile_info.tile_index, -: 719: &tile_info.data_size, -: 720: &tile_info.x0, &tile_info.y0, -: 721: &tile_info.x1, &tile_info.y1, -: 722: &tile_info.nb_comps, -: 723: &should_continue)) { #####: 724: state->errcode = IMAGING_CODEC_BROKEN; #####: 725: state->state = J2K_STATE_FAILED; #####: 726: goto quick_exit; -: 727: } -: 728: 127: 729: if (!should_continue) { branch 0 taken 74% (fallthrough) branch 1 taken 26% -: 730: break; -: 731: } -: 732: -: 733: /* Adjust the tile co-ordinates based on the reduction (OpenJPEG -: 734: doesn't do this for us) */ 94: 735: tile_info.x0 = (tile_info.x0 + correction) >> context->reduce; 94: 736: tile_info.y0 = (tile_info.y0 + correction) >> context->reduce; 94: 737: tile_info.x1 = (tile_info.x1 + correction) >> context->reduce; 94: 738: tile_info.y1 = (tile_info.y1 + correction) >> context->reduce; -: 739: -: 740: /* Check the tile bounds; if the tile is outside the image area, -: 741: or if it has a negative width or height (i.e. the coordinates are -: 742: swapped), bail. */ 94: 743: if (tile_info.x0 >= tile_info.x1 branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 744: || tile_info.y0 >= tile_info.y1 branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 745: || tile_info.x0 < (OPJ_INT32)image->x0 branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 746: || tile_info.y0 < (OPJ_INT32)image->y0 branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 747: || tile_info.x1 - image->x0 > im->xsize branch 0 taken 100% (fallthrough) branch 1 taken 0% 94: 748: || tile_info.y1 - image->y0 > im->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 749: state->errcode = IMAGING_CODEC_BROKEN; #####: 750: state->state = J2K_STATE_FAILED; #####: 751: goto quick_exit; -: 752: } -: 753: -: 754: /* Sometimes the tile_info.datasize we get back from openjpeg -: 755: is less than numcomps*w*h, and we overflow in the -: 756: shuffle stage */ -: 757: 94: 758: tile_width = tile_info.x1 - tile_info.x0; 94: 759: tile_height = tile_info.y1 - tile_info.y0; 94: 760: components = tile_info.nb_comps == 3 ? 4 : tile_info.nb_comps; branch 0 taken 19% (fallthrough) branch 1 taken 81% 94: 761: if (( tile_width > UINT_MAX / components ) || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% 94: 762: ( tile_height > UINT_MAX / components ) || branch 0 taken 100% (fallthrough) branch 1 taken 0% 188: 763: ( tile_width > UINT_MAX / (tile_height * components )) || branch 0 taken 0% (fallthrough) branch 1 taken 100% 94: 764: ( tile_height > UINT_MAX / (tile_width * components ))) { #####: 765: state->errcode = IMAGING_CODEC_BROKEN; #####: 766: state->state = J2K_STATE_FAILED; #####: 767: goto quick_exit; -: 768: } -: 769: 94: 770: tile_bytes = tile_width * tile_height * components; -: 771: 94: 772: if (tile_bytes > tile_info.data_size) { branch 0 taken 81% (fallthrough) branch 1 taken 19% 76: 773: tile_info.data_size = tile_bytes; -: 774: } -: 775: 94: 776: if (buffer_size < tile_info.data_size) { branch 0 taken 37% (fallthrough) branch 1 taken 63% -: 777: /* malloc check ok, overflow and tile size sanity check above */ 35: 778: UINT8 *new = realloc (state->buffer, tile_info.data_size); 35: 779: if (!new) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 780: state->errcode = IMAGING_CODEC_MEMORY; #####: 781: state->state = J2K_STATE_FAILED; #####: 782: goto quick_exit; -: 783: } 35: 784: state->buffer = new; 35: 785: buffer_size = tile_info.data_size; -: 786: } -: 787: -: 788: 188: 789: if (!opj_decode_tile_data(codec, call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% -: 790: tile_info.tile_index, 94: 791: (OPJ_BYTE *)state->buffer, -: 792: tile_info.data_size, -: 793: stream)) { #####: 794: state->errcode = IMAGING_CODEC_BROKEN; #####: 795: state->state = J2K_STATE_FAILED; #####: 796: goto quick_exit; -: 797: } -: 798: 94: 799: unpack(image, &tile_info, state->buffer, im); call 0 returned 100% 94: 800: } -: 801: 33: 802: if (!opj_end_decompress(codec, stream)) { call 0 returned 100% branch 1 taken 0% (fallthrough) branch 2 taken 100% #####: 803: state->errcode = IMAGING_CODEC_BROKEN; #####: 804: state->state = J2K_STATE_FAILED; #####: 805: goto quick_exit; -: 806: } -: 807: 33: 808: state->state = J2K_STATE_DONE; 33: 809: state->errcode = IMAGING_CODEC_END; -: 810: 33: 811: if (context->pfile) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 812: if(fclose(context->pfile)){ call 0 never executed branch 1 never executed branch 2 never executed #####: 813: context->pfile = NULL; -: 814: } -: 815: } -: 816: -: 817: quick_exit: 33: 818: if (codec) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 819: opj_destroy_codec(codec); call 0 returned 100% -: 820: } 33: 821: if (image) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 822: opj_image_destroy(image); call 0 returned 100% -: 823: } 33: 824: if (stream) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 825: opj_stream_destroy(stream); call 0 returned 100% -: 826: } -: 827: 33: 828: return -1; -: 829:} -: 830: -: 831:int function ImagingJpeg2KDecode called 33 returned 100% blocks executed 63% 33: 832:ImagingJpeg2KDecode(Imaging im, ImagingCodecState state, UINT8* buf, Py_ssize_t bytes) -: 833:{ -: 834: 33: 835: if (bytes){ branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 836: state->errcode = IMAGING_CODEC_BROKEN; #####: 837: state->state = J2K_STATE_FAILED; #####: 838: return -1; -: 839: } -: 840: 33: 841: if (state->state == J2K_STATE_DONE || state->state == J2K_STATE_FAILED) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 842: return -1; -: 843: } -: 844: 33: 845: if (state->state == J2K_STATE_START) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 33: 846: state->state = J2K_STATE_DECODING; -: 847: 33: 848: return j2k_decode_entry(im, state); call 0 returned 100% -: 849: } -: 850: #####: 851: if (state->state == J2K_STATE_DECODING) { branch 0 never executed branch 1 never executed #####: 852: state->errcode = IMAGING_CODEC_BROKEN; #####: 853: state->state = J2K_STATE_FAILED; #####: 854: return -1; -: 855: } -: 856: return -1; -: 857:} -: 858: -: 859:/* -------------------------------------------------------------------- */ -: 860:/* Cleanup */ -: 861:/* -------------------------------------------------------------------- */ -: 862: -: 863:int function ImagingJpeg2KDecodeCleanup called 67 returned 100% blocks executed 67% 67: 864:ImagingJpeg2KDecodeCleanup(ImagingCodecState state) { 67: 865: JPEG2KDECODESTATE *context = (JPEG2KDECODESTATE *)state->context; -: 866: 67: 867: if (context->error_msg) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 868: free ((void *)context->error_msg); -: 869: } -: 870: 67: 871: context->error_msg = NULL; -: 872: 67: 873: return -1; -: 874:} -: 875: -: 876:const char * function ImagingJpeg2KVersion called 3 returned 100% blocks executed 100% 3: 877:ImagingJpeg2KVersion(void) -: 878:{ 3: 879: return opj_version(); call 0 returned 100% -: 880:} -: 881: -: 882:#endif /* HAVE_OPENJPEG */ -: 883: -: 884:/* -: 885: * Local Variables: -: 886: * c-basic-offset: 4 -: 887: * End: -: 888: * -: 889: */ <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Chops.c.gcov -: 0:Source:src/libImaging/Chops.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Chops.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Chops.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:/* -: 2: * The Python Imaging Library -: 3: * $Id$ -: 4: * -: 5: * basic channel operations -: 6: * -: 7: * history: -: 8: * 1996-03-28 fl Created -: 9: * 1996-08-13 fl Added and/or/xor for "1" images -: 10: * 1996-12-14 fl Added add_modulo, sub_modulo -: 11: * 2005-09-10 fl Fixed output values from and/or/xor -: 12: * -: 13: * Copyright (c) 1996 by Fredrik Lundh. -: 14: * Copyright (c) 1997 by Secret Labs AB. -: 15: * -: 16: * See the README file for details on usage and redistribution. -: 17: */ -: 18: -: 19: -: 20:#include "Imaging.h" -: 21: -: 22:#define CHOP(operation)\ -: 23: int x, y;\ -: 24: Imaging imOut;\ -: 25: imOut = create(imIn1, imIn2, NULL);\ -: 26: if (!imOut) {\ -: 27: return NULL;\ -: 28: }\ -: 29: for (y = 0; y < imOut->ysize; y++) {\ -: 30: UINT8* out = (UINT8*) imOut->image[y];\ -: 31: UINT8* in1 = (UINT8*) imIn1->image[y];\ -: 32: UINT8* in2 = (UINT8*) imIn2->image[y];\ -: 33: for (x = 0; x < imOut->linesize; x++) {\ -: 34: int temp = operation;\ -: 35: if (temp <= 0) {\ -: 36: out[x] = 0;\ -: 37: } else if (temp >= 255) {\ -: 38: out[x] = 255;\ -: 39: } else {\ -: 40: out[x] = temp;\ -: 41: }\ -: 42: }\ -: 43: }\ -: 44: return imOut; -: 45: -: 46:#define CHOP2(operation, mode)\ -: 47: int x, y;\ -: 48: Imaging imOut;\ -: 49: imOut = create(imIn1, imIn2, mode);\ -: 50: if (!imOut) {\ -: 51: return NULL;\ -: 52: }\ -: 53: for (y = 0; y < imOut->ysize; y++) {\ -: 54: UINT8* out = (UINT8*) imOut->image[y];\ -: 55: UINT8* in1 = (UINT8*) imIn1->image[y];\ -: 56: UINT8* in2 = (UINT8*) imIn2->image[y];\ -: 57: for (x = 0; x < imOut->linesize; x++) {\ -: 58: out[x] = operation;\ -: 59: }\ -: 60: }\ -: 61: return imOut; -: 62: -: 63:static Imaging function create called 146 returned 100% blocks executed 87% 146: 64:create(Imaging im1, Imaging im2, char* mode) -: 65:{ -: 66: int xsize, ysize; -: 67: 146: 68: if (!im1 || !im2 || im1->type != IMAGING_TYPE_UINT8 || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 25% (fallthrough) branch 5 taken 75% 36: 69: (mode != NULL && (strcmp(im1->mode, "1") || strcmp(im2->mode, "1")))) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% #####: 70: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 71: } 292: 72: if (im1->type != im2->type || branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% 146: 73: im1->bands != im2->bands) { #####: 74: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 75: } -: 76: 146: 77: xsize = (im1->xsize < im2->xsize) ? im1->xsize : im2->xsize; 146: 78: ysize = (im1->ysize < im2->ysize) ? im1->ysize : im2->ysize; -: 79: 146: 80: return ImagingNewDirty(im1->mode, xsize, ysize); call 0 returned 100% -: 81:} -: 82: -: 83:Imaging function ImagingChopLighter called 3 returned 100% blocks executed 100% 3: 84:ImagingChopLighter(Imaging imIn1, Imaging imIn2) -: 85:{ 3: 86: CHOP((in1[x] > in2[x]) ? in1[x] : in2[x]); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 30% (fallthrough) branch 4 taken 70% branch 5 taken 30% (fallthrough) branch 6 taken 70% branch 7 taken 34% (fallthrough) branch 8 taken 66% branch 9 taken 99% branch 10 taken 1% (fallthrough) branch 11 taken 99% branch 12 taken 1% (fallthrough) -: 87:} -: 88: -: 89:Imaging function ImagingChopDarker called 3 returned 100% blocks executed 100% 3: 90:ImagingChopDarker(Imaging imIn1, Imaging imIn2) -: 91:{ 3: 92: CHOP((in1[x] < in2[x]) ? in1[x] : in2[x]); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 1% (fallthrough) branch 4 taken 99% branch 5 taken 60% (fallthrough) branch 6 taken 40% branch 7 taken 55% (fallthrough) branch 8 taken 45% branch 9 taken 99% branch 10 taken 1% (fallthrough) branch 11 taken 99% branch 12 taken 1% (fallthrough) -: 93:} -: 94: -: 95:Imaging function ImagingChopDifference called 3 returned 100% blocks executed 100% 3: 96:ImagingChopDifference(Imaging imIn1, Imaging imIn2) -: 97:{ 3: 98: CHOP(abs((int) in1[x] - (int) in2[x])); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 69% (fallthrough) branch 4 taken 31% branch 5 taken 2% (fallthrough) branch 6 taken 98% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 99:} -: 100: -: 101:Imaging function ImagingChopMultiply called 4 returned 100% blocks executed 100% 4: 102:ImagingChopMultiply(Imaging imIn1, Imaging imIn2) -: 103:{ 4: 104: CHOP((int) in1[x] * (int) in2[x] / 255); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 44% (fallthrough) branch 4 taken 56% branch 5 taken 41% (fallthrough) branch 6 taken 59% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 105:} -: 106: -: 107:Imaging function ImagingChopScreen called 2 returned 100% blocks executed 100% 2: 108:ImagingChopScreen(Imaging imIn1, Imaging imIn2) -: 109:{ 2: 110: CHOP(255 - ((int) (255 - in1[x]) * (int) (255 - in2[x])) / 255); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 45% (fallthrough) branch 4 taken 55% branch 5 taken 42% (fallthrough) branch 6 taken 58% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 111:} -: 112: -: 113:Imaging function ImagingChopAdd called 6 returned 100% blocks executed 100% 6: 114:ImagingChopAdd(Imaging imIn1, Imaging imIn2, float scale, int offset) -: 115:{ 6: 116: CHOP(((int) in1[x] + (int) in2[x]) / scale + offset); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 13% (fallthrough) branch 4 taken 87% branch 5 taken 39% (fallthrough) branch 6 taken 61% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 117:} -: 118: -: 119:Imaging function ImagingChopSubtract called 6 returned 100% blocks executed 100% 6: 120:ImagingChopSubtract(Imaging imIn1, Imaging imIn2, float scale, int offset) -: 121:{ 6: 122: CHOP(((int) in1[x] - (int) in2[x]) / scale + offset); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 1% (fallthrough) branch 6 taken 99% branch 7 taken 99% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) -: 123:} -: 124: -: 125:Imaging function ImagingChopAnd called 12 returned 100% blocks executed 100% 12: 126:ImagingChopAnd(Imaging imIn1, Imaging imIn2) -: 127:{ 12: 128: CHOP2((in1[x] && in2[x]) ? 255 : 0, "1"); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 50% (fallthrough) branch 6 taken 50% branch 7 taken 50% branch 8 taken 50% (fallthrough) branch 9 taken 50% branch 10 taken 50% (fallthrough) -: 129:} -: 130: -: 131:Imaging function ImagingChopOr called 12 returned 100% blocks executed 100% 12: 132:ImagingChopOr(Imaging imIn1, Imaging imIn2) -: 133:{ 12: 134: CHOP2((in1[x] || in2[x]) ? 255 : 0, "1"); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 50% (fallthrough) branch 6 taken 50% branch 7 taken 50% branch 8 taken 50% (fallthrough) branch 9 taken 50% branch 10 taken 50% (fallthrough) -: 135:} -: 136: -: 137:Imaging function ImagingChopXor called 12 returned 100% blocks executed 100% 12: 138:ImagingChopXor(Imaging imIn1, Imaging imIn2) -: 139:{ 12: 140: CHOP2(((in1[x] != 0) ^ (in2[x] != 0)) ? 255 : 0, "1"); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 50% (fallthrough) branch 4 taken 50% branch 5 taken 50% branch 6 taken 50% (fallthrough) branch 7 taken 50% branch 8 taken 50% (fallthrough) -: 141:} -: 142: -: 143:Imaging function ImagingChopAddModulo called 3 returned 100% blocks executed 100% 3: 144:ImagingChopAddModulo(Imaging imIn1, Imaging imIn2) -: 145:{ 3: 146: CHOP2(in1[x] + in2[x], NULL); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 99% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 1% (fallthrough) -: 147:} -: 148: -: 149:Imaging function ImagingChopSubtractModulo called 74 returned 100% blocks executed 100% 74: 150:ImagingChopSubtractModulo(Imaging imIn1, Imaging imIn2) -: 151:{ 74: 152: CHOP2(in1[x] - in2[x], NULL); call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 99% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 1% (fallthrough) -: 153:} -: 154: -: 155:Imaging function ImagingChopSoftLight called 2 returned 100% blocks executed 100% 2: 156:ImagingChopSoftLight(Imaging imIn1, Imaging imIn2) -: 157:{ 2: 158: CHOP2( (((255-in1[x]) * (in1[x]*in2[x]) ) / 65536) + call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 99% branch 4 taken 1% (fallthrough) branch 5 taken 99% branch 6 taken 1% (fallthrough) -: 159: (in1[x] * ( 255 - ( (255 - in1[x]) * (255 - in2[x] ) / 255) )) / 255 -: 160: , NULL ); -: 161:} -: 162: -: 163:Imaging function ImagingChopHardLight called 2 returned 100% blocks executed 100% 2: 164:ImagingChopHardLight(Imaging imIn1, Imaging imIn2) -: 165:{ 2: 166: CHOP2( (in2[x]<128) ? ( (in1[x]*in2[x])/127) call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 53% (fallthrough) branch 4 taken 47% branch 5 taken 99% branch 6 taken 1% (fallthrough) branch 7 taken 99% branch 8 taken 1% (fallthrough) -: 167: : 255 - ( ((255-in2[x]) * (255-in1[x])) / 127) -: 168: , NULL); -: 169:} -: 170: -: 171:Imaging function ImagingOverlay called 2 returned 100% blocks executed 100% 2: 172:ImagingOverlay(Imaging imIn1, Imaging imIn2) -: 173:{ 2: 174: CHOP2( (in1[x]<128) ? ( (in1[x]*in2[x])/127) call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 55% (fallthrough) branch 4 taken 45% branch 5 taken 99% branch 6 taken 1% (fallthrough) branch 7 taken 99% branch 8 taken 1% (fallthrough) -: 175: : 255 - ( ((255-in1[x]) * (255-in2[x])) / 127) -: 176: , NULL); -: 177:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Pack.c.gcov -: 0:Source:src/libImaging/Pack.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Pack.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Pack.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1: /* -: 2: * The Python Imaging Library. -: 3: * $Id$ -: 4: * -: 5: * code to pack raw data -: 6: * -: 7: * history: -: 8: * 1996-04-30 fl Created -: 9: * 1996-05-12 fl Published a few RGB packers -: 10: * 1996-11-01 fl More RGB packers (Tk booster stuff) -: 11: * 1996-12-30 fl Added P;1, P;2 and P;4 packers -: 12: * 1997-06-02 fl Added F (F;32NF) packer -: 13: * 1997-08-28 fl Added 1 as L packer -: 14: * 1998-02-08 fl Added I packer -: 15: * 1998-03-09 fl Added mode field, RGBA/RGBX as RGB packers -: 16: * 1998-07-01 fl Added YCbCr support -: 17: * 1998-07-12 fl Added I 16 packer -: 18: * 1999-02-03 fl Added BGR packers -: 19: * 2003-09-26 fl Added LA/PA packers -: 20: * 2006-06-22 fl Added CMYK;I packer -: 21: * -: 22: * Copyright (c) 1997-2006 by Secret Labs AB. -: 23: * Copyright (c) 1996-1997 by Fredrik Lundh. -: 24: * -: 25: * See the README file for information on usage and redistribution. -: 26: */ -: 27: -: 28: -: 29:#include "Imaging.h" -: 30: -: 31:#define R 0 -: 32:#define G 1 -: 33:#define B 2 -: 34:#define X 3 -: 35:#define A 3 -: 36: -: 37:#define C 0 -: 38:#define M 1 -: 39:#define Y 2 -: 40:#define K 3 -: 41: -: 42:/* byte swapping macros */ -: 43: -: 44:#define C16N\ -: 45: (out[0]=tmp[0], out[1]=tmp[1]); -: 46:#define C16S\ -: 47: (out[1]=tmp[0], out[0]=tmp[1]); -: 48:#define C32N\ -: 49: (out[0]=tmp[0], out[1]=tmp[1], out[2]=tmp[2], out[3]=tmp[3]); -: 50:#define C32S\ -: 51: (out[3]=tmp[0], out[2]=tmp[1], out[1]=tmp[2], out[0]=tmp[3]); -: 52:#define C64N\ -: 53: (out[0]=tmp[0], out[1]=tmp[1], out[2]=tmp[2], out[3]=tmp[3],\ -: 54: out[4]=tmp[4], out[5]=tmp[5], out[6]=tmp[6], out[7]=tmp[7]); -: 55:#define C64S\ -: 56: (out[7]=tmp[0], out[6]=tmp[1], out[5]=tmp[2], out[4]=tmp[3],\ -: 57: out[3]=tmp[4], out[2]=tmp[5], out[1]=tmp[6], out[0]=tmp[7]); -: 58: -: 59:#ifdef WORDS_BIGENDIAN -: 60:#define C16B C16N -: 61:#define C16L C16S -: 62:#define C32B C32N -: 63:#define C32L C32S -: 64:#define C64B C64N -: 65:#define C64L C64S -: 66:#else -: 67:#define C16B C16S -: 68:#define C16L C16N -: 69:#define C32B C32S -: 70:#define C32L C32N -: 71:#define C64B C64S -: 72:#define C64L C64N -: 73:#endif -: 74: -: 75: -: 76:static void function pack1 called 23398 returned 100% blocks executed 100% 23398: 77:pack1(UINT8* out, const UINT8* in, int pixels) -: 78:{ -: 79: int i, m, b; -: 80: /* bilevel (black is 0) */ 23398: 81: b = 0; m = 128; 15596631: 82: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 15573233: 83: if (in[i] != 0) { branch 0 taken 46% (fallthrough) branch 1 taken 54% 7136230: 84: b |= m; -: 85: } 15573233: 86: m >>= 1; 15573233: 87: if (m == 0) { branch 0 taken 12% (fallthrough) branch 1 taken 88% 1944082: 88: *out++ = b; 1944082: 89: b = 0; m = 128; -: 90: } -: 91: } 23398: 92: if (m != 128) { branch 0 taken 30% (fallthrough) branch 1 taken 70% 6955: 93: *out++ = b; -: 94: } 23398: 95:} -: 96: -: 97:static void function pack1I called 258 returned 100% blocks executed 90% 258: 98:pack1I(UINT8* out, const UINT8* in, int pixels) -: 99:{ -: 100: int i, m, b; -: 101: /* bilevel (black is 1) */ 258: 102: b = 0; m = 128; 33042: 103: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32784: 104: if (in[i] == 0) { branch 0 taken 67% (fallthrough) branch 1 taken 33% 21993: 105: b |= m; -: 106: } 32784: 107: m >>= 1; 32784: 108: if (m == 0) { branch 0 taken 13% (fallthrough) branch 1 taken 88% 4098: 109: *out++ = b; 4098: 110: b = 0; m = 128; -: 111: } -: 112: } 258: 113: if (m != 128) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 114: *out++ = b; -: 115: } 258: 116:} -: 117: -: 118:static void function pack1R called 1386 returned 100% blocks executed 90% 1386: 119:pack1R(UINT8* out, const UINT8* in, int pixels) -: 120:{ -: 121: int i, m, b; -: 122: /* bilevel, lsb first (black is 0) */ 1386: 123: b = 0; m = 1; 1050554: 124: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1049168: 125: if (in[i] != 0) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 348100: 126: b |= m; -: 127: } 1049168: 128: m <<= 1; 1049168: 129: if (m == 256){ branch 0 taken 13% (fallthrough) branch 1 taken 88% 131146: 130: *out++ = b; 131146: 131: b = 0; m = 1; -: 132: } -: 133: } 1386: 134: if (m != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 135: *out++ = b; -: 136: } 1386: 137:} -: 138: -: 139:static void function pack1IR called 2 returned 100% blocks executed 90% 2: 140:pack1IR(UINT8* out, const UINT8* in, int pixels) -: 141:{ -: 142: int i, m, b; -: 143: /* bilevel, lsb first (black is 1) */ 2: 144: b = 0; m = 1; 18: 145: for (i = 0; i < pixels; i++) { branch 0 taken 89% branch 1 taken 11% (fallthrough) 16: 146: if (in[i] == 0) { branch 0 taken 31% (fallthrough) branch 1 taken 69% 5: 147: b |= m; -: 148: } 16: 149: m <<= 1; 16: 150: if (m == 256){ branch 0 taken 13% (fallthrough) branch 1 taken 88% 2: 151: *out++ = b; 2: 152: b = 0; m = 1; -: 153: } -: 154: } 2: 155: if (m != 1) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 156: *out++ = b; -: 157: } 2: 158:} -: 159: -: 160:static void function pack1L called 45 returned 100% blocks executed 100% 45: 161:pack1L(UINT8* out, const UINT8* in, int pixels) -: 162:{ -: 163: int i; -: 164: /* bilevel, stored as bytes */ 663: 165: for (i = 0; i < pixels; i++) { branch 0 taken 93% branch 1 taken 7% (fallthrough) 618: 166: out[i] = (in[i] != 0) ? 255 : 0; branch 0 taken 96% (fallthrough) branch 1 taken 4% -: 167: } 45: 168:} -: 169: -: 170:static void function packP4 called 1 returned 100% blocks executed 83% 1: 171:packP4(UINT8* out, const UINT8* in, int pixels) -: 172:{ 4: 173: while (pixels >= 2) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 4: 174: *out++ = (in[0] << 4) | 2: 175: (in[1] & 15); 2: 176: in += 2; pixels -= 2; -: 177: } -: 178: 1: 179: if (pixels) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 180: out[0] = (in[0] << 4); -: 181: } 1: 182:} -: 183: -: 184:static void function packP2 called 2 returned 100% blocks executed 75% 2: 185:packP2(UINT8* out, const UINT8* in, int pixels) -: 186:{ 6: 187: while (pixels >= 4) { branch 0 taken 50% branch 1 taken 50% (fallthrough) 8: 188: *out++ = (in[0] << 6) | 2: 189: ((in[1] & 3) << 4) | 2: 190: ((in[2] & 3) << 2) | 2: 191: (in[3] & 3); 2: 192: in += 4; pixels -= 4; -: 193: } -: 194: 2: 195: switch (pixels) { branch 0 taken 0% branch 1 taken 50% branch 2 taken 0% branch 3 taken 50% -: 196: case 3: #####: 197: out[0] = (in[0] << 6) | #####: 198: ((in[1] & 3) << 4) | #####: 199: ((in[2] & 3) << 2); #####: 200: break; -: 201: case 2: 2: 202: out[0] = (in[0] << 6) | 1: 203: ((in[1] & 3) << 4); 1: 204: break; -: 205: case 1: #####: 206: out[0] = (in[0] << 6); -: 207: } 2: 208:} -: 209: -: 210:static void function packL16 called 1 returned 100% blocks executed 100% 1: 211:packL16(UINT8* out, const UINT8* in, int pixels) -: 212:{ -: 213: int i; -: 214: /* L -> L;16, e.g: \xff77 -> \x00\xff\x00\x77 */ 3: 215: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 216: out[0] = 0; 2: 217: out[1] = in[i]; 2: 218: out += 2; -: 219: } 1: 220:} -: 221: -: 222:static void function packL16B called 385 returned 100% blocks executed 100% 385: 223:packL16B(UINT8* out, const UINT8* in, int pixels) -: 224:{ -: 225: int i; -: 226: /* L -> L;16B, e.g: \xff77 -> \xff\x00\x77\x00 */ 49539: 227: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 49154: 228: out[0] = in[i]; 49154: 229: out[1] = 0; 49154: 230: out += 2; -: 231: } 385: 232:} -: 233: -: 234: -: 235:static void function packLA called 13122 returned 100% blocks executed 100% 13122: 236:packLA(UINT8* out, const UINT8* in, int pixels) -: 237:{ -: 238: int i; -: 239: /* LA, pixel interleaved */ 1411686: 240: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1398564: 241: out[0] = in[R]; 1398564: 242: out[1] = in[A]; 1398564: 243: out += 2; in += 4; -: 244: } 13122: 245:} -: 246: -: 247:static void function packLAL called 130 returned 100% blocks executed 100% 130: 248:packLAL(UINT8* out, const UINT8* in, int pixels) -: 249:{ -: 250: int i; -: 251: /* LA, line interleaved */ 16520: 252: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 16390: 253: out[i] = in[R]; 16390: 254: out[i+pixels] = in[A]; 16390: 255: in += 4; -: 256: } 130: 257:} -: 258: -: 259:void function ImagingPackRGB called 188815 returned 100% blocks executed 100% 188815: 260:ImagingPackRGB(UINT8* out, const UINT8* in, int pixels) -: 261:{ 188815: 262: int i = 0; -: 263: /* RGB triplets */ -: 264:#ifdef __sparc -: 265: /* SPARC CPUs cannot read integers from nonaligned addresses. */ -: 266: for (; i < pixels; i++) { -: 267: out[0] = in[R]; -: 268: out[1] = in[G]; -: 269: out[2] = in[B]; -: 270: out += 3; in += 4; -: 271: } -: 272:#else 195550569: 273: for (; i < pixels-1; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 390723508: 274: memcpy(out, in + i * 4, 4); 195361754: 275: out += 3; -: 276: } 188815: 277: for (; i < pixels; i++) { branch 0 taken 50% branch 1 taken 50% (fallthrough) 188815: 278: out[0] = in[i*4+R]; 188815: 279: out[1] = in[i*4+G]; 188815: 280: out[2] = in[i*4+B]; 188815: 281: out += 3; -: 282: } -: 283:#endif 188815: 284:} -: 285: -: 286:void function ImagingPackXRGB called 1 returned 100% blocks executed 100% 1: 287:ImagingPackXRGB(UINT8* out, const UINT8* in, int pixels) -: 288:{ -: 289: int i; -: 290: /* XRGB, triplets with left padding */ 3: 291: for (i = 0; i < pixels; i++) { branch 0 taken 67% branch 1 taken 33% (fallthrough) 2: 292: out[0] = 0; 2: 293: out[1] = in[R]; 2: 294: out[2] = in[G]; 2: 295: out[3] = in[B]; 2: 296: out += 4; in += 4; -: 297: } 1: 298:} -: 299: -: 300:void function ImagingPackBGR called 1379 returned 100% blocks executed 100% 1379: 301:ImagingPackBGR(UINT8* out, const UINT8* in, int pixels) -: 302:{ -: 303: int i; -: 304: /* RGB, reversed bytes */ 208412: 305: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 207033: 306: out[0] = in[B]; 207033: 307: out[1] = in[G]; 207033: 308: out[2] = in[R]; 207033: 309: out += 3; in += 4; -: 310: } 1379: 311:} -: 312: -: 313:void function ImagingPackBGRX called 3 returned 100% blocks executed 100% 3: 314:ImagingPackBGRX(UINT8* out, const UINT8* in, int pixels) -: 315:{ -: 316: int i; -: 317: /* BGRX, reversed bytes with right padding */ 264: 318: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 261: 319: out[0] = in[B]; 261: 320: out[1] = in[G]; 261: 321: out[2] = in[R]; 261: 322: out[3] = 0; 261: 323: out += 4; in += 4; -: 324: } 3: 325:} -: 326: -: 327:void function ImagingPackXBGR called 2 returned 100% blocks executed 100% 2: 328:ImagingPackXBGR(UINT8* out, const UINT8* in, int pixels) -: 329:{ -: 330: int i; -: 331: /* XBGR, reversed bytes with left padding */ 7: 332: for (i = 0; i < pixels; i++) { branch 0 taken 71% branch 1 taken 29% (fallthrough) 5: 333: out[0] = 0; 5: 334: out[1] = in[B]; 5: 335: out[2] = in[G]; 5: 336: out[3] = in[R]; 5: 337: out += 4; in += 4; -: 338: } 2: 339:} -: 340: -: 341:void function ImagingPackBGRA called 1687 returned 100% blocks executed 100% 1687: 342:ImagingPackBGRA(UINT8* out, const UINT8* in, int pixels) -: 343:{ -: 344: int i; -: 345: /* BGRX, reversed bytes with right padding */ 322628: 346: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 320941: 347: out[0] = in[B]; 320941: 348: out[1] = in[G]; 320941: 349: out[2] = in[R]; 320941: 350: out[3] = in[A]; 320941: 351: out += 4; in += 4; -: 352: } 1687: 353:} -: 354: -: 355:void function ImagingPackABGR called 2 returned 100% blocks executed 100% 2: 356:ImagingPackABGR(UINT8* out, const UINT8* in, int pixels) -: 357:{ -: 358: int i; -: 359: /* XBGR, reversed bytes with left padding */ 8: 360: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 6: 361: out[0] = in[A]; 6: 362: out[1] = in[B]; 6: 363: out[2] = in[G]; 6: 364: out[3] = in[R]; 6: 365: out += 4; in += 4; -: 366: } 2: 367:} -: 368: -: 369:void function ImagingPackBGRa called 1 returned 100% blocks executed 100% 1: 370:ImagingPackBGRa(UINT8* out, const UINT8* in, int pixels) -: 371:{ -: 372: int i; -: 373: /* BGRa, reversed bytes with premultiplied alpha */ 4: 374: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 3: 375: int alpha = out[3] = in[A]; -: 376: int tmp; 3: 377: out[0] = MULDIV255(in[B], alpha, tmp); 3: 378: out[1] = MULDIV255(in[G], alpha, tmp); 3: 379: out[2] = MULDIV255(in[R], alpha, tmp); 3: 380: out += 4; in += 4; -: 381: } 1: 382:} -: 383: -: 384:static void function packRGBL called 1033 returned 100% blocks executed 100% 1033: 385:packRGBL(UINT8* out, const UINT8* in, int pixels) -: 386:{ -: 387: int i; -: 388: /* RGB, line interleaved */ 329744: 389: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 328711: 390: out[i] = in[R]; 328711: 391: out[i+pixels] = in[G]; 328711: 392: out[i+pixels+pixels] = in[B]; 328711: 393: in += 4; -: 394: } 1033: 395:} -: 396: -: 397:static void function packRGBXL called 3 returned 100% blocks executed 100% 3: 398:packRGBXL(UINT8* out, const UINT8* in, int pixels) -: 399:{ -: 400: int i; -: 401: /* RGBX, line interleaved */ 12: 402: for (i = 0; i < pixels; i++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 9: 403: out[i] = in[R]; 9: 404: out[i+pixels] = in[G]; 9: 405: out[i+pixels+pixels] = in[B]; 9: 406: out[i+pixels+pixels+pixels] = in[X]; 9: 407: in += 4; -: 408: } 3: 409:} -: 410: -: 411:static void function packI16B called 293 returned 100% blocks executed 89% 293: 412:packI16B(UINT8* out, const UINT8* in_, int pixels) -: 413:{ -: 414: int i; -: 415: UINT16 tmp_; 293: 416: UINT8* tmp = (UINT8*) &tmp_; 22775: 417: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) -: 418: INT32 in; 22482: 419: memcpy(&in, in_, sizeof(in)); 22482: 420: if (in <= 0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 75: 421: tmp_ = 0; 22407: 422: } else if (in > 65535) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 423: tmp_ = 65535; -: 424: } else { 22407: 425: tmp_ = in; -: 426: } 22482: 427: C16B; 22482: 428: out += 2; in_ += sizeof(in); -: 429: } 293: 430:} -: 431: -: 432:static void function packI16N_I16B called 256 returned 100% blocks executed 100% 256: 433:packI16N_I16B(UINT8* out, const UINT8* in, int pixels){ -: 434: int i; 256: 435: UINT8* tmp = (UINT8*) in; 33024: 436: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 32768: 437: C16B; 32768: 438: out += 2; tmp += 2; -: 439: } -: 440: 256: 441:} -: 442:static void function packI16N_I16 called 0 returned 0% blocks executed 0% #####: 443:packI16N_I16(UINT8* out, const UINT8* in, int pixels){ -: 444: int i; #####: 445: UINT8* tmp = (UINT8*) in; #####: 446: for (i = 0; i < pixels; i++) { branch 0 never executed branch 1 never executed #####: 447: C16L; #####: 448: out += 2; tmp += 2; -: 449: } #####: 450:} -: 451: -: 452: -: 453:static void function packI32S called 290 returned 100% blocks executed 100% 290: 454:packI32S(UINT8* out, const UINT8* in, int pixels) -: 455:{ -: 456: int i; 290: 457: UINT8* tmp = (UINT8*) in; 34086: 458: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 33796: 459: C32L; 33796: 460: out += 4; tmp += 4; -: 461: } 290: 462:} -: 463: -: 464:void function ImagingPackLAB called 1025 returned 100% blocks executed 100% 1025: 465:ImagingPackLAB(UINT8* out, const UINT8* in, int pixels) -: 466:{ -: 467: int i; -: 468: /* LAB triplets */ 132100: 469: for (i = 0; i < pixels; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 131075: 470: out[0] = in[0]; 131075: 471: out[1] = in[1] ^ 128; /* signed in outside world */ 131075: 472: out[2] = in[2] ^ 128; 131075: 473: out += 3; in += 4; -: 474: } 1025: 475:} -: 476: -: 477:static void function copy1 called 195347 returned 100% blocks executed 100% 195347: 478:copy1(UINT8* out, const UINT8* in, int pixels) -: 479:{ -: 480: /* L, P */ 390694: 481: memcpy(out, in, pixels); 195347: 482:} -: 483: -: 484:static void function copy2 called 8121 returned 100% blocks executed 100% 8121: 485:copy2(UINT8* out, const UINT8* in, int pixels) -: 486:{ -: 487: /* I;16, etc */ 16242: 488: memcpy(out, in, pixels*2); 8121: 489:} -: 490: -: 491:static void function copy3 called 0 returned 0% blocks executed 0% #####: 492:copy3(UINT8* out, const UINT8* in, int pixels) -: 493:{ -: 494: /* BGR;24, etc */ #####: 495: memcpy(out, in, pixels*3); #####: 496:} -: 497: -: 498:static void function copy4 called 74849 returned 100% blocks executed 100% 74849: 499:copy4(UINT8* out, const UINT8* in, int pixels) -: 500:{ -: 501: /* RGBA, CMYK quadruples */ 149698: 502: memcpy(out, in, 4*pixels); 74849: 503:} -: 504: -: 505:static void function copy4I called 2189 returned 100% blocks executed 100% 2189: 506:copy4I(UINT8* out, const UINT8* in, int pixels) -: 507:{ -: 508: /* RGBA, CMYK quadruples, inverted */ -: 509: int i; 1022553: 510: for (i = 0; i < pixels*4; i++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 1020364: 511: out[i] = ~in[i]; -: 512: } 2189: 513:} -: 514: -: 515:static void function band0 called 6 returned 100% blocks executed 100% 6: 516:band0(UINT8* out, const UINT8* in, int pixels) -: 517:{ -: 518: int i; 24: 519: for (i = 0; i < pixels; i++, in += 4) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 18: 520: out[i] = in[0]; -: 521: } 6: 522:} -: 523: -: 524:static void function band1 called 6 returned 100% blocks executed 100% 6: 525:band1(UINT8* out, const UINT8* in, int pixels) -: 526:{ -: 527: int i; 24: 528: for (i = 0; i < pixels; i++, in += 4) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 18: 529: out[i] = in[1]; -: 530: } 6: 531:} -: 532: -: 533:static void function band2 called 6 returned 100% blocks executed 100% 6: 534:band2(UINT8* out, const UINT8* in, int pixels) -: 535:{ -: 536: int i; 24: 537: for (i = 0; i < pixels; i++, in += 4) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 18: 538: out[i] = in[2]; -: 539: } 6: 540:} -: 541: -: 542:static void function band3 called 5 returned 100% blocks executed 100% 5: 543:band3(UINT8* out, const UINT8* in, int pixels) -: 544:{ -: 545: int i; 526: 546: for (i = 0; i < pixels; i++, in += 4) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 521: 547: out[i] = in[3]; -: 548: } 5: 549:} -: 550: -: 551:static struct { -: 552: const char* mode; -: 553: const char* rawmode; -: 554: int bits; -: 555: ImagingShuffler pack; -: 556:} packers[] = { -: 557: -: 558: /* bilevel */ -: 559: {"1", "1", 1, pack1}, -: 560: {"1", "1;I", 1, pack1I}, -: 561: {"1", "1;R", 1, pack1R}, -: 562: {"1", "1;IR", 1, pack1IR}, -: 563: {"1", "L", 8, pack1L}, -: 564: -: 565: /* greyscale */ -: 566: {"L", "L", 8, copy1}, -: 567: {"L", "L;16", 16, packL16}, -: 568: {"L", "L;16B", 16, packL16B}, -: 569: -: 570: /* greyscale w. alpha */ -: 571: {"LA", "LA", 16, packLA}, -: 572: {"LA", "LA;L", 16, packLAL}, -: 573: -: 574: /* greyscale w. alpha premultiplied */ -: 575: {"La", "La", 16, packLA}, -: 576: -: 577: /* palette */ -: 578: {"P", "P;1", 1, pack1}, -: 579: {"P", "P;2", 2, packP2}, -: 580: {"P", "P;4", 4, packP4}, -: 581: {"P", "P", 8, copy1}, -: 582: -: 583: /* palette w. alpha */ -: 584: {"PA", "PA", 16, packLA}, -: 585: {"PA", "PA;L", 16, packLAL}, -: 586: -: 587: /* true colour */ -: 588: {"RGB", "RGB", 24, ImagingPackRGB}, -: 589: {"RGB", "RGBX", 32, copy4}, -: 590: {"RGB", "XRGB", 32, ImagingPackXRGB}, -: 591: {"RGB", "BGR", 24, ImagingPackBGR}, -: 592: {"RGB", "BGRX", 32, ImagingPackBGRX}, -: 593: {"RGB", "XBGR", 32, ImagingPackXBGR}, -: 594: {"RGB", "RGB;L", 24, packRGBL}, -: 595: {"RGB", "R", 8, band0}, -: 596: {"RGB", "G", 8, band1}, -: 597: {"RGB", "B", 8, band2}, -: 598: -: 599: /* true colour w. alpha */ -: 600: {"RGBA", "RGBA", 32, copy4}, -: 601: {"RGBA", "RGBA;L", 32, packRGBXL}, -: 602: {"RGBA", "RGB", 24, ImagingPackRGB}, -: 603: {"RGBA", "BGR", 24, ImagingPackBGR}, -: 604: {"RGBA", "BGRA", 32, ImagingPackBGRA}, -: 605: {"RGBA", "ABGR", 32, ImagingPackABGR}, -: 606: {"RGBA", "BGRa", 32, ImagingPackBGRa}, -: 607: {"RGBA", "R", 8, band0}, -: 608: {"RGBA", "G", 8, band1}, -: 609: {"RGBA", "B", 8, band2}, -: 610: {"RGBA", "A", 8, band3}, -: 611: -: 612: /* true colour w. alpha premultiplied */ -: 613: {"RGBa", "RGBa", 32, copy4}, -: 614: {"RGBa", "BGRa", 32, ImagingPackBGRA}, -: 615: {"RGBa", "aBGR", 32, ImagingPackABGR}, -: 616: -: 617: /* true colour w. padding */ -: 618: {"RGBX", "RGBX", 32, copy4}, -: 619: {"RGBX", "RGBX;L", 32, packRGBXL}, -: 620: {"RGBX", "RGB", 24, ImagingPackRGB}, -: 621: {"RGBX", "BGR", 24, ImagingPackBGR}, -: 622: {"RGBX", "BGRX", 32, ImagingPackBGRX}, -: 623: {"RGBX", "XBGR", 32, ImagingPackXBGR}, -: 624: {"RGBX", "R", 8, band0}, -: 625: {"RGBX", "G", 8, band1}, -: 626: {"RGBX", "B", 8, band2}, -: 627: {"RGBX", "X", 8, band3}, -: 628: -: 629: /* colour separation */ -: 630: {"CMYK", "CMYK", 32, copy4}, -: 631: {"CMYK", "CMYK;I", 32, copy4I}, -: 632: {"CMYK", "CMYK;L", 32, packRGBXL}, -: 633: {"CMYK", "C", 8, band0}, -: 634: {"CMYK", "M", 8, band1}, -: 635: {"CMYK", "Y", 8, band2}, -: 636: {"CMYK", "K", 8, band3}, -: 637: -: 638: /* video (YCbCr) */ -: 639: {"YCbCr", "YCbCr", 24, ImagingPackRGB}, -: 640: {"YCbCr", "YCbCr;L", 24, packRGBL}, -: 641: {"YCbCr", "YCbCrX", 32, copy4}, -: 642: {"YCbCr", "YCbCrK", 32, copy4}, -: 643: {"YCbCr", "Y", 8, band0}, -: 644: {"YCbCr", "Cb", 8, band1}, -: 645: {"YCbCr", "Cr", 8, band2}, -: 646: -: 647: /* LAB Color */ -: 648: {"LAB", "LAB", 24, ImagingPackLAB}, -: 649: {"LAB", "L", 8, band0}, -: 650: {"LAB", "A", 8, band1}, -: 651: {"LAB", "B", 8, band2}, -: 652: -: 653: /* HSV */ -: 654: {"HSV", "HSV", 24, ImagingPackRGB}, -: 655: {"HSV", "H", 8, band0}, -: 656: {"HSV", "S", 8, band1}, -: 657: {"HSV", "V", 8, band2}, -: 658: -: 659: /* integer */ -: 660: {"I", "I", 32, copy4}, -: 661: {"I", "I;16B", 16, packI16B}, -: 662: {"I", "I;32S", 32, packI32S}, -: 663: {"I", "I;32NS", 32, copy4}, -: 664: -: 665: /* floating point */ -: 666: {"F", "F", 32, copy4}, -: 667: {"F", "F;32F", 32, packI32S}, -: 668: {"F", "F;32NF", 32, copy4}, -: 669: -: 670: /* storage modes */ -: 671: {"I;16", "I;16", 16, copy2}, -: 672: {"I;16", "I;16B", 16, packI16N_I16B}, -: 673: {"I;16B", "I;16B", 16, copy2}, -: 674: {"I;16L", "I;16L", 16, copy2}, -: 675: {"I;16", "I;16N", 16, packI16N_I16}, // LibTiff native->image endian. -: 676: {"I;16L", "I;16N", 16, packI16N_I16}, -: 677: {"I;16B", "I;16N", 16, packI16N_I16B}, -: 678: {"BGR;15", "BGR;15", 16, copy2}, -: 679: {"BGR;16", "BGR;16", 16, copy2}, -: 680: {"BGR;24", "BGR;24", 24, copy3}, -: 681: -: 682: {NULL} /* sentinel */ -: 683:}; -: 684: -: 685: -: 686:ImagingShuffler function ImagingFindPacker called 4061 returned 100% blocks executed 100% 4061: 687:ImagingFindPacker(const char* mode, const char* rawmode, int* bits_out) -: 688:{ -: 689: int i; -: 690: -: 691: /* find a suitable pixel packer */ 73470: 692: for (i = 0; packers[i].rawmode; i++) { branch 0 taken 100% branch 1 taken 0% (fallthrough) 79838: 693: if (strcmp(packers[i].mode, mode) == 0 && branch 0 taken 9% (fallthrough) branch 1 taken 91% branch 2 taken 64% (fallthrough) branch 3 taken 36% 6368: 694: strcmp(packers[i].rawmode, rawmode) == 0) { 4061: 695: if (bits_out) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 4061: 696: *bits_out = packers[i].bits; -: 697: } 4061: 698: return packers[i].pack; -: 699: } -: 700: } -: 701: return NULL; -: 702:} <<<<<< EOF # path=/home/travis/build/python-pillow/Pillow/src#libImaging#Geometry.c.gcov -: 0:Source:src/libImaging/Geometry.c -: 0:Graph:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Geometry.gcno -: 0:Data:/home/travis/build/python-pillow/Pillow/build/temp.linux-aarch64-3.6/src/libImaging/Geometry.gcda -: 0:Runs:3 -: 0:Programs:1 -: 1:#include "Imaging.h" -: 2: -: 3:/* For large images rotation is an inefficient operation in terms of CPU cache. -: 4: One row in the source image affects each column in destination. -: 5: Rotating in chunks that fit in the cache can speed up rotation -: 6: 8x on a modern CPU. A chunk size of 128 requires only 65k and is large enough -: 7: that the overhead from the extra loops are not apparent. */ -: 8:#define ROTATE_CHUNK 512 -: 9:#define ROTATE_SMALL_CHUNK 8 -: 10: -: 11:#define COORD(v) ((v) < 0.0 ? -1 : ((int)(v))) -: 12:#define FLOOR(v) ((v) < 0.0 ? ((int)floor(v)) : ((int)(v))) -: 13: -: 14:/* -------------------------------------------------------------------- */ -: 15:/* Transpose operations */ -: 16: -: 17:Imaging function ImagingFlipLeftRight called 33 returned 100% blocks executed 94% 33: 18:ImagingFlipLeftRight(Imaging imOut, Imaging imIn) -: 19:{ -: 20: ImagingSectionCookie cookie; -: 21: int x, y, xr; -: 22: 33: 23: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 24: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 25: } 33: 26: if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 27: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 28: } -: 29: 33: 30: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 31: -: 32:#define FLIP_LEFT_RIGHT(INT, image) \ -: 33: for (y = 0; y < imIn->ysize; y++) { \ -: 34: INT* in = (INT *)imIn->image[y]; \ -: 35: INT* out = (INT *)imOut->image[y]; \ -: 36: xr = imIn->xsize-1; \ -: 37: for (x = 0; x < imIn->xsize; x++, xr--) { \ -: 38: out[xr] = in[x]; \ -: 39: } \ -: 40: } -: 41: 33: 42: ImagingSectionEnter(&cookie); call 0 returned 100% -: 43: 33: 44: if (imIn->image8) { branch 0 taken 36% (fallthrough) branch 1 taken 64% 21: 45: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 29% (fallthrough) branch 1 taken 71% 1869: 46: FLIP_LEFT_RIGHT(UINT16, image8) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% -: 47: } else { 751: 48: FLIP_LEFT_RIGHT(UINT8, image8) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% -: 49: } -: 50: } else { 1463: 51: FLIP_LEFT_RIGHT(INT32, image32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) -: 52: } -: 53: 33: 54: ImagingSectionLeave(&cookie); call 0 returned 100% -: 55: -: 56:#undef FLIP_LEFT_RIGHT -: 57: 33: 58: return imOut; -: 59:} -: 60: -: 61: -: 62:Imaging function ImagingFlipTopBottom called 31 returned 100% blocks executed 86% 31: 63:ImagingFlipTopBottom(Imaging imOut, Imaging imIn) -: 64:{ -: 65: ImagingSectionCookie cookie; -: 66: int y, yr; -: 67: 31: 68: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 69: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 70: } 31: 71: if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 72: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 73: } -: 74: 31: 75: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 76: 31: 77: ImagingSectionEnter(&cookie); call 0 returned 100% -: 78: 31: 79: yr = imIn->ysize - 1; 3914: 80: for (y = 0; y < imIn->ysize; y++, yr--) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 7766: 81: memcpy(imOut->image[yr], imIn->image[y], imIn->linesize); -: 82: } -: 83: 31: 84: ImagingSectionLeave(&cookie); call 0 returned 100% -: 85: 31: 86: return imOut; -: 87:} -: 88: -: 89: -: 90:Imaging function ImagingRotate90 called 68 returned 100% blocks executed 97% 68: 91:ImagingRotate90(Imaging imOut, Imaging imIn) -: 92:{ -: 93: ImagingSectionCookie cookie; -: 94: int x, y, xx, yy, xr, xxsize, yysize; -: 95: int xxx, yyy, xxxsize, yyysize; -: 96: 68: 97: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 98: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 99: } 68: 100: if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 101: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 102: } -: 103: 68: 104: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 105: -: 106:#define ROTATE_90(INT, image) \ -: 107: for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ -: 108: for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ -: 109: yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ -: 110: xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ -: 111: for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ -: 112: for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ -: 113: yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ -: 114: xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ -: 115: for (yyy = yy; yyy < yyysize; yyy++) { \ -: 116: INT* in = (INT *)imIn->image[yyy]; \ -: 117: xr = imIn->xsize - 1 - xx; \ -: 118: for (xxx = xx; xxx < xxxsize; xxx++, xr--) { \ -: 119: INT* out = (INT *)imOut->image[xr]; \ -: 120: out[yyy] = in[xxx]; \ -: 121: } \ -: 122: } \ -: 123: } \ -: 124: } \ -: 125: } \ -: 126: } -: 127: 68: 128: ImagingSectionEnter(&cookie); call 0 returned 100% -: 129: 68: 130: if (imIn->image8) { branch 0 taken 18% (fallthrough) branch 1 taken 82% 56: 131: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 79% (fallthrough) branch 1 taken 21% 12: 132: ROTATE_90(UINT16, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 133: } else { 44: 134: ROTATE_90(UINT8, image8); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 98% branch 5 taken 2% (fallthrough) branch 6 taken 97% branch 7 taken 3% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 135: } -: 136: } else { 12: 137: ROTATE_90(INT32, image32); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 96% branch 5 taken 4% (fallthrough) branch 6 taken 96% branch 7 taken 4% branch 8 taken 52% branch 9 taken 48% (fallthrough) branch 10 taken 48% branch 11 taken 52% (fallthrough) -: 138: } -: 139: 68: 140: ImagingSectionLeave(&cookie); call 0 returned 100% -: 141: -: 142:#undef ROTATE_90 -: 143: 68: 144: return imOut; -: 145:} -: 146: -: 147: -: 148:Imaging function ImagingTranspose called 140 returned 100% blocks executed 97% 140: 149:ImagingTranspose(Imaging imOut, Imaging imIn) -: 150:{ -: 151: ImagingSectionCookie cookie; -: 152: int x, y, xx, yy, xxsize, yysize; -: 153: int xxx, yyy, xxxsize, yyysize; -: 154: 140: 155: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 156: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 157: } 140: 158: if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 159: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 160: } -: 161: 140: 162: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 163: -: 164:#define TRANSPOSE(INT, image) \ -: 165: for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ -: 166: for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ -: 167: yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ -: 168: xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ -: 169: for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ -: 170: for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ -: 171: yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ -: 172: xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ -: 173: for (yyy = yy; yyy < yyysize; yyy++) { \ -: 174: INT* in = (INT *)imIn->image[yyy]; \ -: 175: for (xxx = xx; xxx < xxxsize; xxx++) { \ -: 176: INT* out = (INT *)imOut->image[xxx]; \ -: 177: out[yyy] = in[xxx]; \ -: 178: } \ -: 179: } \ -: 180: } \ -: 181: } \ -: 182: } \ -: 183: } -: 184: 140: 185: ImagingSectionEnter(&cookie); call 0 returned 100% -: 186: 140: 187: if (imIn->image8) { branch 0 taken 60% (fallthrough) branch 1 taken 40% 56: 188: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 79% (fallthrough) branch 1 taken 21% 12: 189: TRANSPOSE(UINT16, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 190: } else { 44: 191: TRANSPOSE(UINT8, image8); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 87% branch 7 taken 13% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 192: } -: 193: } else { 84: 194: TRANSPOSE(INT32, image32); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 90% branch 7 taken 10% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% (fallthrough) -: 195: } -: 196: 140: 197: ImagingSectionLeave(&cookie); call 0 returned 100% -: 198: -: 199:#undef TRANSPOSE -: 200: 140: 201: return imOut; -: 202:} -: 203: -: 204: -: 205:Imaging function ImagingTransverse called 24 returned 100% blocks executed 97% 24: 206:ImagingTransverse(Imaging imOut, Imaging imIn) -: 207:{ -: 208: ImagingSectionCookie cookie; -: 209: int x, y, xr, yr, xx, yy, xxsize, yysize; -: 210: int xxx, yyy, xxxsize, yyysize; -: 211: 24: 212: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 213: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 214: } 24: 215: if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 216: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 217: } -: 218: 24: 219: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 220: -: 221:#define TRANSVERSE(INT, image) \ -: 222: for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ -: 223: for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ -: 224: yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ -: 225: xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ -: 226: for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ -: 227: for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ -: 228: yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ -: 229: xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ -: 230: yr = imIn->ysize - 1 - yy; \ -: 231: for (yyy = yy; yyy < yyysize; yyy++, yr--) { \ -: 232: INT* in = (INT *)imIn->image[yyy]; \ -: 233: xr = imIn->xsize - 1 - xx; \ -: 234: for (xxx = xx; xxx < xxxsize; xxx++, xr--) { \ -: 235: INT* out = (INT *)imOut->image[xr]; \ -: 236: out[yr] = in[xxx]; \ -: 237: } \ -: 238: } \ -: 239: } \ -: 240: } \ -: 241: } \ -: 242: } -: 243: 24: 244: ImagingSectionEnter(&cookie); call 0 returned 100% -: 245: 24: 246: if (imIn->image8) { branch 0 taken 33% (fallthrough) branch 1 taken 67% 16: 247: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 12: 248: TRANSVERSE(UINT16, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 249: } else { 4: 250: TRANSVERSE(UINT8, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 251: } -: 252: } else { 8: 253: TRANSVERSE(INT32, image32); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% (fallthrough) -: 254: } -: 255: 24: 256: ImagingSectionLeave(&cookie); call 0 returned 100% -: 257: -: 258:#undef TRANSVERSE -: 259: 24: 260: return imOut; -: 261:} -: 262: -: 263: -: 264:Imaging function ImagingRotate180 called 58 returned 100% blocks executed 94% 58: 265:ImagingRotate180(Imaging imOut, Imaging imIn) -: 266:{ -: 267: ImagingSectionCookie cookie; -: 268: int x, y, xr, yr; -: 269: 58: 270: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 271: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 272: } 58: 273: if (imIn->xsize != imOut->xsize || imIn->ysize != imOut->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 274: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 275: } -: 276: 58: 277: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 278: -: 279:#define ROTATE_180(INT, image) \ -: 280: for (y = 0; y < imIn->ysize; y++, yr--) { \ -: 281: INT* in = (INT *)imIn->image[y]; \ -: 282: INT* out = (INT *)imOut->image[yr]; \ -: 283: xr = imIn->xsize-1; \ -: 284: for (x = 0; x < imIn->xsize; x++, xr--) { \ -: 285: out[xr] = in[x]; \ -: 286: } \ -: 287: } -: 288: 58: 289: ImagingSectionEnter(&cookie); call 0 returned 100% -: 290: 58: 291: yr = imIn->ysize-1; 58: 292: if (imIn->image8) { branch 0 taken 24% (fallthrough) branch 1 taken 76% 44: 293: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 73% (fallthrough) branch 1 taken 27% 1524: 294: ROTATE_180(UINT16, image8) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% -: 295: } else { 4988: 296: ROTATE_180(UINT8, image8) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% -: 297: } -: 298: } else { 2156: 299: ROTATE_180(INT32, image32) branch 0 taken 99% branch 1 taken 1% (fallthrough) branch 2 taken 99% branch 3 taken 1% (fallthrough) -: 300: } -: 301: 58: 302: ImagingSectionLeave(&cookie); call 0 returned 100% -: 303: -: 304:#undef ROTATE_180 -: 305: 58: 306: return imOut; -: 307:} -: 308: -: 309: -: 310:Imaging function ImagingRotate270 called 45 returned 100% blocks executed 97% 45: 311:ImagingRotate270(Imaging imOut, Imaging imIn) -: 312:{ -: 313: ImagingSectionCookie cookie; -: 314: int x, y, xx, yy, yr, xxsize, yysize; -: 315: int xxx, yyy, xxxsize, yyysize; -: 316: 45: 317: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 318: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 319: } 45: 320: if (imIn->xsize != imOut->ysize || imIn->ysize != imOut->xsize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 321: return (Imaging) ImagingError_Mismatch(); call 0 never executed -: 322: } -: 323: 45: 324: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 325: -: 326:#define ROTATE_270(INT, image) \ -: 327: for (y = 0; y < imIn->ysize; y += ROTATE_CHUNK) { \ -: 328: for (x = 0; x < imIn->xsize; x += ROTATE_CHUNK) { \ -: 329: yysize = y + ROTATE_CHUNK < imIn->ysize ? y + ROTATE_CHUNK : imIn->ysize; \ -: 330: xxsize = x + ROTATE_CHUNK < imIn->xsize ? x + ROTATE_CHUNK : imIn->xsize; \ -: 331: for (yy = y; yy < yysize; yy += ROTATE_SMALL_CHUNK) { \ -: 332: for (xx = x; xx < xxsize; xx += ROTATE_SMALL_CHUNK) { \ -: 333: yyysize = yy + ROTATE_SMALL_CHUNK < imIn->ysize ? yy + ROTATE_SMALL_CHUNK : imIn->ysize; \ -: 334: xxxsize = xx + ROTATE_SMALL_CHUNK < imIn->xsize ? xx + ROTATE_SMALL_CHUNK : imIn->xsize; \ -: 335: yr = imIn->ysize - 1 - yy; \ -: 336: for (yyy = yy; yyy < yyysize; yyy++, yr--) { \ -: 337: INT* in = (INT *)imIn->image[yyy]; \ -: 338: for (xxx = xx; xxx < xxxsize; xxx++) { \ -: 339: INT* out = (INT *)imOut->image[xxx]; \ -: 340: out[yr] = in[xxx]; \ -: 341: } \ -: 342: } \ -: 343: } \ -: 344: } \ -: 345: } \ -: 346: } -: 347: 45: 348: ImagingSectionEnter(&cookie); call 0 returned 100% -: 349: 45: 350: if (imIn->image8) { branch 0 taken 29% (fallthrough) branch 1 taken 71% 32: 351: if (strncmp(imIn->mode, "I;16", 4) == 0) { branch 0 taken 63% (fallthrough) branch 1 taken 38% 12: 352: ROTATE_270(UINT16, image8); branch 0 taken 88% branch 1 taken 12% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 94% branch 5 taken 6% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 353: } else { 20: 354: ROTATE_270(UINT8, image8); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 95% branch 5 taken 5% (fallthrough) branch 6 taken 94% branch 7 taken 6% branch 8 taken 50% branch 9 taken 50% (fallthrough) branch 10 taken 50% branch 11 taken 50% -: 355: } -: 356: } else { 13: 357: ROTATE_270(INT32, image32); branch 0 taken 89% branch 1 taken 11% (fallthrough) branch 2 taken 89% branch 3 taken 11% branch 4 taken 96% branch 5 taken 4% (fallthrough) branch 6 taken 95% branch 7 taken 5% branch 8 taken 52% branch 9 taken 48% (fallthrough) branch 10 taken 48% branch 11 taken 52% (fallthrough) -: 358: } -: 359: 45: 360: ImagingSectionLeave(&cookie); call 0 returned 100% -: 361: -: 362:#undef ROTATE_270 -: 363: 45: 364: return imOut; -: 365:} -: 366: -: 367: -: 368:/* -------------------------------------------------------------------- */ -: 369:/* Transforms */ -: 370: -: 371:/* transform primitives (ImagingTransformMap) */ -: 372: -: 373:static int function affine_transform called 879938 returned 100% blocks executed 100% 879938: 374:affine_transform(double* xout, double* yout, int x, int y, void* data) -: 375:{ -: 376: /* full moon tonight. your compiler will generate bogus code -: 377: for simple expressions, unless you reorganize the code, or -: 378: install Service Pack 3 */ -: 379: 879938: 380: double* a = (double*) data; 879938: 381: double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; 879938: 382: double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; -: 383: 879938: 384: double xin = x + 0.5; 879938: 385: double yin = y + 0.5; -: 386: 879938: 387: xout[0] = a0*xin + a1*yin + a2; 879938: 388: yout[0] = a3*xin + a4*yin + a5; -: 389: 879938: 390: return 1; -: 391:} -: 392: -: 393:static int function perspective_transform called 1006161 returned 100% blocks executed 100% 1006161: 394:perspective_transform(double* xout, double* yout, int x, int y, void* data) -: 395:{ 1006161: 396: double* a = (double*) data; 1006161: 397: double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; 1006161: 398: double a3 = a[3]; double a4 = a[4]; double a5 = a[5]; 1006161: 399: double a6 = a[6]; double a7 = a[7]; -: 400: 1006161: 401: double xin = x + 0.5; 1006161: 402: double yin = y + 0.5; -: 403: 1006161: 404: xout[0] = (a0*xin + a1*yin + a2) / (a6*xin + a7*yin + 1); 1006161: 405: yout[0] = (a3*xin + a4*yin + a5) / (a6*xin + a7*yin + 1); -: 406: 1006161: 407: return 1; -: 408:} -: 409: -: 410:static int function quad_transform called 75540 returned 100% blocks executed 100% 75540: 411:quad_transform(double* xout, double* yout, int x, int y, void* data) -: 412:{ -: 413: /* quad warp: map quadrilateral to rectangle */ -: 414: 75540: 415: double* a = (double*) data; 75540: 416: double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3]; 75540: 417: double a4 = a[4]; double a5 = a[5]; double a6 = a[6]; double a7 = a[7]; -: 418: 75540: 419: double xin = x + 0.5; 75540: 420: double yin = y + 0.5; -: 421: 75540: 422: xout[0] = a0 + a1*xin + a2*yin + a3*xin*yin; 75540: 423: yout[0] = a4 + a5*xin + a6*yin + a7*xin*yin; -: 424: 75540: 425: return 1; -: 426:} -: 427: -: 428:/* transform filters (ImagingTransformFilter) */ -: 429: -: 430:static int function nearest_filter8 called 10004 returned 100% blocks executed 100% 10004: 431:nearest_filter8(void* out, Imaging im, double xin, double yin) -: 432:{ 10004: 433: int x = COORD(xin); branch 0 taken 100% (fallthrough) branch 1 taken 0% 10004: 434: int y = COORD(yin); branch 0 taken 100% (fallthrough) branch 1 taken 0% 10004: 435: if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 436: return 0; -: 437: } 10004: 438: ((UINT8*)out)[0] = im->image8[y][x]; 10004: 439: return 1; -: 440:} -: 441: -: 442:static int function nearest_filter16 called 3252 returned 100% blocks executed 100% 3252: 443:nearest_filter16(void* out, Imaging im, double xin, double yin) -: 444:{ 3252: 445: int x = COORD(xin); branch 0 taken 100% (fallthrough) branch 1 taken 0% 3252: 446: int y = COORD(yin); branch 0 taken 100% (fallthrough) branch 1 taken 0% 3252: 447: if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 448: return 0; -: 449: } 6504: 450: memcpy(out, im->image8[y] + x * sizeof(INT16), sizeof(INT16)); 3252: 451: return 1; -: 452:} -: 453: -: 454:static int function nearest_filter32 called 335387 returned 100% blocks executed 100% 335387: 455:nearest_filter32(void* out, Imaging im, double xin, double yin) -: 456:{ 335387: 457: int x = COORD(xin); branch 0 taken 98% (fallthrough) branch 1 taken 2% 335387: 458: int y = COORD(yin); branch 0 taken 98% (fallthrough) branch 1 taken 2% 335387: 459: if (x < 0 || x >= im->xsize || y < 0 || y >= im->ysize) { branch 0 taken 98% (fallthrough) branch 1 taken 2% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 98% (fallthrough) branch 5 taken 2% branch 6 taken 100% (fallthrough) branch 7 taken 0% -: 460: return 0; -: 461: } 645998: 462: memcpy(out, &im->image32[y][x], sizeof(INT32)); 322999: 463: return 1; -: 464:} -: 465: -: 466:#define XCLIP(im, x) ( ((x) < 0) ? 0 : ((x) < im->xsize) ? (x) : im->xsize-1 ) -: 467:#define YCLIP(im, y) ( ((y) < 0) ? 0 : ((y) < im->ysize) ? (y) : im->ysize-1 ) -: 468: -: 469:#define BILINEAR(v, a, b, d)\ -: 470: (v = (a) + ( (b) - (a) ) * (d)) -: 471: -: 472:#define BILINEAR_HEAD(type)\ -: 473: int x, y;\ -: 474: int x0, x1;\ -: 475: double v1, v2;\ -: 476: double dx, dy;\ -: 477: type* in;\ -: 478: if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize) {\ -: 479: return 0;\ -: 480: }\ -: 481: xin -= 0.5;\ -: 482: yin -= 0.5;\ -: 483: x = FLOOR(xin);\ -: 484: y = FLOOR(yin);\ -: 485: dx = xin - x;\ -: 486: dy = yin - y; -: 487: -: 488:#define BILINEAR_BODY(type, image, step, offset) {\ -: 489: in = (type*) ((image)[YCLIP(im, y)] + offset);\ -: 490: x0 = XCLIP(im, x+0)*step;\ -: 491: x1 = XCLIP(im, x+1)*step;\ -: 492: BILINEAR(v1, in[x0], in[x1], dx);\ -: 493: if (y+1 >= 0 && y+1 < im->ysize) {\ -: 494: in = (type*) ((image)[y+1] + offset);\ -: 495: BILINEAR(v2, in[x0], in[x1], dx);\ -: 496: } else {\ -: 497: v2 = v1;\ -: 498: }\ -: 499: BILINEAR(v1, v1, v2, dy);\ -: 500:} -: 501: -: 502:static int function bilinear_filter8 called 16384 returned 100% blocks executed 88% 16384: 503:bilinear_filter8(void* out, Imaging im, double xin, double yin) -: 504:{ 16384: 505: BILINEAR_HEAD(UINT8); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 0% (fallthrough) branch 9 taken 100% branch 10 taken 3% (fallthrough) branch 11 taken 97% 16384: 506: BILINEAR_BODY(UINT8, im->image8, 1, 0); branch 0 taken 97% (fallthrough) branch 1 taken 3% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 3% (fallthrough) branch 11 taken 97% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 100% (fallthrough) branch 15 taken 0% 16384: 507: ((UINT8*)out)[0] = (UINT8) v1; 16384: 508: return 1; -: 509:} -: 510: -: 511:static int function bilinear_filter32I called 0 returned 0% blocks executed 0% #####: 512:bilinear_filter32I(void* out, Imaging im, double xin, double yin) -: 513:{ -: 514: INT32 k; #####: 515: BILINEAR_HEAD(INT32); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 516: BILINEAR_BODY(INT32, im->image32, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed #####: 517: k = v1; #####: 518: memcpy(out, &k, sizeof(k)); #####: 519: return 1; -: 520:} -: 521: -: 522:static int function bilinear_filter32F called 0 returned 0% blocks executed 0% #####: 523:bilinear_filter32F(void* out, Imaging im, double xin, double yin) -: 524:{ -: 525: FLOAT32 k; #####: 526: BILINEAR_HEAD(FLOAT32); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 527: BILINEAR_BODY(FLOAT32, im->image32, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed #####: 528: k = v1; #####: 529: memcpy(out, &k, sizeof(k)); #####: 530: return 1; -: 531:} -: 532: -: 533:static int function bilinear_filter32LA called 16384 returned 100% blocks executed 81% 16384: 534:bilinear_filter32LA(void* out, Imaging im, double xin, double yin) -: 535:{ 16384: 536: BILINEAR_HEAD(UINT8); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 50% (fallthrough) branch 3 taken 50% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 50% (fallthrough) branch 7 taken 50% branch 8 taken 0% (fallthrough) branch 9 taken 100% branch 10 taken 0% (fallthrough) branch 11 taken 100% 4096: 537: BILINEAR_BODY(UINT8, im->image, 4, 0); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 100% (fallthrough) branch 11 taken 0% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 100% (fallthrough) branch 15 taken 0% 4096: 538: ((UINT8*)out)[0] = (UINT8) v1; 4096: 539: ((UINT8*)out)[1] = (UINT8) v1; 4096: 540: ((UINT8*)out)[2] = (UINT8) v1; 4096: 541: BILINEAR_BODY(UINT8, im->image, 4, 3); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 100% (fallthrough) branch 11 taken 0% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 100% (fallthrough) branch 15 taken 0% 4096: 542: ((UINT8*)out)[3] = (UINT8) v1; 4096: 543: return 1; -: 544:} -: 545: -: 546:static int function bilinear_filter32RGB called 827178 returned 100% blocks executed 93% 827178: 547:bilinear_filter32RGB(void* out, Imaging im, double xin, double yin) -: 548:{ -: 549: int b; 827178: 550: BILINEAR_HEAD(UINT8); branch 0 taken 98% (fallthrough) branch 1 taken 2% branch 2 taken 97% (fallthrough) branch 3 taken 3% branch 4 taken 98% (fallthrough) branch 5 taken 2% branch 6 taken 98% (fallthrough) branch 7 taken 2% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) branch 11 taken 99% 3073400: 551: for (b = 0; b < im->bands; b++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 2312318: 552: BILINEAR_BODY(UINT8, im->image, 4, b); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 99% (fallthrough) branch 5 taken 1% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 99% (fallthrough) branch 11 taken 1% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 99% (fallthrough) branch 15 taken 1% 2312318: 553: ((UINT8*)out)[b] = (UINT8) v1; -: 554: } -: 555: return 1; -: 556:} -: 557: -: 558:#undef BILINEAR -: 559:#undef BILINEAR_HEAD -: 560:#undef BILINEAR_BODY -: 561: -: 562:#define BICUBIC(v, v1, v2, v3, v4, d) {\ -: 563: double p1 = v2;\ -: 564: double p2 = -v1 + v3;\ -: 565: double p3 = 2*(v1 - v2) + v3 - v4;\ -: 566: double p4 = -v1 + v2 - v3 + v4;\ -: 567: v = p1 + (d)*(p2 + (d)*(p3 + (d)*p4));\ -: 568:} -: 569: -: 570:#define BICUBIC_HEAD(type)\ -: 571: int x = FLOOR(xin);\ -: 572: int y = FLOOR(yin);\ -: 573: int x0, x1, x2, x3;\ -: 574: double v1, v2, v3, v4;\ -: 575: double dx, dy;\ -: 576: type* in;\ -: 577: if (xin < 0.0 || xin >= im->xsize || yin < 0.0 || yin >= im->ysize) {\ -: 578: return 0;\ -: 579: }\ -: 580: xin -= 0.5;\ -: 581: yin -= 0.5;\ -: 582: x = FLOOR(xin);\ -: 583: y = FLOOR(yin);\ -: 584: dx = xin - x;\ -: 585: dy = yin - y;\ -: 586: x--; y--; -: 587: -: 588:#define BICUBIC_BODY(type, image, step, offset) {\ -: 589: in = (type*) ((image)[YCLIP(im, y)] + offset);\ -: 590: x0 = XCLIP(im, x+0)*step;\ -: 591: x1 = XCLIP(im, x+1)*step;\ -: 592: x2 = XCLIP(im, x+2)*step;\ -: 593: x3 = XCLIP(im, x+3)*step;\ -: 594: BICUBIC(v1, in[x0], in[x1], in[x2], in[x3], dx);\ -: 595: if (y+1 >= 0 && y+1 < im->ysize) {\ -: 596: in = (type*) ((image)[y+1] + offset);\ -: 597: BICUBIC(v2, in[x0], in[x1], in[x2], in[x3], dx);\ -: 598: } else {\ -: 599: v2 = v1;\ -: 600: }\ -: 601: if (y+2 >= 0 && y+2 < im->ysize) {\ -: 602: in = (type*) ((image)[y+2] + offset);\ -: 603: BICUBIC(v3, in[x0], in[x1], in[x2], in[x3], dx);\ -: 604: } else {\ -: 605: v3 = v2;\ -: 606: }\ -: 607: if (y+3 >= 0 && y+3 < im->ysize) {\ -: 608: in = (type*) ((image)[y+3] + offset);\ -: 609: BICUBIC(v4, in[x0], in[x1], in[x2], in[x3], dx);\ -: 610: } else {\ -: 611: v4 = v3;\ -: 612: }\ -: 613: BICUBIC(v1, v1, v2, v3, v4, dy);\ -: 614:} -: 615: -: 616: -: 617:static int function bicubic_filter8 called 0 returned 0% blocks executed 0% #####: 618:bicubic_filter8(void* out, Imaging im, double xin, double yin) -: 619:{ #####: 620: BICUBIC_HEAD(UINT8); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 621: BICUBIC_BODY(UINT8, im->image8, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 622: if (v1 <= 0.0) { branch 0 never executed branch 1 never executed #####: 623: ((UINT8*)out)[0] = 0; #####: 624: } else if (v1 >= 255.0) { branch 0 never executed branch 1 never executed #####: 625: ((UINT8*)out)[0] = 255; -: 626: } else { #####: 627: ((UINT8*)out)[0] = (UINT8) v1; -: 628: } -: 629: return 1; -: 630:} -: 631: -: 632:static int function bicubic_filter32I called 0 returned 0% blocks executed 0% #####: 633:bicubic_filter32I(void* out, Imaging im, double xin, double yin) -: 634:{ -: 635: INT32 k; #####: 636: BICUBIC_HEAD(INT32); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 637: BICUBIC_BODY(INT32, im->image32, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 638: k = v1; #####: 639: memcpy(out, &k, sizeof(k)); #####: 640: return 1; -: 641:} -: 642: -: 643:static int function bicubic_filter32F called 0 returned 0% blocks executed 0% #####: 644:bicubic_filter32F(void* out, Imaging im, double xin, double yin) -: 645:{ -: 646: FLOAT32 k; #####: 647: BICUBIC_HEAD(FLOAT32); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 648: BICUBIC_BODY(FLOAT32, im->image32, 1, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 649: k = v1; #####: 650: memcpy(out, &k, sizeof(k)); #####: 651: return 1; -: 652:} -: 653: -: 654:static int function bicubic_filter32LA called 0 returned 0% blocks executed 0% #####: 655:bicubic_filter32LA(void* out, Imaging im, double xin, double yin) -: 656:{ #####: 657: BICUBIC_HEAD(UINT8); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed #####: 658: BICUBIC_BODY(UINT8, im->image, 4, 0); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 659: if (v1 <= 0.0) { branch 0 never executed branch 1 never executed #####: 660: ((UINT8*)out)[0] = 0; #####: 661: ((UINT8*)out)[1] = 0; #####: 662: ((UINT8*)out)[2] = 0; #####: 663: } else if (v1 >= 255.0) { branch 0 never executed branch 1 never executed #####: 664: ((UINT8*)out)[0] = 255; #####: 665: ((UINT8*)out)[1] = 255; #####: 666: ((UINT8*)out)[2] = 255; -: 667: } else { #####: 668: ((UINT8*)out)[0] = (UINT8) v1; #####: 669: ((UINT8*)out)[1] = (UINT8) v1; #####: 670: ((UINT8*)out)[2] = (UINT8) v1; -: 671: } #####: 672: BICUBIC_BODY(UINT8, im->image, 4, 3); branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed branch 14 never executed branch 15 never executed branch 16 never executed branch 17 never executed branch 18 never executed branch 19 never executed branch 20 never executed branch 21 never executed branch 22 never executed branch 23 never executed branch 24 never executed branch 25 never executed branch 26 never executed branch 27 never executed branch 28 never executed branch 29 never executed branch 30 never executed branch 31 never executed #####: 673: if (v1 <= 0.0) { branch 0 never executed branch 1 never executed #####: 674: ((UINT8*)out)[3] = 0; #####: 675: } else if (v1 >= 255.0) { branch 0 never executed branch 1 never executed #####: 676: ((UINT8*)out)[3] = 255; -: 677: } else { #####: 678: ((UINT8*)out)[3] = (UINT8) v1; -: 679: } -: 680: return 1; -: 681:} -: 682: -: 683:static int function bicubic_filter32RGB called 753050 returned 100% blocks executed 94% 753050: 684:bicubic_filter32RGB(void* out, Imaging im, double xin, double yin) -: 685:{ -: 686: int b; 753050: 687: BICUBIC_HEAD(UINT8); branch 0 taken 96% (fallthrough) branch 1 taken 4% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 98% (fallthrough) branch 5 taken 2% branch 6 taken 99% (fallthrough) branch 7 taken 1% branch 8 taken 1% (fallthrough) branch 9 taken 99% branch 10 taken 1% (fallthrough) branch 11 taken 99% 2766012: 688: for (b = 0; b < im->bands; b++) { branch 0 taken 75% branch 1 taken 25% (fallthrough) 2074509: 689: BICUBIC_BODY(UINT8, im->image, 4, b); branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 99% (fallthrough) branch 5 taken 1% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 99% (fallthrough) branch 9 taken 1% branch 10 taken 100% (fallthrough) branch 11 taken 0% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 99% (fallthrough) branch 15 taken 1% branch 16 taken 100% (fallthrough) branch 17 taken 0% branch 18 taken 99% (fallthrough) branch 19 taken 1% branch 20 taken 99% (fallthrough) branch 21 taken 1% branch 22 taken 100% (fallthrough) branch 23 taken 0% branch 24 taken 100% (fallthrough) branch 25 taken 0% branch 26 taken 99% (fallthrough) branch 27 taken 1% branch 28 taken 100% (fallthrough) branch 29 taken 0% branch 30 taken 98% (fallthrough) branch 31 taken 2% 2074509: 690: if (v1 <= 0.0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 9946: 691: ((UINT8*)out)[b] = 0; 2064563: 692: } else if (v1 >= 255.0) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 15110: 693: ((UINT8*)out)[b] = 255; -: 694: } else { 2049453: 695: ((UINT8*)out)[b] = (UINT8) v1; -: 696: } -: 697: } -: 698: return 1; -: 699:} -: 700: -: 701:#undef BICUBIC -: 702:#undef BICUBIC_HEAD -: 703:#undef BICUBIC_BODY -: 704: -: 705:static ImagingTransformFilter function getfilter called 126 returned 100% blocks executed 80% 126: 706:getfilter(Imaging im, int filterid) -: 707:{ 126: 708: switch (filterid) { branch 0 taken 21% branch 1 taken 44% branch 2 taken 35% branch 3 taken 0% -: 709: case IMAGING_TRANSFORM_NEAREST: 26: 710: if (im->image8) { branch 0 taken 23% (fallthrough) branch 1 taken 77% 6: 711: switch (im->type) { branch 0 taken 67% branch 1 taken 0% branch 2 taken 33% -: 712: case IMAGING_TYPE_UINT8: -: 713: return nearest_filter8; -: 714: case IMAGING_TYPE_SPECIAL: 4: 715: switch (im->pixelsize) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% -: 716: case 1: -: 717: return nearest_filter8; -: 718: case 2: 4: 719: return nearest_filter16; -: 720: case 4: #####: 721: return nearest_filter32; -: 722: } -: 723: } -: 724: } else { -: 725: return nearest_filter32; -: 726: } -: 727: break; -: 728: case IMAGING_TRANSFORM_BILINEAR: 56: 729: if (im->image8) { branch 0 taken 98% (fallthrough) branch 1 taken 2% -: 730: return bilinear_filter8; 55: 731: } else if (im->image32) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 55: 732: switch (im->type) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% -: 733: case IMAGING_TYPE_UINT8: 55: 734: if (im->bands == 2) { branch 0 taken 98% (fallthrough) branch 1 taken 2% -: 735: return bilinear_filter32LA; -: 736: } else { 54: 737: return bilinear_filter32RGB; -: 738: } -: 739: case IMAGING_TYPE_INT32: -: 740: return bilinear_filter32I; -: 741: case IMAGING_TYPE_FLOAT32: #####: 742: return bilinear_filter32F; -: 743: } -: 744: } -: 745: break; -: 746: case IMAGING_TRANSFORM_BICUBIC: 44: 747: if (im->image8) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 748: return bicubic_filter8; 44: 749: } else if (im->image32) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 44: 750: switch (im->type) { branch 0 taken 100% branch 1 taken 0% branch 2 taken 0% branch 3 taken 0% -: 751: case IMAGING_TYPE_UINT8: 44: 752: if (im->bands == 2) { branch 0 taken 100% (fallthrough) branch 1 taken 0% -: 753: return bicubic_filter32LA; -: 754: } else { 44: 755: return bicubic_filter32RGB; -: 756: } -: 757: case IMAGING_TYPE_INT32: -: 758: return bicubic_filter32I; -: 759: case IMAGING_TYPE_FLOAT32: #####: 760: return bicubic_filter32F; -: 761: } -: 762: } -: 763: break; -: 764: } -: 765: /* no such filter */ #####: 766: return NULL; -: 767:} -: 768: -: 769:/* transformation engines */ -: 770: -: 771:Imaging function ImagingGenericTransform called 126 returned 100% blocks executed 81% 126: 772:ImagingGenericTransform( -: 773: Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, -: 774: ImagingTransformMap transform, void* transform_data, -: 775: int filterid, int fill) -: 776:{ -: 777: /* slow generic transformation. use ImagingTransformAffine or -: 778: ImagingScaleAffine where possible. */ -: 779: -: 780: ImagingSectionCookie cookie; -: 781: int x, y; -: 782: char *out; -: 783: double xx, yy; -: 784: 126: 785: ImagingTransformFilter filter = getfilter(imIn, filterid); call 0 returned 100% 126: 786: if (!filter) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 787: return (Imaging) ImagingError_ValueError("bad filter number"); call 0 never executed -: 788: } -: 789: 126: 790: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 791: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 792: } -: 793: 126: 794: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 795: 126: 796: ImagingSectionEnter(&cookie); call 0 returned 100% -: 797: 126: 798: if (x0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 799: x0 = 0; -: 800: } 126: 801: if (y0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 802: y0 = 0; -: 803: } 126: 804: if (x1 > imOut->xsize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 805: x1 = imOut->xsize; -: 806: } 126: 807: if (y1 > imOut->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 808: y1 = imOut->ysize; -: 809: } -: 810: 13687: 811: for (y = y0; y < y1; y++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 13561: 812: out = imOut->image[y] + x0*imOut->pixelsize; 1975200: 813: for (x = x0; x < x1; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 3923278: 814: if ( ! transform(&xx, &yy, x-x0, y-y0, transform_data) || call 0 returned 100% branch 1 taken 100% (fallthrough) branch 2 taken 0% branch 3 taken 8% (fallthrough) branch 4 taken 92% 1961639: 815: ! filter(out, imIn, xx, yy)) { call 0 returned 100% 152319: 816: if (fill) { branch 0 taken 76% (fallthrough) branch 1 taken 24% 115455: 817: memset(out, 0, imOut->pixelsize); -: 818: } -: 819: } 1961639: 820: out += imOut->pixelsize; -: 821: } -: 822: } -: 823: 126: 824: ImagingSectionLeave(&cookie); call 0 returned 100% -: 825: 126: 826: return imOut; -: 827:} -: 828: -: 829:static Imaging function ImagingScaleAffine called 136 returned 100% blocks executed 87% 136: 830:ImagingScaleAffine(Imaging imOut, Imaging imIn, -: 831: int x0, int y0, int x1, int y1, -: 832: double a[6], int fill) -: 833:{ -: 834: /* scale, nearest neighbour resampling */ -: 835: -: 836: ImagingSectionCookie cookie; -: 837: int x, y; -: 838: int xin; -: 839: double xo, yo; -: 840: int xmin, xmax; -: 841: int *xintab; -: 842: 136: 843: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 844: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 845: } -: 846: 136: 847: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 848: 136: 849: if (x0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 850: x0 = 0; -: 851: } 136: 852: if (y0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 853: y0 = 0; -: 854: } 136: 855: if (x1 > imOut->xsize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 856: x1 = imOut->xsize; -: 857: } 136: 858: if (y1 > imOut->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 859: y1 = imOut->ysize; -: 860: } -: 861: -: 862: /* malloc check ok, uses calloc for overflow */ 136: 863: xintab = (int*) calloc(imOut->xsize, sizeof(int)); 136: 864: if (!xintab) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 865: ImagingDelete(imOut); call 0 never executed #####: 866: return (Imaging) ImagingError_MemoryError(); call 0 never executed -: 867: } -: 868: 136: 869: xo = a[2] + a[0] * 0.5; 136: 870: yo = a[5] + a[4] * 0.5; -: 871: 136: 872: xmin = x1; 136: 873: xmax = x0; -: 874: -: 875: /* Pretabulate horizontal pixel positions */ 25725: 876: for (x = x0; x < x1; x++) { branch 0 taken 99% branch 1 taken 1% (fallthrough) 25589: 877: xin = COORD(xo); branch 0 taken 99% (fallthrough) branch 1 taken 1% 25589: 878: if (xin >= 0 && xin < (int) imIn->xsize) { branch 0 taken 99% (fallthrough) branch 1 taken 1% branch 2 taken 97% (fallthrough) branch 3 taken 3% 24558: 879: xmax = x+1; 24558: 880: if (x < xmin) { branch 0 taken 1% (fallthrough) branch 1 taken 99% 132: 881: xmin = x; -: 882: } 24558: 883: xintab[x] = xin; -: 884: } 25589: 885: xo += a[0]; -: 886: } -: 887: -: 888:#define AFFINE_SCALE(pixel, image)\ -: 889: for (y = y0; y < y1; y++) {\ -: 890: int yi = COORD(yo);\ -: 891: pixel *in, *out;\ -: 892: out = imOut->image[y];\ -: 893: if (fill && x1 > x0) {\ -: 894: memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ -: 895: }\ -: 896: if (yi >= 0 && yi < imIn->ysize) {\ -: 897: in = imIn->image[yi];\ -: 898: for (x = xmin; x < xmax; x++) {\ -: 899: out[x] = in[xintab[x]];\ -: 900: }\ -: 901: }\ -: 902: yo += a[4];\ -: 903: } -: 904: 136: 905: ImagingSectionEnter(&cookie); call 0 returned 100% -: 906: 136: 907: if (imIn->image8) { branch 0 taken 66% (fallthrough) branch 1 taken 34% 39522: 908: AFFINE_SCALE(UINT8, image8); branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 100% (fallthrough) branch 7 taken 0% branch 8 taken 99% branch 9 taken 1% (fallthrough) branch 10 taken 99% branch 11 taken 1% -: 909: } else { 10986: 910: AFFINE_SCALE(INT32, image32); branch 0 taken 94% (fallthrough) branch 1 taken 6% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 94% (fallthrough) branch 5 taken 6% branch 6 taken 86% (fallthrough) branch 7 taken 14% branch 8 taken 99% branch 9 taken 1% (fallthrough) branch 10 taken 98% branch 11 taken 2% (fallthrough) -: 911: } -: 912: 136: 913: ImagingSectionLeave(&cookie); call 0 returned 100% -: 914: -: 915:#undef AFFINE_SCALE -: 916: 136: 917: free(xintab); -: 918: 136: 919: return imOut; -: 920:} -: 921: -: 922:static inline int -: 923:check_fixed(double a[6], int x, int y) -: 924:{ 976: 925: return (fabs(x*a[0] + y*a[1] + a[2]) < 32768.0 && branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% branch 4 taken 100% (fallthrough) branch 5 taken 0% branch 6 taken 0% (fallthrough) branch 7 taken 100% branch 8 taken 100% (fallthrough) branch 9 taken 0% branch 10 taken 0% (fallthrough) branch 11 taken 100% branch 12 taken 100% (fallthrough) branch 13 taken 0% branch 14 taken 0% (fallthrough) branch 15 taken 100% 488: 926: fabs(x*a[3] + y*a[4] + a[5]) < 32768.0); -: 927:} -: 928: -: 929:static inline Imaging function affine_fixed.isra.0 called 122 returned 100% blocks executed 96% 122: 930:affine_fixed(Imaging imOut, Imaging imIn, -: 931: int x0, int y0, int x1, int y1, -: 932: double a[6], int filterid, int fill) -: 933:{ -: 934: /* affine transform, nearest neighbour resampling, fixed point -: 935: arithmetics */ -: 936: -: 937: ImagingSectionCookie cookie; -: 938: int x, y; -: 939: int xin, yin; -: 940: int xsize, ysize; -: 941: int xx, yy; -: 942: int a0, a1, a2, a3, a4, a5; -: 943: 122: 944: ImagingCopyPalette(imOut, imIn); call 0 returned 100% -: 945: 122: 946: xsize = (int) imIn->xsize; 122: 947: ysize = (int) imIn->ysize; -: 948: -: 949:/* use 16.16 fixed point arithmetics */ -: 950:#define FIX(v) FLOOR((v)*65536.0 + 0.5) -: 951: 122: 952: a0 = FIX(a[0]); a1 = FIX(a[1]); branch 0 taken 0% (fallthrough) branch 1 taken 100% branch 2 taken 95% (fallthrough) branch 3 taken 5% 122: 953: a3 = FIX(a[3]); a4 = FIX(a[4]); branch 0 taken 4% (fallthrough) branch 1 taken 96% branch 2 taken 0% (fallthrough) branch 3 taken 100% 122: 954: a2 = FIX(a[2] + a[0] * 0.5 + a[1] * 0.5); branch 0 taken 4% (fallthrough) branch 1 taken 96% 122: 955: a5 = FIX(a[5] + a[3] * 0.5 + a[4] * 0.5); branch 0 taken 22% (fallthrough) branch 1 taken 78% -: 956: -: 957:#undef FIX -: 958: -: 959:#define AFFINE_TRANSFORM_FIXED(pixel, image)\ -: 960: for (y = y0; y < y1; y++) {\ -: 961: pixel *out;\ -: 962: xx = a2;\ -: 963: yy = a5;\ -: 964: out = imOut->image[y];\ -: 965: if (fill && x1 > x0) {\ -: 966: memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ -: 967: }\ -: 968: for (x = x0; x < x1; x++, out++) {\ -: 969: xin = xx >> 16;\ -: 970: if (xin >= 0 && xin < xsize) {\ -: 971: yin = yy >> 16;\ -: 972: if (yin >= 0 && yin < ysize) {\ -: 973: *out = imIn->image[yin][xin];\ -: 974: }\ -: 975: }\ -: 976: xx += a0;\ -: 977: yy += a3;\ -: 978: }\ -: 979: a2 += a1;\ -: 980: a5 += a4;\ -: 981: } -: 982: 122: 983: ImagingSectionEnter(&cookie); call 0 returned 100% -: 984: 122: 985: if (imIn->image8) { branch 0 taken 25% (fallthrough) branch 1 taken 75% 5288026: 986: AFFINE_TRANSFORM_FIXED(UINT8, image8) branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 99% (fallthrough) branch 3 taken 1% branch 4 taken 99% (fallthrough) branch 5 taken 1% branch 6 taken 99% branch 7 taken 1% (fallthrough) branch 8 taken 99% branch 9 taken 1% -: 987: } else { 1070102: 988: AFFINE_TRANSFORM_FIXED(INT32, image32) branch 0 taken 97% (fallthrough) branch 1 taken 3% branch 2 taken 84% (fallthrough) branch 3 taken 16% branch 4 taken 74% (fallthrough) branch 5 taken 26% branch 6 taken 99% branch 7 taken 1% (fallthrough) branch 8 taken 99% branch 9 taken 1% (fallthrough) -: 989: } -: 990: 122: 991: ImagingSectionLeave(&cookie); call 0 returned 100% -: 992: -: 993:#undef AFFINE_TRANSFORM_FIXED -: 994: 122: 995: return imOut; -: 996:} -: 997: -: 998:Imaging function ImagingTransformAffine called 315 returned 100% blocks executed 37% 315: 999:ImagingTransformAffine(Imaging imOut, Imaging imIn, -: 1000: int x0, int y0, int x1, int y1, -: 1001: double a[6], int filterid, int fill) -: 1002:{ -: 1003: /* affine transform, nearest neighbour resampling, floating point -: 1004: arithmetics*/ -: 1005: -: 1006: ImagingSectionCookie cookie; -: 1007: int x, y; -: 1008: int xin, yin; -: 1009: int xsize, ysize; -: 1010: double xx, yy; -: 1011: double xo, yo; -: 1012: 315: 1013: if (filterid || imIn->type == IMAGING_TYPE_SPECIAL) { branch 0 taken 83% (fallthrough) branch 1 taken 17% branch 2 taken 2% (fallthrough) branch 3 taken 98% 57: 1014: return ImagingGenericTransform( call 0 returned 100% -: 1015: imOut, imIn, -: 1016: x0, y0, x1, y1, -: 1017: affine_transform, a, -: 1018: filterid, fill); -: 1019: } -: 1020: 258: 1021: if (a[1] == 0 && a[3] == 0) { branch 0 taken 53% (fallthrough) branch 1 taken 47% branch 2 taken 100% (fallthrough) branch 3 taken 0% -: 1022: /* Scaling */ 136: 1023: return ImagingScaleAffine(imOut, imIn, x0, y0, x1, y1, a, fill); call 0 returned 100% -: 1024: } -: 1025: 122: 1026: if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 0% (fallthrough) branch 3 taken 100% #####: 1027: return (Imaging) ImagingError_ModeError(); call 0 never executed -: 1028: } -: 1029: 122: 1030: if (x0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1031: x0 = 0; -: 1032: } 122: 1033: if (y0 < 0) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1034: y0 = 0; -: 1035: } 122: 1036: if (x1 > imOut->xsize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1037: x1 = imOut->xsize; -: 1038: } 122: 1039: if (y1 > imOut->ysize) { branch 0 taken 0% (fallthrough) branch 1 taken 100% #####: 1040: y1 = imOut->ysize; -: 1041: } -: 1042: -: 1043: /* translate all four corners to check if they are within the -: 1044: range that can be represented by the fixed point arithmetics */ -: 1045: 366: 1046: if (check_fixed(a, 0, 0) && check_fixed(a, x1-x0, y1-y0) && branch 0 taken 100% (fallthrough) branch 1 taken 0% branch 2 taken 100% (fallthrough) branch 3 taken 0% branch 4 taken 100% (fallthrough) branch 5 taken 0% 488: 1047: check_fixed(a, 0, y1-y0) && check_fixed(a, x1-x0, 0)) { branch 0 taken 100% (fallthrough) branch 1 taken 0% 122: 1048: return affine_fixed(imOut, imIn, x0, y0, x1, y1, a, filterid, fill); call 0 returned 100% -: 1049: } -: 1050: -: 1051: /* FIXME: cannot really think of any reasonable case when the -: 1052: following code is used. maybe we should fall back on the slow -: 1053: generic transform engine in this case? */ -: 1054: #####: 1055: ImagingCopyPalette(imOut, imIn); call 0 never executed -: 1056: #####: 1057: xsize = (int) imIn->xsize; #####: 1058: ysize = (int) imIn->ysize; -: 1059: #####: 1060: xo = a[2] + a[1] * 0.5 + a[0] * 0.5; #####: 1061: yo = a[5] + a[4] * 0.5 + a[3] * 0.5; -: 1062: -: 1063:#define AFFINE_TRANSFORM(pixel, image)\ -: 1064: for (y = y0; y < y1; y++) {\ -: 1065: pixel *out;\ -: 1066: xx = xo;\ -: 1067: yy = yo;\ -: 1068: out = imOut->image[y];\ -: 1069: if (fill && x1 > x0) {\ -: 1070: memset(out+x0, 0, (x1-x0)*sizeof(pixel));\ -: 1071: }\ -: 1072: for (x = x0; x < x1; x++, out++) {\ -: 1073: xin = COORD(xx);\ -: 1074: if (xin >= 0 && xin < xsize) {\ -: 1075: yin = COORD(yy);\ -: 1076: if (yin >= 0 && yin < ysize) {\ -: 1077: *out = imIn->image[yin][xin];\ -: 1078: }\ -: 1079: }\ -: 1080: xx += a[0];\ -: 1081: yy += a[3];\ -: 1082: }\ -: 1083: xo += a[1];\ -: 1084: yo += a[4];\ -: 1085: } -: 1086: #####: 1087: ImagingSectionEnter(&cookie); call 0 never executed -: 1088: #####: 1089: if (imIn->image8) { branch 0 never executed branch 1 never executed #####: 1090: AFFINE_TRANSFORM(UINT8, image8) branch 0 never executed branch 1 never executed branch 2 never executed branch 3 never executed branch 4 never executed branch 5 never executed branch 6 never executed branch 7 never executed branch 8 never executed branch 9 never executed branch 10 never executed branch 11 never executed branch 12 never executed branch 13 never executed -: 1091: } else { #####: 1092: AFFINE_TRANSFORM(INT32, image32) branch 0 never executed branch 1 never executed branch 2 never executed