Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: chrome/browser/ui/views/tabs/tab.cc

Issue 1414203012: Combine active and inactive tab background drawing functions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@combine_radial_gradients
Patch Set: Compile fix for realz Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/ui/views/tabs/tab.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 "chrome/browser/ui/views/tabs/tab.h" 5 #include "chrome/browser/ui/views/tabs/tab.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/alias.h" 10 #include "base/debug/alias.h"
(...skipping 1111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1122 // The second part parts the remaining |eye_width| on the left. 1122 // The second part parts the remaining |eye_width| on the left.
1123 int left_eye_width = eye_offset + eye_width - bar_rect.width(); 1123 int left_eye_width = eye_offset + eye_width - bar_rect.width();
1124 gfx::Rect left_eye_rect( 1124 gfx::Rect left_eye_rect(
1125 bar_rect.x(), 0, left_eye_width, kImmersiveBarHeight); 1125 bar_rect.x(), 0, left_eye_width, kImmersiveBarHeight);
1126 canvas->FillRect(left_eye_rect, kEyeColor); 1126 canvas->FillRect(left_eye_rect, kEyeColor);
1127 } 1127 }
1128 } 1128 }
1129 } 1129 }
1130 1130
1131 void Tab::PaintTabBackground(gfx::Canvas* canvas) { 1131 void Tab::PaintTabBackground(gfx::Canvas* canvas) {
1132 const int kActiveTabFillId = IDR_THEME_TOOLBAR;
1133 const bool has_custom_image =
1134 GetThemeProvider()->HasCustomImage(kActiveTabFillId);
1132 if (IsActive()) { 1135 if (IsActive()) {
1133 PaintActiveTabBackground(canvas); 1136 PaintTabBackgroundUsingFillId(canvas, true, kActiveTabFillId,
1137 has_custom_image, 0);
1134 } else { 1138 } else {
1135 if (pinned_title_change_animation_ && 1139 if (pinned_title_change_animation_ &&
1136 pinned_title_change_animation_->is_animating()) 1140 pinned_title_change_animation_->is_animating())
1137 PaintInactiveTabBackgroundWithTitleChange(canvas); 1141 PaintInactiveTabBackgroundWithTitleChange(canvas);
1138 else 1142 else
1139 PaintInactiveTabBackground(canvas); 1143 PaintInactiveTabBackground(canvas);
1140 1144
1141 const double throb_value = GetThrobValue(); 1145 const double throb_value = GetThrobValue();
1142 if (throb_value > 0) { 1146 if (throb_value > 0) {
1143 canvas->SaveLayerAlpha(gfx::ToRoundedInt(throb_value * 0xff), 1147 canvas->SaveLayerAlpha(gfx::ToRoundedInt(throb_value * 0xff),
1144 GetLocalBounds()); 1148 GetLocalBounds());
1145 PaintActiveTabBackground(canvas); 1149 PaintTabBackgroundUsingFillId(canvas, true, kActiveTabFillId,
1150 has_custom_image, 0);
1146 canvas->Restore(); 1151 canvas->Restore();
1147 } 1152 }
1148 } 1153 }
1149 } 1154 }
1150 1155
1151 void Tab::PaintInactiveTabBackgroundWithTitleChange(gfx::Canvas* canvas) { 1156 void Tab::PaintInactiveTabBackgroundWithTitleChange(gfx::Canvas* canvas) {
1152 const int kPinnedTitleChangeGradientRadius = 20; 1157 const int kPinnedTitleChangeGradientRadius = 20;
1153 const float radius = kPinnedTitleChangeGradientRadius; 1158 const float radius = kPinnedTitleChangeGradientRadius;
1154 double x = radius; 1159 double x = radius;
1155 int alpha = 255; 1160 int alpha = 255;
(...skipping 11 matching lines...) Expand all
1167 gfx::ImageSkia background_image(background_canvas.ExtractImageRep()); 1172 gfx::ImageSkia background_image(background_canvas.ExtractImageRep());
1168 canvas->DrawImageInt(background_image, 0, 0); 1173 canvas->DrawImageInt(background_image, 0, 0);
1169 gfx::Canvas hover_canvas(size(), canvas->image_scale(), false); 1174 gfx::Canvas hover_canvas(size(), canvas->image_scale(), false);
1170 DrawHighlight(&hover_canvas, p, SkFloatToScalar(radius), alpha); 1175 DrawHighlight(&hover_canvas, p, SkFloatToScalar(radius), alpha);
1171 gfx::ImageSkia hover_image = gfx::ImageSkiaOperations::CreateMaskedImage( 1176 gfx::ImageSkia hover_image = gfx::ImageSkiaOperations::CreateMaskedImage(
1172 gfx::ImageSkia(hover_canvas.ExtractImageRep()), background_image); 1177 gfx::ImageSkia(hover_canvas.ExtractImageRep()), background_image);
1173 canvas->DrawImageInt(hover_image, 0, 0); 1178 canvas->DrawImageInt(hover_image, 0, 0);
1174 } 1179 }
1175 1180
1176 void Tab::PaintInactiveTabBackground(gfx::Canvas* canvas) { 1181 void Tab::PaintInactiveTabBackground(gfx::Canvas* canvas) {
1177 int tab_id, frame_id; 1182 int fill_id, frame_id;
1178 GetTabIdAndFrameId(GetWidget(), &tab_id, &frame_id); 1183 GetTabIdAndFrameId(GetWidget(), &fill_id, &frame_id);
1179 // HasCustomImage() is only true if the theme provides the image. However, 1184 // HasCustomImage() is only true if the theme provides the image. However,
1180 // even if the theme does not provide a tab background, the theme machinery 1185 // even if the theme does not provide a tab background, the theme machinery
1181 // will make one if given a frame image. 1186 // will make one if given a frame image.
1182 ui::ThemeProvider* theme_provider = GetThemeProvider(); 1187 ui::ThemeProvider* theme_provider = GetThemeProvider();
1183 const bool has_custom_image = theme_provider->HasCustomImage(tab_id) || 1188 const bool has_custom_image = theme_provider->HasCustomImage(fill_id) ||
1184 (frame_id != 0 && theme_provider->HasCustomImage(frame_id)); 1189 (frame_id != 0 && theme_provider->HasCustomImage(frame_id));
1185 1190
1186 // Explicitly map the id so we cache correctly. 1191 // Explicitly map the id so we cache correctly.
1187 const chrome::HostDesktopType host_desktop_type = GetHostDesktopType(this); 1192 const chrome::HostDesktopType host_desktop_type = GetHostDesktopType(this);
1188 tab_id = chrome::MapThemeImage(host_desktop_type, tab_id); 1193 fill_id = chrome::MapThemeImage(host_desktop_type, fill_id);
1194
1195 // If the theme is providing a custom background image, then its top edge
1196 // should be at the top of the tab. Otherwise, we assume that the background
1197 // image is a composited foreground + frame image.
1198 const int y_offset = GetThemeProvider()->HasCustomImage(fill_id) ?
1199 0 : background_offset_.y();
1189 1200
1190 // We only cache the image when it's the default image and we're not hovered, 1201 // We only cache the image when it's the default image and we're not hovered,
1191 // to avoid caching a background image that isn't the same for all tabs. 1202 // to avoid caching a background image that isn't the same for all tabs.
1192 if (!has_custom_image && !hover_controller_.ShouldDraw()) { 1203 if (!has_custom_image && !hover_controller_.ShouldDraw()) {
1193 ui::ScaleFactor scale_factor = 1204 ui::ScaleFactor scale_factor =
1194 ui::GetSupportedScaleFactor(canvas->image_scale()); 1205 ui::GetSupportedScaleFactor(canvas->image_scale());
1195 gfx::ImageSkia cached_image(GetCachedImage(tab_id, size(), scale_factor)); 1206 gfx::ImageSkia cached_image(GetCachedImage(fill_id, size(), scale_factor));
1196 if (cached_image.width() == 0) { 1207 if (cached_image.width() == 0) {
1197 gfx::Canvas tmp_canvas(size(), canvas->image_scale(), false); 1208 gfx::Canvas tmp_canvas(size(), canvas->image_scale(), false);
1198 PaintInactiveTabBackgroundUsingResourceId(&tmp_canvas, tab_id); 1209 PaintTabBackgroundUsingFillId(&tmp_canvas, false, fill_id, false,
1210 y_offset);
1199 cached_image = gfx::ImageSkia(tmp_canvas.ExtractImageRep()); 1211 cached_image = gfx::ImageSkia(tmp_canvas.ExtractImageRep());
1200 SetCachedImage(tab_id, scale_factor, cached_image); 1212 SetCachedImage(fill_id, scale_factor, cached_image);
1201 } 1213 }
1202 canvas->DrawImageInt(cached_image, 0, 0); 1214 canvas->DrawImageInt(cached_image, 0, 0);
1203 } else { 1215 } else {
1204 PaintInactiveTabBackgroundUsingResourceId(canvas, tab_id); 1216 PaintTabBackgroundUsingFillId(canvas, false, fill_id, has_custom_image,
1217 y_offset);
1205 } 1218 }
1206 } 1219 }
1207 1220
1208 void Tab::PaintInactiveTabBackgroundUsingResourceId(gfx::Canvas* canvas, 1221 void Tab::PaintTabBackgroundUsingFillId(gfx::Canvas* canvas,
1209 int tab_id) { 1222 bool is_active,
1210 gfx::ImageSkia* tab_background = 1223 int fill_id,
1211 GetThemeProvider()->GetImageSkiaNamed(tab_id); 1224 bool has_custom_image,
1225 int y_offset) {
1226 gfx::ImageSkia* fill_image = GetThemeProvider()->GetImageSkiaNamed(fill_id);
1212 // The tab image needs to be lined up with the background image 1227 // The tab image needs to be lined up with the background image
1213 // so that it feels partially transparent. These offsets represent the tab 1228 // so that it feels partially transparent. These offsets represent the tab
1214 // position within the frame background image. 1229 // position within the frame background image.
1215 const int x_offset = GetMirroredX() + background_offset_.x(); 1230 const int x_offset = GetMirroredX() + background_offset_.x();
1216 1231
1217 // If the theme is providing a custom background image, then its top edge
1218 // should be at the top of the tab. Otherwise, we assume that the background
1219 // image is a composited foreground + frame image.
1220 const int y_offset = GetThemeProvider()->HasCustomImage(tab_id) ?
1221 0 : background_offset_.y();
1222
1223 const gfx::Insets tab_insets(GetLayoutInsets(TAB));
1224 // Don't draw over the toolbar, but do include the 1 px divider stroke at the
1225 // bottom.
1226 const int toolbar_overlap = tab_insets.bottom() - 1;
1227
1228 const SkScalar radius = SkFloatToScalar(width() / 3.f); 1232 const SkScalar radius = SkFloatToScalar(width() / 3.f);
1229 const bool draw_hover = hover_controller_.ShouldDraw() && radius > 0; 1233 const bool draw_hover =
1234 !is_active && hover_controller_.ShouldDraw() && radius > 0;
1230 SkPoint hover_location(PointToSkPoint(hover_controller_.location())); 1235 SkPoint hover_location(PointToSkPoint(hover_controller_.location()));
1231 const SkAlpha hover_alpha = hover_controller_.GetAlpha(); 1236 const SkAlpha hover_alpha = hover_controller_.GetAlpha();
1232 1237
1233 // Draw everything to a temporary canvas so we can extract an image for use in 1238 if (draw_hover) {
1234 // masking the hover glow. 1239 // Draw everything to a temporary canvas so we can extract an image for use
1235 gfx::Canvas background_canvas(size(), canvas->image_scale(), false); 1240 // in masking the hover glow.
1241 gfx::Canvas background_canvas(size(), canvas->image_scale(), false);
1242 PaintTabFill(&background_canvas, fill_image, x_offset, y_offset, is_active);
1243 gfx::ImageSkia background_image(background_canvas.ExtractImageRep());
1244 canvas->DrawImageInt(background_image, 0, 0);
1236 1245
1237 // Draw left edge.
1238 gfx::ImageSkia tab_l = gfx::ImageSkiaOperations::CreateTiledImage(
1239 *tab_background, x_offset, y_offset, mask_images_.l_width, height());
1240 gfx::ImageSkia theme_l =
1241 gfx::ImageSkiaOperations::CreateMaskedImage(tab_l, *mask_images_.image_l);
1242 background_canvas.DrawImageInt(
1243 theme_l, 0, 0, theme_l.width(), theme_l.height() - toolbar_overlap, 0, 0,
1244 theme_l.width(), theme_l.height() - toolbar_overlap, false);
1245
1246 // Draw right edge.
1247 gfx::ImageSkia tab_r = gfx::ImageSkiaOperations::CreateTiledImage(
1248 *tab_background, x_offset + width() - mask_images_.r_width, y_offset,
1249 mask_images_.r_width, height());
1250 gfx::ImageSkia theme_r =
1251 gfx::ImageSkiaOperations::CreateMaskedImage(tab_r, *mask_images_.image_r);
1252 background_canvas.DrawImageInt(theme_r, 0, 0, theme_r.width(),
1253 theme_r.height() - toolbar_overlap,
1254 width() - theme_r.width(), 0, theme_r.width(),
1255 theme_r.height() - toolbar_overlap, false);
1256
1257 // Draw center. Instead of masking out the top portion we simply skip over
1258 // it by incrementing by the top padding, since it's a simple rectangle.
1259 background_canvas.TileImageInt(
1260 *tab_background, x_offset + mask_images_.l_width,
1261 y_offset + tab_insets.top(), mask_images_.l_width, tab_insets.top(),
1262 width() - mask_images_.l_width - mask_images_.r_width,
1263 height() - tab_insets.top() - toolbar_overlap);
1264
1265 gfx::ImageSkia background_image(background_canvas.ExtractImageRep());
1266 canvas->DrawImageInt(background_image, 0, 0);
1267
1268 if (draw_hover) {
1269 gfx::Canvas hover_canvas(size(), canvas->image_scale(), false); 1246 gfx::Canvas hover_canvas(size(), canvas->image_scale(), false);
1270 DrawHighlight(&hover_canvas, hover_location, radius, hover_alpha); 1247 DrawHighlight(&hover_canvas, hover_location, radius, hover_alpha);
1271 gfx::ImageSkia result = gfx::ImageSkiaOperations::CreateMaskedImage( 1248 gfx::ImageSkia result = gfx::ImageSkiaOperations::CreateMaskedImage(
1272 gfx::ImageSkia(hover_canvas.ExtractImageRep()), background_image); 1249 gfx::ImageSkia(hover_canvas.ExtractImageRep()), background_image);
1273 canvas->DrawImageInt(result, 0, 0); 1250 canvas->DrawImageInt(result, 0, 0);
1251 } else {
1252 PaintTabFill(canvas, fill_image, x_offset, y_offset, is_active);
1274 } 1253 }
1275 1254
1276 // Now draw the stroke, highlights, and shadows around the tab edge. 1255 // Now draw the stroke, highlights, and shadows around the tab edge.
1277 TabImages* stroke_images = &inactive_images_; 1256 TabImages* stroke_images = is_active ? &active_images_ : &inactive_images_;
1278 canvas->DrawImageInt(*stroke_images->image_l, 0, 0); 1257 canvas->DrawImageInt(*stroke_images->image_l, 0, 0);
1279 canvas->TileImageInt( 1258 canvas->TileImageInt(
1280 *stroke_images->image_c, stroke_images->l_width, 0, 1259 *stroke_images->image_c, stroke_images->l_width, 0,
1281 width() - stroke_images->l_width - stroke_images->r_width, height()); 1260 width() - stroke_images->l_width - stroke_images->r_width, height());
1282 canvas->DrawImageInt(*stroke_images->image_r, 1261 canvas->DrawImageInt(*stroke_images->image_r,
1283 width() - stroke_images->r_width, 0); 1262 width() - stroke_images->r_width, 0);
1284 } 1263 }
1285 1264
1286 void Tab::PaintActiveTabBackground(gfx::Canvas* canvas) { 1265 void Tab::PaintTabFill(gfx::Canvas* canvas,
1287 gfx::ImageSkia* tab_background = 1266 gfx::ImageSkia* fill_image,
1288 GetThemeProvider()->GetImageSkiaNamed(IDR_THEME_TOOLBAR); 1267 int x_offset,
1289 int x_offset = GetMirroredX() + background_offset_.x(); 1268 int y_offset,
1290 1269 bool is_active) {
1291 const gfx::Insets tab_insets(GetLayoutInsets(TAB)); 1270 const gfx::Insets tab_insets(GetLayoutInsets(TAB));
1271 // If this isn't the foreground tab, don't draw over the toolbar, but do
1272 // include the 1 px divider stroke at the bottom.
1273 const int toolbar_overlap = is_active ? 0 : (tab_insets.bottom() - 1);
1292 1274
1293 // Draw left edge. 1275 // Draw left edge.
1294 gfx::ImageSkia tab_l = gfx::ImageSkiaOperations::CreateTiledImage( 1276 gfx::ImageSkia tab_l = gfx::ImageSkiaOperations::CreateTiledImage(
1295 *tab_background, x_offset, 0, mask_images_.l_width, height()); 1277 *fill_image, x_offset, y_offset, mask_images_.l_width, height());
1296 gfx::ImageSkia theme_l = 1278 gfx::ImageSkia theme_l =
1297 gfx::ImageSkiaOperations::CreateMaskedImage(tab_l, *mask_images_.image_l); 1279 gfx::ImageSkiaOperations::CreateMaskedImage(tab_l, *mask_images_.image_l);
1298 canvas->DrawImageInt( 1280 canvas->DrawImageInt(
1299 theme_l, 0, 0, theme_l.width(), theme_l.height(), 0, 0, theme_l.width(), 1281 theme_l, 0, 0, theme_l.width(), theme_l.height() - toolbar_overlap, 0, 0,
1300 theme_l.height(), false); 1282 theme_l.width(), theme_l.height() - toolbar_overlap, false);
1301 1283
1302 // Draw right edge. 1284 // Draw right edge.
1303 gfx::ImageSkia tab_r = gfx::ImageSkiaOperations::CreateTiledImage( 1285 gfx::ImageSkia tab_r = gfx::ImageSkiaOperations::CreateTiledImage(
1304 *tab_background, x_offset + width() - mask_images_.r_width, 0, 1286 *fill_image, x_offset + width() - mask_images_.r_width, y_offset,
1305 mask_images_.r_width, height()); 1287 mask_images_.r_width, height());
1306 gfx::ImageSkia theme_r = 1288 gfx::ImageSkia theme_r =
1307 gfx::ImageSkiaOperations::CreateMaskedImage(tab_r, *mask_images_.image_r); 1289 gfx::ImageSkiaOperations::CreateMaskedImage(tab_r, *mask_images_.image_r);
1308 canvas->DrawImageInt(theme_r, 0, 0, theme_r.width(), theme_r.height(), 1290 canvas->DrawImageInt(theme_r, 0, 0, theme_r.width(),
1291 theme_r.height() - toolbar_overlap,
1309 width() - theme_r.width(), 0, theme_r.width(), 1292 width() - theme_r.width(), 0, theme_r.width(),
1310 theme_r.height(), false); 1293 theme_r.height() - toolbar_overlap, false);
1311 1294
1312 // Draw center. Instead of masking out the top portion we simply skip over it 1295 // Draw center. Instead of masking out the top portion we simply skip over it
1313 // by incrementing by the top padding, since it's a simple rectangle. 1296 // by incrementing by the top padding, since it's a simple rectangle.
1314 canvas->TileImageInt(*tab_background, x_offset + mask_images_.l_width, 1297 canvas->TileImageInt(*fill_image, x_offset + mask_images_.l_width,
1315 tab_insets.top(), mask_images_.l_width, tab_insets.top(), 1298 y_offset + tab_insets.top(), mask_images_.l_width,
1299 tab_insets.top(),
1316 width() - mask_images_.l_width - mask_images_.r_width, 1300 width() - mask_images_.l_width - mask_images_.r_width,
1317 height() - tab_insets.top()); 1301 height() - tab_insets.top() - toolbar_overlap);
1318
1319 // Now draw the stroke, highlights, and shadows around the tab edge.
1320 TabImages* stroke_images = &active_images_;
1321 canvas->DrawImageInt(*stroke_images->image_l, 0, 0);
1322 canvas->TileImageInt(
1323 *stroke_images->image_c, stroke_images->l_width, 0,
1324 width() - stroke_images->l_width - stroke_images->r_width, height());
1325 canvas->DrawImageInt(*stroke_images->image_r,
1326 width() - stroke_images->r_width, 0);
1327 } 1302 }
1328 1303
1329 void Tab::PaintIcon(gfx::Canvas* canvas) { 1304 void Tab::PaintIcon(gfx::Canvas* canvas) {
1330 gfx::Rect bounds = favicon_bounds_; 1305 gfx::Rect bounds = favicon_bounds_;
1331 bounds.set_x(GetMirroredXForRect(bounds)); 1306 bounds.set_x(GetMirroredXForRect(bounds));
1332 bounds.Offset(0, favicon_hiding_offset_); 1307 bounds.Offset(0, favicon_hiding_offset_);
1333 bounds.Intersect(GetContentsBounds()); 1308 bounds.Intersect(GetContentsBounds());
1334 if (bounds.IsEmpty()) 1309 if (bounds.IsEmpty())
1335 return; 1310 return;
1336 1311
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
1591 const gfx::ImageSkia& image) { 1566 const gfx::ImageSkia& image) {
1592 DCHECK_NE(scale_factor, ui::SCALE_FACTOR_NONE); 1567 DCHECK_NE(scale_factor, ui::SCALE_FACTOR_NONE);
1593 ImageCacheEntry entry; 1568 ImageCacheEntry entry;
1594 entry.resource_id = resource_id; 1569 entry.resource_id = resource_id;
1595 entry.scale_factor = scale_factor; 1570 entry.scale_factor = scale_factor;
1596 entry.image = image; 1571 entry.image = image;
1597 image_cache_->push_front(entry); 1572 image_cache_->push_front(entry);
1598 if (image_cache_->size() > kMaxImageCacheSize) 1573 if (image_cache_->size() > kMaxImageCacheSize)
1599 image_cache_->pop_back(); 1574 image_cache_->pop_back();
1600 } 1575 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/tabs/tab.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698