From 530963be10af5a93d0ab178e8d8e1249b88d2ef4 Mon Sep 17 00:00:00 2001
From: James Nettik <james.nettik@gmail.com>
Date: Thu, 27 Aug 2015 09:44:26 -0600
Subject: [PATCH] Created setting for output control of Image w/ sizes
 formatter. Changed formatter theme function call depending on new setting.

---
 picture.admin.inc | 12 ++++++++++++
 picture.module    | 47 +++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/picture.admin.inc b/picture.admin.inc
index 278b7ce..615929b 100644
--- a/picture.admin.inc
+++ b/picture.admin.inc
@@ -305,6 +305,17 @@ function picture_admin_settings() {
     '#default_value' => variable_get('picture_fallback_method', 'srcset'),
   );
 
+  $form['picture_img_sizes_output_method'] = array(
+    '#title' => t('"Image with sizes" output method'),
+    '#description' => t('"srcset on Image tag" creates the correct markup, however "picture element" will prevent duplicate downloads.'),
+    '#type' => 'radios',
+    '#options' => array(
+      'img_srcset' => t('srcset on Image tag'),
+      'picture_element' => t('Picture element'),
+    ),
+    '#default_value' => variable_get('picture_img_sizes_output_method', 'picture_element'),
+  );
+
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => 'Save',
@@ -361,6 +372,7 @@ function picture_admin_settings_submit($form, &$form_state) {
   variable_set('picture_js_scope', $form_state['values']['picture_js_scope']);
   variable_set('picture_polyfill_version', $form_state['values']['picture_polyfill_version']);
   variable_set('picture_fallback_method', $form_state['values']['picture_fallback_method']);
+  variable_set('picture_img_sizes_output_method', $form_state['values']['picture_img_sizes_output_method']);
   drupal_set_message(t('Your settings have been saved'));
 }
 
diff --git a/picture.module b/picture.module
index 06d1749..d763a34 100644
--- a/picture.module
+++ b/picture.module
@@ -1190,15 +1190,46 @@ function theme_picture_formatter($variables) {
  * Theme pictue sizes formatter.
  */
 function theme_picture_sizes_formatter($variables) {
+  $output_method = variable_get('picture_img_sizes_output_method', 'picture_element');
   $variables['image_style'] = $variables['fallback_image_style'];
-  $variables['breakpoints'][BREAKPOINTS_SOURCE_TYPE_MODULE . '.picture.empty_srcset']['1x'] = array(
-    'mapping_type' => 'sizes',
-    'sizes' => $variables['sizes'],
-    'sizes_image_styles' => $variables['image_styles'],
-    'lazyload' => !empty($variables['lazyload']),
-    'lazyload_aspect_ratio' => !empty($variables['lazyload_aspect_ratio']),
-  );
-  return theme('picture_formatter', $variables);
+
+  if ($output_method == 'picture_element') {
+    $variables['breakpoints'][BREAKPOINTS_SOURCE_TYPE_MODULE . '.picture.empty_srcset']['1x'] = array(
+      'mapping_type' => 'sizes',
+      'sizes' => $variables['sizes'],
+      'sizes_image_styles' => $variables['image_styles'],
+      'lazyload' => !empty($variables['lazyload']),
+      'lazyload_aspect_ratio' => !empty($variables['lazyload_aspect_ratio']),
+    );
+    return theme('picture_formatter', $variables);
+  }
+
+  if ($output_method == 'img_srcset') {
+    $image = $variables['item'];
+
+    // Map image attributes
+    $variables['uri'] = image_style_path($variables['fallback_image_style'], $image['uri']);
+
+    if (!empty($image['alt'])) {
+      $variables['alt'] = $image['alt'];
+    }
+    if (!empty($image['title'])) {
+      $variables['title'] = $image['title'];
+    }
+
+    // Set up image source options
+    $variables['srcset'] = array();
+    foreach($variables['image_styles'] as $image_style) {
+      $image_style_uri = image_style_path($image_style, $image['uri']);
+      $image_style_info = image_get_info($image_style_uri);
+
+      $variables['srcset'][] = array(
+        'uri' => $image_style_uri,
+        'width' => $image_style_info['width'] . 'w',
+      );
+    }
+    return theme('image_srcset', $variables);
+  }
 }
 
 /**
-- 
2.3.0

