Index: modules/image/image.field.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/image/image.field.inc,v
retrieving revision 1.22
diff -u -p -r1.22 image.field.inc
--- modules/image/image.field.inc	10 Jul 2010 01:43:06 -0000	1.22
+++ modules/image/image.field.inc	19 Jul 2010 10:36:33 -0000
@@ -428,33 +428,58 @@ function image_field_formatter_info() {
     'image' => array(
       'label' => t('Image'),
       'field types' => array('image'),
-    ),
-    'image_link_content' => array(
-      'label' => t('Image linked to content'),
-      'field types' => array('image'),
-    ),
-    'image_link_file' => array(
-      'label' => t('Image linked to file'),
-      'field types' => array('image'),
+      'settings' => array('image_style' => '', 'image_link' => ''),
     ),
   );
 
-  foreach (image_styles() as $style) {
-    $formatters['image__' . $style['name']] = array(
-      'label' => t('Image "@style"', array('@style' => $style['name'])),
-      'field types' => array('image'),
-    );
-    $formatters['image_link_content__' . $style['name']] = array(
-      'label' => t('Image "@style" linked to content', array('@style' => $style['name'])),
-      'field types' => array('image'),
-    );
-    $formatters['image_link_file__' . $style['name']] = array(
-      'label' => t('Image "@style" linked to file', array('@style' => $style['name'])),
-      'field types' => array('image'),
-    );
+  return $formatters;
+}
+
+/**
+ * Implements hook_field_formatter_settings_form().
+ */
+function image_field_formatter_settings_form($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $form['image_style'] = array(
+    '#title' => t('Image style'),
+    '#type' => 'select',
+    '#default_value' => $settings['image_style'],
+    '#options' => _image_field_formatter_styles(),
+  );
+
+  $form['image_link'] = array(
+    '#title' => t('Image link'),
+    '#type' => 'select',
+    '#default_value' => $settings['image_link'],
+    '#options' => _image_field_formatter_link_types(),
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function image_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $image_styles = _image_field_formatter_styles();
+  // Styles could be lost because of enabled/disabled modules that defines
+  // their styles in code.
+  $image_style = isset($image_styles[$settings['image_style']]) ? $image_styles[$settings['image_style']] : $image_styles[''];
+  $summary[] = t('Style: @style', array('@style' => $image_style));
+
+  $link_types = _image_field_formatter_link_types();
+  // Settings could be changed by contrib so preventing notices.
+  if (isset($link_types[$settings['image_link']]) && $link_types[$settings['image_link']]) {
+    // Display setting only if image really linked.
+    $summary[] = $link_types[$settings['image_link']];
   }
 
-  return $formatters;
+  return implode('<br />', $summary);
 }
 
 /**
@@ -463,17 +488,11 @@ function image_field_formatter_info() {
 function image_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
   $element = array();
 
-  // Check if the formatter involves a particular image style.
-  $matches = array();
-  if (preg_match('/__([a-z0-9_-]+)/', $display['type'], $matches)) {
-    $image_style = $matches[1];
-  }
-
   // Check if the formatter involves a link.
-  if (strpos($display['type'], 'image_link_content') === 0) {
+  if ($display['settings']['image_link'] == 'content') {
     $uri = entity_uri($entity_type, $entity);
   }
-  elseif (strpos($display['type'], 'image_link_file') === 0) {
+  elseif ($display['settings']['image_link'] == 'file') {
     $link_file = TRUE;
   }
 
@@ -487,7 +506,7 @@ function image_field_formatter_view($ent
     $element[$delta] = array(
       '#theme' => 'image_formatter',
       '#item' => $item,
-      '#image_style' => isset($image_style) ? $image_style : '',
+      '#image_style' => $display['settings']['image_style'],
       '#path' => isset($uri) ? $uri : '',
     );
   }
@@ -535,3 +554,25 @@ function theme_image_formatter($variable
 
   return $output;
 }
+
+/**
+ * Returns image styles for formatter settings.
+ */
+function _image_field_formatter_styles() {
+  $image_styles = array('' => t('Original'));
+  foreach (image_styles() as $style) {
+    $image_styles[$style['name']] = $style['name'];
+  }
+  return $image_styles;
+}
+
+/**
+ * Returns link types for formatter settings.
+ */
+function _image_field_formatter_link_types() {
+  return array(
+    '' => t('No link'),
+    'content' => t('Image linked to content'),
+    'file' => t('Image linked to file'),
+  );
+}
Index: modules/image/image.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/image/image.module,v
retrieving revision 1.43
diff -u -p -r1.43 image.module
--- modules/image/image.module	31 May 2010 11:42:11 -0000	1.43
+++ modules/image/image.module	19 Jul 2010 10:36:33 -0000
@@ -365,14 +365,11 @@ function image_image_style_save($style) 
         $instance_changed = FALSE;
         foreach ($instance['display'] as $view_mode => $display) {
           // Check if the formatter involves an image style.
-          $matches = array();
-          if (preg_match('/__([a-z0-9_]+)/', $display['type'], $matches)) {
+          if ($display['type'] == 'image' && $display['settings']['image_style'] == $style['old_name']) {
             // Update display information for any instance using the image
             // style that was just deleted.
-            if ($style['old_name'] == $matches[1]) {
-              $instance['display'][$view_mode]['type'] = str_replace($style['old_name'], $style['name'], $display['type']);
-              $instance_changed = TRUE;
-            }
+            $instance['display'][$view_mode]['settings']['image_style'] = $style['name'];
+            $instance_changed = TRUE;
           }
         }
         if ($instance['widget']['settings']['preview_image_style'] == $style['old_name']) {
Index: modules/image/image.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/image/image.test,v
retrieving revision 1.23
diff -u -p -r1.23 image.test
--- modules/image/image.test	30 Jun 2010 22:37:49 -0000	1.23
+++ modules/image/image.test	19 Jul 2010 10:36:34 -0000
@@ -178,9 +178,9 @@ class ImageStylesPathAndUrlUnitTest exte
 
     // Get the URL of a file that has not been generated yet and try to access
     // it before image_style_url has been called.
-    $generated_uri = $scheme . '://styles/' . $this->style_name . '/' . basename($original_uri);
+    $generated_uri = $scheme . '://styles/' . $this->style_name . '/' . drupal_basename($original_uri);
     $this->assertFalse(file_exists($generated_uri), t('Generated file does not exist.'));
-    $expected_generate_url = url('image/generate/' . $this->style_name . '/' . $scheme . '/' . basename($original_uri), array('absolute' => TRUE));
+    $expected_generate_url = url('image/generate/' . $this->style_name . '/' . $scheme . '/' . drupal_basename($original_uri), array('absolute' => TRUE));
     $this->drupalGet($expected_generate_url);
     $this->assertResponse(403, t('Access to generate URL was denied.'));
 
@@ -592,7 +592,8 @@ class ImageAdminStylesUnitTest extends I
     // Create an image field that uses the new style.
     $field_name = strtolower($this->randomName(10));
     $instance = $this->createImageField($field_name, 'article');
-    $instance['display']['default']['type'] = 'image__' . $style_name;
+    $instance['display']['default']['type'] = 'image';
+    $instance['display']['default']['settings']['image_style'] = $style_name;
     field_update_instance($instance);
 
     // Create a new node with an image attached.
@@ -662,21 +663,23 @@ class ImageFieldDisplayTestCase extends 
 
     // Test the image linked to file formatter.
     $instance = field_info_instance('node', $field_name, 'article');
-    $instance['display']['default']['type'] = 'image_link_file';
+    $instance['display']['default']['type'] = 'image';
+    $instance['display']['default']['settings']['image_link'] = 'file';
     field_update_instance($instance);
     $default_output = l(theme('image', $image_info), file_create_url($image_uri), array('html' => TRUE));
     $this->drupalGet('node/' . $nid);
     $this->assertRaw($default_output, t('Image linked to file formatter displaying correctly on full node view.'));
 
     // Test the image linked to content formatter.
-    $instance['display']['default']['type'] = 'image_link_content';
+    $instance['display']['default']['settings']['image_link'] = 'content';
     field_update_instance($instance);
     $default_output = l(theme('image', $image_info), 'node/' . $nid, array('html' => TRUE, 'attributes' => array('class' => 'active')));
     $this->drupalGet('node/' . $nid);
     $this->assertRaw($default_output, t('Image linked to content formatter displaying correctly on full node view.'));
 
     // Test the image style 'thumbnail' formatter.
-    $instance['display']['default']['type'] = 'image__thumbnail';
+    $instance['display']['default']['settings']['image_link'] = '';
+    $instance['display']['default']['settings']['image_style'] = 'thumbnail';
     field_update_instance($instance);
     // Ensure the derrivative image is generated so we do not have to deal with
     // image style callback paths.
Index: profiles/standard/standard.install
===================================================================
RCS file: /cvs/drupal/drupal/profiles/standard/standard.install,v
retrieving revision 1.18
diff -u -p -r1.18 standard.install
--- profiles/standard/standard.install	8 Jul 2010 03:41:27 -0000	1.18
+++ profiles/standard/standard.install	19 Jul 2010 10:36:34 -0000
@@ -384,12 +384,14 @@ function standard_install() {
     'display' => array(
       'default' => array(
         'label' => 'hidden',
-        'type' => 'image__large',
+        'type' => 'image',
+        'settings' => array('image_style' => 'large', 'image_link' => ''),
         'weight' => -1,
       ),
       'teaser' => array(
         'label' => 'hidden',
-        'type' => 'image_link_content__medium',
+        'type' => 'image',
+        'settings' => array('image_style' => 'medium', 'image_link' => 'content'),
         'weight' => -1,
       ),
     ),
