| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/base/resource/resource_bundle.h" | 5 #include "ui/base/resource/resource_bundle.h" |
| 6 | 6 |
| 7 #import <QuartzCore/QuartzCore.h> | 7 #import <QuartzCore/QuartzCore.h> |
| 8 #import <UIKit/UIKit.h> | 8 #import <UIKit/UIKit.h> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 CGFloat target_scale = ui::GetScaleFactorScale(scale_factor); | 128 CGFloat target_scale = ui::GetScaleFactorScale(scale_factor); |
| 129 CGFloat source_scale = is_fallback ? 1.0 : target_scale; | 129 CGFloat source_scale = is_fallback ? 1.0 : target_scale; |
| 130 scoped_nsobject<UIImage> ui_image( | 130 scoped_nsobject<UIImage> ui_image( |
| 131 [[UIImage alloc] initWithData:ns_data scale:source_scale]); | 131 [[UIImage alloc] initWithData:ns_data scale:source_scale]); |
| 132 | 132 |
| 133 // If the image is a 1x fallback, scale it up to a full-size representation. | 133 // If the image is a 1x fallback, scale it up to a full-size representation. |
| 134 if (is_fallback) { | 134 if (is_fallback) { |
| 135 CGSize source_size = [ui_image size]; | 135 CGSize source_size = [ui_image size]; |
| 136 CGSize target_size = CGSizeMake(source_size.width * target_scale, | 136 CGSize target_size = CGSizeMake(source_size.width * target_scale, |
| 137 source_size.height * target_scale); | 137 source_size.height * target_scale); |
| 138 base::mac::ScopedCFTypeRef<CGColorSpaceRef> color_space( | 138 base::ScopedCFTypeRef<CGColorSpaceRef> color_space( |
| 139 CGColorSpaceCreateDeviceRGB()); | 139 CGColorSpaceCreateDeviceRGB()); |
| 140 base::mac::ScopedCFTypeRef<CGContextRef> context( | 140 base::ScopedCFTypeRef<CGContextRef> context(CGBitmapContextCreate( |
| 141 CGBitmapContextCreate( | 141 NULL, |
| 142 NULL, | 142 target_size.width, |
| 143 target_size.width, target_size.height, | 143 target_size.height, |
| 144 8, target_size.width * 4, | 144 8, |
| 145 color_space, | 145 target_size.width * 4, |
| 146 kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host)); | 146 color_space, |
| 147 kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host)); |
| 147 | 148 |
| 148 CGRect target_rect = CGRectMake(0, 0, | 149 CGRect target_rect = CGRectMake(0, 0, |
| 149 target_size.width, target_size.height); | 150 target_size.width, target_size.height); |
| 150 CGContextSetBlendMode(context, kCGBlendModeCopy); | 151 CGContextSetBlendMode(context, kCGBlendModeCopy); |
| 151 CGContextDrawImage(context, target_rect, [ui_image CGImage]); | 152 CGContextDrawImage(context, target_rect, [ui_image CGImage]); |
| 152 | 153 |
| 153 if (ShouldHighlightMissingScaledResources()) { | 154 if (ShouldHighlightMissingScaledResources()) { |
| 154 CGContextSetFillColorSpace(context, color_space); | 155 CGContextSetFillColorSpace(context, color_space); |
| 155 CGFloat components[4] = { 1.0, 0.0, 0.0, 0.3 }; // Translucent red. | 156 CGFloat components[4] = { 1.0, 0.0, 0.0, 0.3 }; // Translucent red. |
| 156 CGContextSetFillColor(context, components); | 157 CGContextSetFillColor(context, components); |
| 157 CGContextSetBlendMode(context, kCGBlendModeNormal); | 158 CGContextSetBlendMode(context, kCGBlendModeNormal); |
| 158 CGContextFillRect(context, target_rect); | 159 CGContextFillRect(context, target_rect); |
| 159 } | 160 } |
| 160 | 161 |
| 161 base::mac::ScopedCFTypeRef<CGImageRef> cg_image( | 162 base::ScopedCFTypeRef<CGImageRef> cg_image( |
| 162 CGBitmapContextCreateImage(context)); | 163 CGBitmapContextCreateImage(context)); |
| 163 ui_image.reset([[UIImage alloc] initWithCGImage:cg_image | 164 ui_image.reset([[UIImage alloc] initWithCGImage:cg_image |
| 164 scale:target_scale | 165 scale:target_scale |
| 165 orientation:UIImageOrientationUp]); | 166 orientation:UIImageOrientationUp]); |
| 166 } | 167 } |
| 167 | 168 |
| 168 if (!ui_image.get()) { | 169 if (!ui_image.get()) { |
| 169 LOG(WARNING) << "Unable to load image with id " << resource_id; | 170 LOG(WARNING) << "Unable to load image with id " << resource_id; |
| 170 NOTREACHED(); // Want to assert in debug mode. | 171 NOTREACHED(); // Want to assert in debug mode. |
| 171 return GetEmptyImage(); | 172 return GetEmptyImage(); |
| 172 } | 173 } |
| 173 | 174 |
| 174 // The gfx::Image takes ownership. | 175 // The gfx::Image takes ownership. |
| 175 image = gfx::Image(ui_image.release()); | 176 image = gfx::Image(ui_image.release()); |
| 176 } | 177 } |
| 177 | 178 |
| 178 base::AutoLock lock(*images_and_fonts_lock_); | 179 base::AutoLock lock(*images_and_fonts_lock_); |
| 179 | 180 |
| 180 // Another thread raced the load and has already cached the image. | 181 // Another thread raced the load and has already cached the image. |
| 181 if (images_.count(resource_id)) | 182 if (images_.count(resource_id)) |
| 182 return images_[resource_id]; | 183 return images_[resource_id]; |
| 183 | 184 |
| 184 images_[resource_id] = image; | 185 images_[resource_id] = image; |
| 185 return images_[resource_id]; | 186 return images_[resource_id]; |
| 186 } | 187 } |
| 187 | 188 |
| 188 } // namespace ui | 189 } // namespace ui |
| OLD | NEW |