=== modified file 'modules/field/field.api.php'
--- modules/field/field.api.php	2010-12-02 00:13:47 +0000
+++ modules/field/field.api.php	2010-12-06 07:36:15 +0000
@@ -1288,6 +1288,11 @@ function hook_field_attach_purge($entity
  *   - entity_type: The type of $entity; for example, 'node' or 'user'.
  *   - entity: The entity with fields to render.
  *   - view_mode: View mode, for example, 'full' or 'teaser'.
+ *   - display: Either a view mode string or an array of display settings, see
+ *     $display from field_view_field() for more. When this alter is fired 
+ *     from field_view_field() then the $display argument is simply passed on
+ *     and view_mode is set to '_custom'. When this alter is fired from
+ *     field_attach_view() then display equals view_mode.
  *   - language: The language code used for rendering.
  */
 function hook_field_attach_view_alter(&$output, $context) {

=== modified file 'modules/field/field.attach.inc'
--- modules/field/field.attach.inc	2010-11-20 19:57:01 +0000
+++ modules/field/field.attach.inc	2010-12-06 06:57:40 +0000
@@ -1166,6 +1166,7 @@ function field_attach_view($entity_type,
     'entity_type' => $entity_type,
     'entity' => $entity,
     'view_mode' => $view_mode,
+    'display' => $view_mode,
     'language' => $langcode,
   );
   drupal_alter('field_attach_view', $output, $context);

=== modified file 'modules/field/field.module'
--- modules/field/field.module	2010-12-01 00:31:38 +0000
+++ modules/field/field.module	2010-12-06 06:57:08 +0000
@@ -705,6 +705,7 @@ function field_view_field($entity_type, 
       'entity_type' => $entity_type,
       'entity' => $entity,
       'view_mode' => '_custom',
+      'display' => $display,
     );
     drupal_alter('field_attach_view', $result, $context);
 

=== modified file 'modules/field/tests/field.test'
--- modules/field/tests/field.test	2010-11-30 23:55:11 +0000
+++ modules/field/tests/field.test	2010-12-06 07:24:29 +0000
@@ -1743,12 +1743,14 @@ class FieldDisplayAPITestCase extends Fi
       'type' => 'field_test_multiple',
       'settings' => array(
         'test_formatter_setting_multiple' => $this->randomName(),
+        'alter' => TRUE,
       ),
     );
     $output = field_view_field('test_entity', $this->entity, $this->field_name, $display);
     $this->drupalSetContent(drupal_render($output));
     $setting = $display['settings']['test_formatter_setting_multiple'];
     $this->assertNoText($this->label, t('Label was not displayed.'));
+    $this->assertText('field_test_field_attach_view_alter', t('Alter fired, display passed.'));
     $array = array();
     foreach ($this->values as $delta => $value) {
       $array[] = $delta . ':' . $value['value'];
@@ -1768,6 +1770,7 @@ class FieldDisplayAPITestCase extends Fi
     $this->drupalSetContent($view);
     $setting = $display['settings']['test_formatter_setting_additional'];
     $this->assertNoText($this->label, t('Label was not displayed.'));
+    $this->assertNoText('field_test_field_attach_view_alter', t('Alter not fired.'));
     foreach ($this->values as $delta => $value) {
       $this->assertText($setting . '|' . $value['value'] . '|' . ($value['value'] + 1), t('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
     }

=== modified file 'modules/field/tests/field_test.module'
--- modules/field/tests/field_test.module	2010-11-20 19:57:01 +0000
+++ modules/field/tests/field_test.module	2010-12-06 07:25:11 +0000
@@ -235,3 +235,12 @@ function field_test_dummy_field_storage_
 function field_test_entity_label_callback($entity) {
   return 'label callback ' . $entity->ftlabel;
 }
+
+/**
+ * Implement hook_field_attach_view_alter().
+ */
+function field_test_field_attach_view_alter(&$output, $context) {
+  if (!empty($context['display']['settings']['alter'])) {
+    $output['test_field'][] = array('#markup' => 'field_test_field_attach_view_alter');
+  }
+}

