SPVM-Resource-Libpng

 view release on metacpan or  search on metacpan

lib/SPVM/Resource/Libpng.native/src/pngwrite.c  view on Meta::CPAN

{
   png_debug(1, "in png_write_info_before_PLTE");

   if (png_ptr == NULL || info_ptr == NULL)
      return;

   if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
   {
      /* Write PNG signature */
      png_write_sig(png_ptr);

#ifdef PNG_MNG_FEATURES_SUPPORTED
      if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \
          png_ptr->mng_features_permitted != 0)
      {
         png_warning(png_ptr,
             "MNG features are not allowed in a PNG datastream");
         png_ptr->mng_features_permitted = 0;
      }
#endif

      /* Write IHDR information. */
      png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
          info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
          info_ptr->filter_type,
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
          info_ptr->interlace_type
#else
          0
#endif
         );

      /* The rest of these check to see if the valid field has the appropriate
       * flag set, and if it does, writes the chunk.
       *
       * 1.6.0: COLORSPACE support controls the writing of these chunks too, and
       * the chunks will be written if the WRITE routine is there and
       * information * is available in the COLORSPACE. (See
       * png_colorspace_sync_info in png.c for where the valid flags get set.)
       *
       * Under certain circumstances the colorspace can be invalidated without
       * syncing the info_struct 'valid' flags; this happens if libpng detects
       * an error and calls png_error while the color space is being set, yet
       * the application continues writing the PNG.  So check the 'invalid'
       * flag here too.
       */
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
         /* Write unknown chunks first; PNG v3 establishes a precedence order
          * for colourspace chunks.  It is certain therefore that new
          * colourspace chunks will have a precedence and very likely it will be
          * higher than all known so far.  Writing the unknown chunks here is
          * most likely to present the chunks in the most convenient order.
          *
          * FUTURE: maybe write chunks in the order the app calls png_set_chnk
          * to give the app control.
          */
         write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR);
#endif

#ifdef PNG_WRITE_sBIT_SUPPORTED
         /* PNG v3: a streaming app will need to see this before cICP because
          * the information is helpful in handling HLG encoding (which is
          * natively 10 bits but gets expanded to 16 in PNG.)
          *
          * The app shouldn't care about the order ideally, but it might have
          * no choice.  In PNG v3, apps are allowed to reject PNGs where the
          * APNG chunks are out of order so it behooves libpng to be nice here.
          */
         if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
            png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);
#endif

   /* PNG v3: the July 2004 version of the TR introduced the concept of colour
    * space priority.  As above it therefore behooves libpng to write the colour
    * space chunks in the priority order so that a streaming app need not buffer
    * them.
    */
#ifdef PNG_COLORSPACE_SUPPORTED
#  ifdef PNG_WRITE_cICP_SUPPORTED /* Priority 4 */
   if ((info_ptr->valid & PNG_INFO_cICP) != 0)
      {
         png_write_cICP(png_ptr,
                        info_ptr->cicp_colour_primaries,
                        info_ptr->cicp_transfer_function,
                        info_ptr->cicp_matrix_coefficients,
                        info_ptr->cicp_video_full_range_flag);
      }
#  endif

      /* PNG v3 change: it is now permitted to write both sRGB and ICC profiles,
       * however because the libpng code auto-generates an sRGB for the
       * corresponding ICC profiles and because PNG v2 disallowed this we need
       * to only write one.
       *
       * Remove the PNG v2 warning about writing an sRGB ICC profile as well
       * because it's invalid with PNG v3.
       */
#  ifdef PNG_WRITE_iCCP_SUPPORTED /* Priority 3 */
         if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
             (info_ptr->valid & PNG_INFO_iCCP) != 0)
         {
            png_write_iCCP(png_ptr, info_ptr->iccp_name,
                info_ptr->iccp_profile);
         }
#     ifdef PNG_WRITE_sRGB_SUPPORTED
         else
#     endif
#  endif

#  ifdef PNG_WRITE_sRGB_SUPPORTED /* Priority 2 */
         if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
             (info_ptr->valid & PNG_INFO_sRGB) != 0)
            png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent);
#  endif /* WRITE_sRGB */
#endif /* COLORSPACE */

#ifdef PNG_GAMMA_SUPPORTED
#  ifdef PNG_WRITE_gAMA_SUPPORTED /* Priority 1 */
      if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
          (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_gAMA) != 0 &&
          (info_ptr->valid & PNG_INFO_gAMA) != 0)
         png_write_gAMA_fixed(png_ptr, info_ptr->colorspace.gamma);
#  endif
#endif

#ifdef PNG_COLORSPACE_SUPPORTED
#  ifdef PNG_WRITE_cHRM_SUPPORTED /* Also priority 1 */
         if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
             (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 &&
             (info_ptr->valid & PNG_INFO_cHRM) != 0)
            png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy);
#  endif
#endif

      png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;



( run in 0.644 second using v1.01-cache-2.11-cpan-97f6503c9c8 )