| Index: ui/base/resource/resource_bundle.cc
 | 
| diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc
 | 
| index 0071a5a22e871d41974e06be1cafcac6d8daca82..0f2ce22a8585e7532a3d57afab77cefc47655850 100644
 | 
| --- a/ui/base/resource/resource_bundle.cc
 | 
| +++ b/ui/base/resource/resource_bundle.cc
 | 
| @@ -45,7 +45,7 @@ ResourceBundle* g_shared_instance_ = NULL;
 | 
|  // Returns the actual scale factor of |bitmap| given the image representations
 | 
|  // which have already been added to |image|.
 | 
|  // TODO(pkotwicz): Remove this once we are no longer loading 1x resources
 | 
| -// as part of 2x data packs.
 | 
| +// as part of non 1x data packs.
 | 
|  ui::ScaleFactor GetActualScaleFactor(const gfx::ImageSkia& image,
 | 
|                                       const SkBitmap& bitmap,
 | 
|                                       ui::ScaleFactor data_pack_scale_factor) {
 | 
| @@ -56,24 +56,28 @@ ui::ScaleFactor GetActualScaleFactor(const gfx::ImageSkia& image,
 | 
|        static_cast<float>(bitmap.width()) / image.width());
 | 
|  }
 | 
|  
 | 
| -bool ShouldHighlightMissing2xResources() {
 | 
| +bool ShouldHighlightMissingScaledResources() {
 | 
|    return CommandLine::ForCurrentProcess()->HasSwitch(
 | 
| -      switches::kHighlightMissing2xResources);
 | 
| +      switches::kHighlightMissingScaledResources);
 | 
|  }
 | 
|  
 | 
|  }  // namespace
 | 
|  
 | 
| -// An ImageSkiaSource that loads bitmaps for given scale factor from
 | 
| +// An ImageSkiaSource that loads bitmaps for requested scale factor from
 | 
|  // ResourceBundle on demand for given resource_id. It falls back
 | 
| -// to 100P image if corresponding 200P image doesn't exist.
 | 
| -// If 200P image does not have 2x size of 100P images, it will end up
 | 
| -// with broken UI because it will be drawn as if it has 2x size.
 | 
| -// When --highlight-missing-2x-resources flag is specified, it
 | 
| +// to the 1x bitmap if the bitmap for the requested scale factor does not
 | 
| +// exist. If the resource for the requested scale factor is not exactly
 | 
| +// |scale_factor| * the size of the 1x resource, it will end up with
 | 
| +// broken UI because it will be drawn as if the bitmap was the correct size.
 | 
| +// When --highlight-missing-scaled-resources flag is specified, it
 | 
|  // will show the scaled image blended with red instead.
 | 
|  class ResourceBundle::ResourceBundleImageSource : public gfx::ImageSkiaSource {
 | 
|   public:
 | 
| -  ResourceBundleImageSource(int resource_id, const gfx::Size& size_in_dip)
 | 
| -      : resource_id_(resource_id),
 | 
| +  ResourceBundleImageSource(ResourceBundle* rb,
 | 
| +                            int resource_id,
 | 
| +                            const gfx::Size& size_in_dip)
 | 
| +      : rb_(rb),
 | 
| +        resource_id_(resource_id),
 | 
|          size_in_dip_(size_in_dip) {
 | 
|    }
 | 
|    virtual ~ResourceBundleImageSource() {}
 | 
| @@ -81,59 +85,64 @@ class ResourceBundle::ResourceBundleImageSource : public gfx::ImageSkiaSource {
 | 
|    // gfx::ImageSkiaSource overrides:
 | 
|    virtual gfx::ImageSkiaRep GetImageForScale(
 | 
|        ui::ScaleFactor scale_factor) OVERRIDE {
 | 
| -    ResourceBundle& rb = ResourceBundle::GetSharedInstance();
 | 
| +    scoped_ptr<SkBitmap> result(rb_->LoadBitmap(resource_id_, scale_factor));
 | 
| +    float scale = ui::GetScaleFactorScale(scale_factor);
 | 
| +    gfx::Size size_in_pixel = size_in_dip_.Scale(scale);
 | 
|  
 | 
| -    scoped_ptr<SkBitmap> result(rb.LoadBitmap(resource_id_, scale_factor));
 | 
| -    gfx::Size size_in_pixel =
 | 
| -        size_in_dip_.Scale(ui::GetScaleFactorScale(scale_factor));
 | 
| -
 | 
| -    if (scale_factor == SCALE_FACTOR_200P &&
 | 
| +    if (scale_factor != SCALE_FACTOR_100P &&
 | 
|          (!result.get() ||
 | 
|           result->width() != size_in_pixel.width() ||
 | 
|           result->height() != size_in_pixel.height())) {
 | 
|  
 | 
| -      // If 2x resource is missing from |image| or is the incorrect
 | 
| -      // size and --highlight-missing-2x-resources is specified, logs
 | 
| -      // the resource id and creates a 2x version of the resource.
 | 
| -      // Blends the created resource with red to make it
 | 
| +      // If non 1x resource is missing from |image| or is the incorrect
 | 
| +      // size and --highlight-missing-scaled-resources is specified, logs
 | 
| +      // the resource id and creates a version of the resource at the correct
 | 
| +      // size. Blends the created resource with red to make it
 | 
|        // distinguishable from bitmaps in the resource pak.
 | 
| -      if (ShouldHighlightMissing2xResources()) {
 | 
| -        if (!result.get())
 | 
| -          LOG(ERROR) << "Missing 2x resource. id=" << resource_id_;
 | 
| -        else
 | 
| -          LOG(ERROR) << "Incorrectly sized 2x resource. id=" << resource_id_;
 | 
| -
 | 
| -        SkBitmap bitmap1x = *(rb.LoadBitmap(resource_id_, SCALE_FACTOR_100P));
 | 
| -        SkBitmap bitmap2x = skia::ImageOperations::Resize(
 | 
| -            bitmap1x,
 | 
| +      if (ShouldHighlightMissingScaledResources()) {
 | 
| +        if (!result.get()) {
 | 
| +          LOG(ERROR) << "Missing " << scale << "x resource. id="
 | 
| +                     << resource_id_;
 | 
| +        } else {
 | 
| +          LOG(ERROR) << "Incorrectly sized " << scale << "x resource. id="
 | 
| +                     << resource_id_;
 | 
| +        }
 | 
| +
 | 
| +        scoped_ptr<SkBitmap> bitmap1x(
 | 
| +            rb_->LoadBitmap(resource_id_, SCALE_FACTOR_100P));
 | 
| +        DCHECK(bitmap1x.get());
 | 
| +        SkBitmap bitmap_scaled = skia::ImageOperations::Resize(
 | 
| +            *bitmap1x,
 | 
|              skia::ImageOperations::RESIZE_LANCZOS3,
 | 
| -            bitmap1x.width() * 2, bitmap1x.height() * 2);
 | 
| +            size_in_pixel.width(),
 | 
| +            size_in_pixel.height());
 | 
|  
 | 
|          SkBitmap mask;
 | 
|          mask.setConfig(SkBitmap::kARGB_8888_Config,
 | 
| -                       bitmap2x.width(),
 | 
| -                       bitmap2x.height());
 | 
| +                       bitmap_scaled.width(),
 | 
| +                       bitmap_scaled.height());
 | 
|          mask.allocPixels();
 | 
|          mask.eraseColor(SK_ColorRED);
 | 
|          result.reset(new SkBitmap());
 | 
| -        *result.get() = SkBitmapOperations::CreateBlendedBitmap(bitmap2x, mask,
 | 
| -                                                                0.2);
 | 
| -      } else if (!result.get() ||
 | 
| -                 result->width() == size_in_dip_.width()) {
 | 
| -        // The 2x resource pack may have the 1x image if its grd file
 | 
| +        *result.get() = SkBitmapOperations::CreateBlendedBitmap(
 | 
| +            bitmap_scaled, mask, 0.2);
 | 
| +      } else if (!result.get() || result->width() == size_in_dip_.width()) {
 | 
| +        // The scaled resource pack may have the 1x image if its grd file
 | 
|          // points to 1x image. Fallback to 1x by returning empty image
 | 
|          // in this case. This 1x image will be scaled when drawn.
 | 
|          return gfx::ImageSkiaRep();
 | 
|        }
 | 
| -      // If the size of 2x image isn't exactly 2x of 1x version,
 | 
| +      // If the size of scaled image isn't exactly |scale| * 1x version,
 | 
|        // create ImageSkia as usual. This will end up with
 | 
|        // corrupted visual representation as the size of image doesn't
 | 
|        // match the expected size.
 | 
|      }
 | 
| +    DCHECK(result.get());
 | 
|      return gfx::ImageSkiaRep(*result.get(), scale_factor);
 | 
|    }
 | 
|  
 | 
|   private:
 | 
| +  ResourceBundle* rb_;
 | 
|    const int resource_id_;
 | 
|    const gfx::Size size_in_dip_;
 | 
|  
 | 
| @@ -358,9 +367,12 @@ gfx::Image& ResourceBundle::GetImageNamed(int resource_id) {
 | 
|        return GetEmptyImage();
 | 
|      }
 | 
|  
 | 
| +    // ResourceBundle::GetSharedInstance() is destroyed after the
 | 
| +    // BrowserMainLoop has finished running. |image_skia| is guaranteed to be
 | 
| +    // destroyed before the resource bundle is destroyed.
 | 
|      gfx::Size size_in_dip(bitmap->width(), bitmap->height());
 | 
|      gfx::ImageSkia image_skia(
 | 
| -        new ResourceBundleImageSource(resource_id, size_in_dip),
 | 
| +        new ResourceBundleImageSource(this, resource_id, size_in_dip),
 | 
|          size_in_dip);
 | 
|      image_skia.AddRepresentation(gfx::ImageSkiaRep(*bitmap.get(),
 | 
|                                                     SCALE_FACTOR_100P));
 | 
| 
 |