Chris@16: container->get('image.factory');
Chris@16: // Create a working copy of the file.
Chris@16: $files = $this->drupalGetTestFiles('image');
Chris@16: $file = reset($files);
Chris@18: /** @var \Drupal\Core\File\FileSystemInterface $file_system */
Chris@18: $file_system = \Drupal::service('file_system');
Chris@18: $original_uri = $file_system->copy($file->uri, 'public://', FileSystemInterface::EXISTS_RENAME);
Chris@16:
Chris@16: // Create a style.
Chris@16: /** @var $style \Drupal\image\ImageStyleInterface */
Chris@16: $style = ImageStyle::create(['name' => 'test', 'label' => 'Test']);
Chris@16: $style->save();
Chris@18: $generated_uri = 'public://styles/test/public/' . $file_system->basename($original_uri);
Chris@16: $url = file_url_transform_relative($style->buildUrl($original_uri));
Chris@16:
Chris@16: $variables = [
Chris@16: '#theme' => 'image_style',
Chris@16: '#style_name' => 'test',
Chris@16: '#uri' => $original_uri,
Chris@16: '#width' => 40,
Chris@16: '#height' => 20,
Chris@16: ];
Chris@16: // Verify that the original image matches the hard-coded values.
Chris@16: $image_file = $image_factory->get($original_uri);
Chris@16: $this->assertEqual($image_file->getWidth(), $variables['#width']);
Chris@16: $this->assertEqual($image_file->getHeight(), $variables['#height']);
Chris@16:
Chris@16: // Scale an image that is wider than it is high.
Chris@16: $effect = [
Chris@16: 'id' => 'image_scale',
Chris@16: 'data' => [
Chris@16: 'width' => 120,
Chris@16: 'height' => 90,
Chris@16: 'upscale' => TRUE,
Chris@16: ],
Chris@16: 'weight' => 0,
Chris@16: ];
Chris@16:
Chris@16: $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16: $image_file = $image_factory->get($generated_uri);
Chris@16: $this->assertEqual($image_file->getWidth(), 120);
Chris@16: $this->assertEqual($image_file->getHeight(), 60);
Chris@16:
Chris@16: // Rotate 90 degrees anticlockwise.
Chris@16: $effect = [
Chris@16: 'id' => 'image_rotate',
Chris@16: 'data' => [
Chris@16: 'degrees' => -90,
Chris@16: 'random' => FALSE,
Chris@16: ],
Chris@16: 'weight' => 1,
Chris@16: ];
Chris@16:
Chris@16: $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16: $image_file = $image_factory->get($generated_uri);
Chris@16: $this->assertEqual($image_file->getWidth(), 60);
Chris@16: $this->assertEqual($image_file->getHeight(), 120);
Chris@16:
Chris@16: // Scale an image that is higher than it is wide (rotated by previous effect).
Chris@16: $effect = [
Chris@16: 'id' => 'image_scale',
Chris@16: 'data' => [
Chris@16: 'width' => 120,
Chris@16: 'height' => 90,
Chris@16: 'upscale' => TRUE,
Chris@16: ],
Chris@16: 'weight' => 2,
Chris@16: ];
Chris@16:
Chris@16: $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16: $image_file = $image_factory->get($generated_uri);
Chris@16: $this->assertEqual($image_file->getWidth(), 45);
Chris@16: $this->assertEqual($image_file->getHeight(), 90);
Chris@16:
Chris@16: // Test upscale disabled.
Chris@16: $effect = [
Chris@16: 'id' => 'image_scale',
Chris@16: 'data' => [
Chris@16: 'width' => 400,
Chris@16: 'height' => 200,
Chris@16: 'upscale' => FALSE,
Chris@16: ],
Chris@16: 'weight' => 3,
Chris@16: ];
Chris@16:
Chris@16: $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16: $image_file = $image_factory->get($generated_uri);
Chris@16: $this->assertEqual($image_file->getWidth(), 45);
Chris@16: $this->assertEqual($image_file->getHeight(), 90);
Chris@16:
Chris@16: // Add a desaturate effect.
Chris@16: $effect = [
Chris@16: 'id' => 'image_desaturate',
Chris@16: 'data' => [],
Chris@16: 'weight' => 4,
Chris@16: ];
Chris@16:
Chris@16: $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16: $image_file = $image_factory->get($generated_uri);
Chris@16: $this->assertEqual($image_file->getWidth(), 45);
Chris@16: $this->assertEqual($image_file->getHeight(), 90);
Chris@16:
Chris@16: // Add a random rotate effect.
Chris@16: $effect = [
Chris@16: 'id' => 'image_rotate',
Chris@16: 'data' => [
Chris@16: 'degrees' => 180,
Chris@16: 'random' => TRUE,
Chris@16: ],
Chris@16: 'weight' => 5,
Chris@16: ];
Chris@16:
Chris@16: $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16:
Chris@16: // Add a crop effect.
Chris@16: $effect = [
Chris@16: 'id' => 'image_crop',
Chris@16: 'data' => [
Chris@16: 'width' => 30,
Chris@16: 'height' => 30,
Chris@16: 'anchor' => 'center-center',
Chris@16: ],
Chris@16: 'weight' => 6,
Chris@16: ];
Chris@16:
Chris@16: $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16: $image_file = $image_factory->get($generated_uri);
Chris@16: $this->assertEqual($image_file->getWidth(), 30);
Chris@16: $this->assertEqual($image_file->getHeight(), 30);
Chris@16:
Chris@16: // Rotate to a non-multiple of 90 degrees.
Chris@16: $effect = [
Chris@16: 'id' => 'image_rotate',
Chris@16: 'data' => [
Chris@16: 'degrees' => 57,
Chris@16: 'random' => FALSE,
Chris@16: ],
Chris@16: 'weight' => 7,
Chris@16: ];
Chris@16:
Chris@16: $effect_id = $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: // @todo Uncomment this once
Chris@16: // https://www.drupal.org/project/drupal/issues/2670966 is resolved.
Chris@16: // $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16: $image_file = $image_factory->get($generated_uri);
Chris@16: // @todo Uncomment this once
Chris@16: // https://www.drupal.org/project/drupal/issues/2670966 is resolved.
Chris@16: // $this->assertEqual($image_file->getWidth(), 41);
Chris@16: // $this->assertEqual($image_file->getHeight(), 41);
Chris@16:
Chris@16: $effect_plugin = $style->getEffect($effect_id);
Chris@16: $style->deleteImageEffect($effect_plugin);
Chris@16:
Chris@16: // Ensure that an effect can unset dimensions.
Chris@16: $effect = [
Chris@16: 'id' => 'image_module_test_null',
Chris@16: 'data' => [],
Chris@16: 'weight' => 8,
Chris@16: ];
Chris@16:
Chris@16: $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16:
Chris@16: // Test URI dependent image effect.
Chris@16: $style = ImageStyle::create(['name' => 'test_uri', 'label' => 'Test URI']);
Chris@16: $effect = [
Chris@16: 'id' => 'image_module_test_uri_dependent',
Chris@16: 'data' => [],
Chris@16: 'weight' => 0,
Chris@16: ];
Chris@16: $style->addImageEffect($effect);
Chris@16: $style->save();
Chris@16: $variables = [
Chris@16: '#theme' => 'image_style',
Chris@16: '#style_name' => 'test_uri',
Chris@16: '#uri' => $original_uri,
Chris@16: '#width' => 40,
Chris@16: '#height' => 20,
Chris@16: ];
Chris@16: // PNG original image. Should be resized to 100x100.
Chris@18: $generated_uri = 'public://styles/test_uri/public/' . $file_system->basename($original_uri);
Chris@16: $url = file_url_transform_relative($style->buildUrl($original_uri));
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16: $image_file = $image_factory->get($generated_uri);
Chris@16: $this->assertEqual($image_file->getWidth(), 100);
Chris@16: $this->assertEqual($image_file->getHeight(), 100);
Chris@16: // GIF original image. Should be resized to 50x50.
Chris@16: $file = $files[1];
Chris@18: $original_uri = $file_system->copy($file->uri, 'public://', FileSystemInterface::EXISTS_RENAME);
Chris@18: $generated_uri = 'public://styles/test_uri/public/' . $file_system->basename($original_uri);
Chris@16: $url = file_url_transform_relative($style->buildUrl($original_uri));
Chris@16: $variables['#uri'] = $original_uri;
Chris@16: $this->assertEqual($this->getImageTag($variables), '
');
Chris@16: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
Chris@16: $this->drupalGet($this->getAbsoluteUrl($url));
Chris@16: $this->assertResponse(200, 'Image was generated at the URL.');
Chris@16: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
Chris@16: $image_file = $image_factory->get($generated_uri);
Chris@16: $this->assertEqual($image_file->getWidth(), 50);
Chris@16: $this->assertEqual($image_file->getHeight(), 50);
Chris@16: }
Chris@16:
Chris@16: /**
Chris@16: * Render an image style element.
Chris@16: *
Chris@17: * Function drupal_render() alters the passed $variables array by adding a new
Chris@17: * key '#printed' => TRUE. This prevents next call to re-render the element.
Chris@17: * We wrap drupal_render() in a helper protected method and pass each time a
Chris@16: * fresh array so that $variables won't get altered and the element is
Chris@16: * re-rendered each time.
Chris@16: */
Chris@16: protected function getImageTag($variables) {
Chris@16: return str_replace("\n", NULL, \Drupal::service('renderer')->renderRoot($variables));
Chris@16: }
Chris@16:
Chris@16: }