Index: modules/field/tests/field_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/tests/field_test.module,v
retrieving revision 1.13
diff -u -r1.13 field_test.module
--- modules/field/tests/field_test.module	20 Nov 2010 19:57:01 -0000	1.13
+++ modules/field/tests/field_test.module	6 Dec 2010 18:45:47 -0000
@@ -235,3 +235,12 @@
 function field_test_entity_label_callback($entity) {
   return 'label callback ' . $entity->ftlabel;
 }
+
+/**
+ * Implements 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');
+  }
+}
Index: modules/field/tests/field.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/tests/field.test,v
retrieving revision 1.44
diff -u -r1.44 field.test
--- modules/field/tests/field.test	30 Nov 2010 23:55:11 -0000	1.44
+++ modules/field/tests/field.test	6 Dec 2010 18:45:47 -0000
@@ -1743,12 +1743,14 @@
       '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 @@
     $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)));
     }
Index: modules/field/field.attach.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.attach.inc,v
retrieving revision 1.97
diff -u -r1.97 field.attach.inc
--- modules/field/field.attach.inc	20 Nov 2010 19:57:01 -0000	1.97
+++ modules/field/field.attach.inc	6 Dec 2010 18:45:46 -0000
@@ -1166,6 +1166,7 @@
     'entity_type' => $entity_type,
     'entity' => $entity,
     'view_mode' => $view_mode,
+    'display' => $view_mode,
     'language' => $langcode,
   );
   drupal_alter('field_attach_view', $output, $context);
Index: modules/field/field.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.module,v
retrieving revision 1.91
diff -u -r1.91 field.module
--- modules/field/field.module	1 Dec 2010 00:31:38 -0000	1.91
+++ modules/field/field.module	6 Dec 2010 18:45:46 -0000
@@ -705,6 +705,7 @@
       'entity_type' => $entity_type,
       'entity' => $entity,
       'view_mode' => '_custom',
+      'display' => $display,
     );
     drupal_alter('field_attach_view', $result, $context);
 
Index: modules/field/field.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.api.php,v
retrieving revision 1.99
diff -u -r1.99 field.api.php
--- modules/field/field.api.php	2 Dec 2010 00:13:47 -0000	1.99
+++ modules/field/field.api.php	6 Dec 2010 18:45:46 -0000
@@ -1277,7 +1277,7 @@
 }
 
 /**
- * Perform alterations on field_attach_view().
+ * Perform alterations on field_attach_view() or field_view_field().
  *
  * This hook is invoked after the field module has performed the operation.
  *
@@ -1287,7 +1287,13 @@
  *   An associative array containing:
  *   - 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'.
+ *   - view_mode: View mode; for example, 'full' or 'teaser'.
+ *   - display: Either a view mode string or an array of display settings. If
+ *     this hook is being invoked from field_attach_view(), the 'display'
+ *     element is set to the view mode string. If this hook is being invoked
+ *     from field_view_field(), this element is set to the $display argument
+ *     and the view_mode element is set to '_custom'. See field_view_field()
+ *     for more information on what its $display argument contains.
  *   - language: The language code used for rendering.
  */
 function hook_field_attach_view_alter(&$output, $context) {
