summaryrefslogtreecommitdiffstats
path: root/ui/native_theme/common_theme.cc
blob: 045a9369d38256eb80b44f5b00d73732ca4e09f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/native_theme/common_theme.h"

#include "base/logging.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/base/material_design/material_design_controller.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/skia_util.h"
#include "ui/resources/grit/ui_resources.h"

namespace ui {

SkColor GetAuraColor(NativeTheme::ColorId color_id,
                     const NativeTheme* base_theme) {
  // Shared colors.
  static const SkColor kTextfieldDefaultBackground = SK_ColorWHITE;
  static const SkColor kTextfieldSelectionBackgroundFocused =
      SkColorSetARGB(0x54, 0x60, 0xA8, 0xEB);

  // MD colors.
  if (ui::MaterialDesignController::IsModeMaterial()) {
    // Dialogs:
    static const SkColor kDialogBackgroundColorMd = SK_ColorWHITE;
    // Button:
    static const SkColor kTextButtonEnabledColorMd =
        SkColorSetRGB(0x64, 0x64, 0x64);
    static const SkColor kTextButtonDisabledColorMd =
        SkColorSetA(kTextButtonEnabledColorMd, 0x80);
    // MenuItem:
    static const SkColor kMenuHighlightBackgroundColorMd =
        SkColorSetARGB(0x14, 0x00, 0x00, 0x00);
    static const SkColor kSelectedMenuItemForegroundColorMd = SK_ColorBLACK;
    // Link:
    static const SkColor kLinkDisabledColorMd = SK_ColorBLACK;
    static const SkColor kLinkEnabledColorMd = gfx::kGoogleBlue700;
    // Results tables:
    static const SkColor kResultsTableTextMd = SK_ColorBLACK;
    static const SkColor kResultsTableDimmedTextMd =
        SkColorSetRGB(0x64, 0x64, 0x64);
    static const SkColor kPositiveTextColorMd = SkColorSetRGB(0x0b, 0x80, 0x43);
    static const SkColor kNegativeTextColorMd = SkColorSetRGB(0xc5, 0x39, 0x29);

    switch (color_id) {
      // Dialogs
      case NativeTheme::kColorId_DialogBackground:
      case NativeTheme::kColorId_BubbleBackground:
        return kDialogBackgroundColorMd;

      // Button
      case NativeTheme::kColorId_MdTextButtonEnabledColor:
        return kTextButtonEnabledColorMd;
      case NativeTheme::kColorId_MdTextButtonDisabledColor:
        return kTextButtonDisabledColorMd;

      // MenuItem
      case NativeTheme::kColorId_FocusedMenuItemBackgroundColor:
        return kMenuHighlightBackgroundColorMd;
      case NativeTheme::kColorId_SelectedMenuItemForegroundColor:
        return kSelectedMenuItemForegroundColorMd;
      // Link
      case NativeTheme::kColorId_LinkDisabled:
        return kLinkDisabledColorMd;
      case NativeTheme::kColorId_LinkEnabled:
      case NativeTheme::kColorId_LinkPressed:
        // Normal and pressed share a color.
        return kLinkEnabledColorMd;

      // Results Tables
      case NativeTheme::kColorId_ResultsTableHoveredBackground:
        return SkColorSetA(base_theme->GetSystemColor(
                               NativeTheme::kColorId_ResultsTableNormalText),
                           0x0D);
      case NativeTheme::kColorId_ResultsTableSelectedBackground:
        return SkColorSetA(base_theme->GetSystemColor(
                               NativeTheme::kColorId_ResultsTableNormalText),
                           0x14);
      case NativeTheme::kColorId_ResultsTableNormalText:
      case NativeTheme::kColorId_ResultsTableHoveredText:
      case NativeTheme::kColorId_ResultsTableSelectedText:
      case NativeTheme::kColorId_ResultsTableNormalHeadline:
      case NativeTheme::kColorId_ResultsTableHoveredHeadline:
      case NativeTheme::kColorId_ResultsTableSelectedHeadline:
        return kResultsTableTextMd;
      case NativeTheme::kColorId_ResultsTableNormalDimmedText:
      case NativeTheme::kColorId_ResultsTableHoveredDimmedText:
      case NativeTheme::kColorId_ResultsTableSelectedDimmedText:
        return kResultsTableDimmedTextMd;
      case NativeTheme::kColorId_ResultsTableNormalUrl:
      case NativeTheme::kColorId_ResultsTableHoveredUrl:
      case NativeTheme::kColorId_ResultsTableSelectedUrl:
        return base_theme->GetSystemColor(NativeTheme::kColorId_LinkEnabled);
      case NativeTheme::kColorId_ResultsTablePositiveText:
      case NativeTheme::kColorId_ResultsTablePositiveHoveredText:
      case NativeTheme::kColorId_ResultsTablePositiveSelectedText:
        return kPositiveTextColorMd;
      case NativeTheme::kColorId_ResultsTableNegativeText:
      case NativeTheme::kColorId_ResultsTableNegativeHoveredText:
      case NativeTheme::kColorId_ResultsTableNegativeSelectedText:
        return kNegativeTextColorMd;

      default:
        break;
    }
  }

  // Pre-MD colors.
  // Windows:
  static const SkColor kWindowBackgroundColor = SK_ColorWHITE;
  // Dialogs:
  static const SkColor kDialogBackgroundColor = SkColorSetRGB(251, 251, 251);
  // FocusableBorder:
  static const SkColor kFocusedBorderColor = SkColorSetRGB(0x4D, 0x90, 0xFE);
  static const SkColor kUnfocusedBorderColor = SkColorSetRGB(0xD9, 0xD9, 0xD9);
  // Button:
  static const SkColor kButtonBackgroundColor = SkColorSetRGB(0xDE, 0xDE, 0xDE);
  static const SkColor kButtonEnabledColor = SkColorSetRGB(0x22, 0x22, 0x22);
  static const SkColor kButtonHighlightColor = SkColorSetRGB(0, 0, 0);
  static const SkColor kButtonHoverColor = kButtonEnabledColor;
  static const SkColor kButtonHoverBackgroundColor =
      SkColorSetRGB(0xEA, 0xEA, 0xEA);
  static const SkColor kBlueButtonEnabledColor = SK_ColorWHITE;
  static const SkColor kBlueButtonDisabledColor = SK_ColorWHITE;
  static const SkColor kBlueButtonPressedColor = SK_ColorWHITE;
  static const SkColor kBlueButtonHoverColor = SK_ColorWHITE;
  static const SkColor kBlueButtonShadowColor = SkColorSetRGB(0x53, 0x8C, 0xEA);
  static const SkColor kCallToActionColor = gfx::kGoogleBlue500;
  // MenuItem:
  static const SkColor kMenuBackgroundColor = SK_ColorWHITE;
  static const SkColor kMenuHighlightBackgroundColor =
      SkColorSetRGB(0x42, 0x81, 0xF4);
  static const SkColor kMenuBorderColor = SkColorSetRGB(0xBA, 0xBA, 0xBA);
  static const SkColor kEnabledMenuButtonBorderColor =
      SkColorSetARGB(0x24, 0x00, 0x00, 0x00);
  static const SkColor kFocusedMenuButtonBorderColor =
      SkColorSetARGB(0x48, 0x00, 0x00, 0x00);
  static const SkColor kHoverMenuButtonBorderColor =
      SkColorSetARGB(0x48, 0x00, 0x00, 0x00);
  static const SkColor kMenuSeparatorColor = SkColorSetRGB(0xE9, 0xE9, 0xE9);
  static const SkColor kEnabledMenuItemForegroundColor = SK_ColorBLACK;
  static const SkColor kDisabledMenuItemForegroundColor =
      SkColorSetRGB(0xA1, 0xA1, 0x92);
  static const SkColor kHoverMenuItemBackgroundColor =
      SkColorSetARGB(0xCC, 0xFF, 0xFF, 0xFF);
  // Label:
  static const SkColor kLabelEnabledColor = kButtonEnabledColor;
  static const SkColor kLabelBackgroundColor = SK_ColorWHITE;
  // Link:
  static const SkColor kLinkDisabledColor = SK_ColorBLACK;
  static const SkColor kLinkEnabledColor = SkColorSetRGB(0, 51, 153);
  static const SkColor kLinkPressedColor = SK_ColorRED;
  // Textfield:
  static const SkColor kTextfieldDefaultColor = SK_ColorBLACK;
  static const SkColor kTextfieldReadOnlyColor = SK_ColorDKGRAY;
  static const SkColor kTextfieldReadOnlyBackground = SK_ColorWHITE;
  static const SkColor kTextfieldSelectionColor = color_utils::AlphaBlend(
      SK_ColorBLACK, kTextfieldSelectionBackgroundFocused, 0xdd);
  // Tooltip
  static const SkColor kTooltipBackground = 0xFFFFFFCC;
  static const SkColor kTooltipTextColor = kLabelEnabledColor;
  // Tree
  static const SkColor kTreeBackground = SK_ColorWHITE;
  static const SkColor kTreeTextColor = SK_ColorBLACK;
  static const SkColor kTreeSelectedTextColor = SK_ColorBLACK;
  static const SkColor kTreeSelectionBackgroundColor =
      SkColorSetRGB(0xEE, 0xEE, 0xEE);
  static const SkColor kTreeArrowColor = SkColorSetRGB(0x7A, 0x7A, 0x7A);
  // Table
  static const SkColor kTableBackground = SK_ColorWHITE;
  static const SkColor kTableTextColor = SK_ColorBLACK;
  static const SkColor kTableSelectedTextColor = SK_ColorBLACK;
  static const SkColor kTableSelectionBackgroundColor =
      SkColorSetRGB(0xEE, 0xEE, 0xEE);
  static const SkColor kTableGroupingIndicatorColor =
      SkColorSetRGB(0xCC, 0xCC, 0xCC);
  // Results Tables
  static const SkColor kResultsTableSelectedBackground =
      kTextfieldSelectionBackgroundFocused;
  static const SkColor kResultsTableNormalText =
      color_utils::AlphaBlend(SK_ColorBLACK, kTextfieldDefaultBackground, 0xDD);
  static const SkColor kResultsTableHoveredBackground = color_utils::AlphaBlend(
      kTextfieldSelectionBackgroundFocused, kTextfieldDefaultBackground, 0x40);
  static const SkColor kResultsTableHoveredText = color_utils::AlphaBlend(
      SK_ColorBLACK, kResultsTableHoveredBackground, 0xDD);
  static const SkColor kResultsTableSelectedText = color_utils::AlphaBlend(
      SK_ColorBLACK, kTextfieldSelectionBackgroundFocused, 0xDD);
  static const SkColor kResultsTableNormalDimmedText =
      color_utils::AlphaBlend(SK_ColorBLACK, kTextfieldDefaultBackground, 0xBB);
  static const SkColor kResultsTableHoveredDimmedText = color_utils::AlphaBlend(
      SK_ColorBLACK, kResultsTableHoveredBackground, 0xBB);
  static const SkColor kResultsTableSelectedDimmedText =
      color_utils::AlphaBlend(SK_ColorBLACK,
                              kTextfieldSelectionBackgroundFocused, 0xBB);
  static const SkColor kResultsTableNormalUrl = kTextfieldSelectionColor;
  static const SkColor kResultsTableSelectedOrHoveredUrl =
      SkColorSetARGB(0xff, 0x0b, 0x80, 0x43);
  const SkColor kPositiveTextColor = SkColorSetRGB(0x0b, 0x80, 0x43);
  const SkColor kNegativeTextColor = SkColorSetRGB(0xc5, 0x39, 0x29);
  static const SkColor kResultsTablePositiveText = color_utils::AlphaBlend(
      kPositiveTextColor, kTextfieldDefaultBackground, 0xDD);
  static const SkColor kResultsTablePositiveHoveredText =
      color_utils::AlphaBlend(kPositiveTextColor,
                              kResultsTableHoveredBackground, 0xDD);
  static const SkColor kResultsTablePositiveSelectedText =
      color_utils::AlphaBlend(kPositiveTextColor,
                              kTextfieldSelectionBackgroundFocused, 0xDD);
  static const SkColor kResultsTableNegativeText = color_utils::AlphaBlend(
      kNegativeTextColor, kTextfieldDefaultBackground, 0xDD);
  static const SkColor kResultsTableNegativeHoveredText =
      color_utils::AlphaBlend(kNegativeTextColor,
                              kResultsTableHoveredBackground, 0xDD);
  static const SkColor kResultsTableNegativeSelectedText =
      color_utils::AlphaBlend(kNegativeTextColor,
                              kTextfieldSelectionBackgroundFocused, 0xDD);
  // Material spinner/throbber:
  static const SkColor kThrobberSpinningColor = gfx::kGoogleBlue500;
  static const SkColor kThrobberWaitingColor = SkColorSetRGB(0xA6, 0xA6, 0xA6);
  static const SkColor kThrobberLightColor = SkColorSetRGB(0xF4, 0xF8, 0xFD);

  switch (color_id) {
    // Windows
    case NativeTheme::kColorId_WindowBackground:
      return kWindowBackgroundColor;

    // Dialogs
    case NativeTheme::kColorId_DialogBackground:
    case NativeTheme::kColorId_BubbleBackground:
      return kDialogBackgroundColor;

    // FocusableBorder
    case NativeTheme::kColorId_FocusedBorderColor:
      return kFocusedBorderColor;
    case NativeTheme::kColorId_UnfocusedBorderColor:
      return kUnfocusedBorderColor;

    // Button
    case NativeTheme::kColorId_ButtonBackgroundColor:
      return kButtonBackgroundColor;
    case NativeTheme::kColorId_ButtonEnabledColor:
      return kButtonEnabledColor;
    case NativeTheme::kColorId_ButtonHighlightColor:
      return kButtonHighlightColor;
    case NativeTheme::kColorId_ButtonHoverColor:
      return kButtonHoverColor;
    case NativeTheme::kColorId_ButtonHoverBackgroundColor:
      return kButtonHoverBackgroundColor;
    case NativeTheme::kColorId_BlueButtonEnabledColor:
      return kBlueButtonEnabledColor;
    case NativeTheme::kColorId_BlueButtonDisabledColor:
      return kBlueButtonDisabledColor;
    case NativeTheme::kColorId_BlueButtonPressedColor:
      return kBlueButtonPressedColor;
    case NativeTheme::kColorId_BlueButtonHoverColor:
      return kBlueButtonHoverColor;
    case NativeTheme::kColorId_BlueButtonShadowColor:
      return kBlueButtonShadowColor;
    case NativeTheme::kColorId_CallToActionColor:
      return kCallToActionColor;

    // MenuItem
    case NativeTheme::kColorId_MenuBorderColor:
      return kMenuBorderColor;
    case NativeTheme::kColorId_EnabledMenuButtonBorderColor:
      return kEnabledMenuButtonBorderColor;
    case NativeTheme::kColorId_FocusedMenuButtonBorderColor:
      return kFocusedMenuButtonBorderColor;
    case NativeTheme::kColorId_HoverMenuButtonBorderColor:
      return kHoverMenuButtonBorderColor;
    case NativeTheme::kColorId_MenuSeparatorColor:
      return kMenuSeparatorColor;
    case NativeTheme::kColorId_MenuBackgroundColor:
      return kMenuBackgroundColor;
    case NativeTheme::kColorId_FocusedMenuItemBackgroundColor:
      return kMenuHighlightBackgroundColor;
    case NativeTheme::kColorId_HoverMenuItemBackgroundColor:
      return kHoverMenuItemBackgroundColor;
    case NativeTheme::kColorId_EnabledMenuItemForegroundColor:
      return kEnabledMenuItemForegroundColor;
    case NativeTheme::kColorId_DisabledMenuItemForegroundColor:
      return kDisabledMenuItemForegroundColor;
    case NativeTheme::kColorId_DisabledEmphasizedMenuItemForegroundColor:
      return SK_ColorBLACK;
    case NativeTheme::kColorId_SelectedMenuItemForegroundColor:
      return SK_ColorWHITE;
    case NativeTheme::kColorId_ButtonDisabledColor:
      return kDisabledMenuItemForegroundColor;

    // Label
    case NativeTheme::kColorId_LabelEnabledColor:
      return kLabelEnabledColor;
    case NativeTheme::kColorId_LabelDisabledColor:
      return base_theme->GetSystemColor(
          NativeTheme::kColorId_ButtonDisabledColor);
    case NativeTheme::kColorId_LabelBackgroundColor:
      return kLabelBackgroundColor;

    // Link
    case NativeTheme::kColorId_LinkDisabled:
      return kLinkDisabledColor;
    case NativeTheme::kColorId_LinkEnabled:
      return kLinkEnabledColor;
    case NativeTheme::kColorId_LinkPressed:
      return kLinkPressedColor;

    // Textfield
    case NativeTheme::kColorId_TextfieldDefaultColor:
      return kTextfieldDefaultColor;
    case NativeTheme::kColorId_TextfieldDefaultBackground:
      return kTextfieldDefaultBackground;
    case NativeTheme::kColorId_TextfieldReadOnlyColor:
      return kTextfieldReadOnlyColor;
    case NativeTheme::kColorId_TextfieldReadOnlyBackground:
      return kTextfieldReadOnlyBackground;
    case NativeTheme::kColorId_TextfieldSelectionColor:
      return kTextfieldSelectionColor;
    case NativeTheme::kColorId_TextfieldSelectionBackgroundFocused:
      return kTextfieldSelectionBackgroundFocused;

    // Tooltip
    case NativeTheme::kColorId_TooltipBackground:
      return kTooltipBackground;
    case NativeTheme::kColorId_TooltipText:
      return kTooltipTextColor;

    // Tree
    case NativeTheme::kColorId_TreeBackground:
      return kTreeBackground;
    case NativeTheme::kColorId_TreeText:
      return kTreeTextColor;
    case NativeTheme::kColorId_TreeSelectedText:
    case NativeTheme::kColorId_TreeSelectedTextUnfocused:
      return kTreeSelectedTextColor;
    case NativeTheme::kColorId_TreeSelectionBackgroundFocused:
    case NativeTheme::kColorId_TreeSelectionBackgroundUnfocused:
      return kTreeSelectionBackgroundColor;
    case NativeTheme::kColorId_TreeArrow:
      return kTreeArrowColor;

    // Table
    case NativeTheme::kColorId_TableBackground:
      return kTableBackground;
    case NativeTheme::kColorId_TableText:
      return kTableTextColor;
    case NativeTheme::kColorId_TableSelectedText:
    case NativeTheme::kColorId_TableSelectedTextUnfocused:
      return kTableSelectedTextColor;
    case NativeTheme::kColorId_TableSelectionBackgroundFocused:
    case NativeTheme::kColorId_TableSelectionBackgroundUnfocused:
      return kTableSelectionBackgroundColor;
    case NativeTheme::kColorId_TableGroupingIndicatorColor:
      return kTableGroupingIndicatorColor;

    // Results Tables
    case NativeTheme::kColorId_ResultsTableNormalBackground:
      return kTextfieldDefaultBackground;
    case NativeTheme::kColorId_ResultsTableHoveredBackground:
      return kResultsTableHoveredBackground;
    case NativeTheme::kColorId_ResultsTableSelectedBackground:
      return kResultsTableSelectedBackground;
    case NativeTheme::kColorId_ResultsTableNormalText:
      return kResultsTableNormalText;
    case NativeTheme::kColorId_ResultsTableHoveredText:
      return kResultsTableHoveredText;
    case NativeTheme::kColorId_ResultsTableSelectedText:
      return kResultsTableSelectedText;
    case NativeTheme::kColorId_ResultsTableNormalDimmedText:
    case NativeTheme::kColorId_ResultsTableNormalHeadline:
      return kResultsTableNormalDimmedText;
    case NativeTheme::kColorId_ResultsTableHoveredDimmedText:
    case NativeTheme::kColorId_ResultsTableHoveredHeadline:
      return kResultsTableHoveredDimmedText;
    case NativeTheme::kColorId_ResultsTableSelectedDimmedText:
    case NativeTheme::kColorId_ResultsTableSelectedHeadline:
      return kResultsTableSelectedDimmedText;
    case NativeTheme::kColorId_ResultsTableNormalUrl:
      return kResultsTableNormalUrl;
    case NativeTheme::kColorId_ResultsTableHoveredUrl:
    case NativeTheme::kColorId_ResultsTableSelectedUrl:
      return kResultsTableSelectedOrHoveredUrl;
    case NativeTheme::kColorId_ResultsTablePositiveText:
      return kResultsTablePositiveText;
    case NativeTheme::kColorId_ResultsTablePositiveHoveredText:
      return kResultsTablePositiveHoveredText;
    case NativeTheme::kColorId_ResultsTablePositiveSelectedText:
      return kResultsTablePositiveSelectedText;
    case NativeTheme::kColorId_ResultsTableNegativeText:
      return kResultsTableNegativeText;
    case NativeTheme::kColorId_ResultsTableNegativeHoveredText:
      return kResultsTableNegativeHoveredText;
    case NativeTheme::kColorId_ResultsTableNegativeSelectedText:
      return kResultsTableNegativeSelectedText;

    // Material spinner/throbber
    case NativeTheme::kColorId_ThrobberSpinningColor:
      return kThrobberSpinningColor;
    case NativeTheme::kColorId_ThrobberWaitingColor:
      return kThrobberWaitingColor;
    case NativeTheme::kColorId_ThrobberLightColor:
      return kThrobberLightColor;

    case NativeTheme::kColorId_MdTextButtonEnabledColor:
    case NativeTheme::kColorId_MdTextButtonDisabledColor:
    case NativeTheme::kColorId_NumColors:
      break;
  }

  NOTREACHED();
  return gfx::kPlaceholderColor;
}

gfx::Size CommonThemeGetPartSize(NativeTheme::Part part,
                                 NativeTheme::State state,
                                 const NativeTheme::ExtraParams& extra) {
  gfx::Size size;
  switch (part) {
    case NativeTheme::kComboboxArrow:
      return ui::ResourceBundle::GetSharedInstance().GetImageNamed(
          IDR_MENU_DROPARROW).Size();

    default:
      break;
  }

  return size;
}

void CommonThemePaintComboboxArrow(SkCanvas* canvas, const gfx::Rect& rect) {
  gfx::ImageSkia* arrow = ui::ResourceBundle::GetSharedInstance().
      GetImageSkiaNamed(IDR_MENU_DROPARROW);
  CommonThemeCreateCanvas(canvas)->DrawImageInt(*arrow, rect.x(), rect.y());
}

void CommonThemePaintMenuSeparator(SkCanvas* canvas, const gfx::Rect& rect) {
  SkPaint paint;
  paint.setColor(
      GetAuraColor(NativeTheme::kColorId_MenuSeparatorColor, nullptr));
  int position_y = rect.y() + rect.height() / 2;
  canvas->drawLine(rect.x(), position_y, rect.right(), position_y, paint);
}

void CommonThemePaintMenuGutter(SkCanvas* canvas, const gfx::Rect& rect) {
  SkPaint paint;
  paint.setColor(
      GetAuraColor(NativeTheme::kColorId_MenuSeparatorColor, nullptr));
  int position_x = rect.x() + rect.width() / 2;
  canvas->drawLine(position_x, rect.y(), position_x, rect.bottom(), paint);
}

void CommonThemePaintMenuBackground(SkCanvas* canvas, const gfx::Rect& rect) {
  SkPaint paint;
  paint.setColor(
      GetAuraColor(NativeTheme::kColorId_MenuBackgroundColor, nullptr));
  canvas->drawRect(gfx::RectToSkRect(rect), paint);
}

void CommonThemePaintMenuItemBackground(SkCanvas* canvas,
                                        NativeTheme::State state,
                                        const gfx::Rect& rect) {
  SkPaint paint;
  switch (state) {
    case NativeTheme::kNormal:
    case NativeTheme::kDisabled:
      paint.setColor(
          GetAuraColor(NativeTheme::kColorId_MenuBackgroundColor, nullptr));
      break;
    case NativeTheme::kHovered:
      paint.setColor(GetAuraColor(
          NativeTheme::kColorId_FocusedMenuItemBackgroundColor, nullptr));
      break;
    default:
      NOTREACHED() << "Invalid state " << state;
      break;
  }
  canvas->drawRect(gfx::RectToSkRect(rect), paint);
}

// static
scoped_ptr<gfx::Canvas> CommonThemeCreateCanvas(SkCanvas* sk_canvas) {
  // TODO(pkotwicz): Do something better and don't infer device
  // scale factor from canvas scale.
  SkMatrix m = sk_canvas->getTotalMatrix();
  float device_scale = static_cast<float>(SkScalarAbs(m.getScaleX()));
  return make_scoped_ptr(new gfx::Canvas(sk_canvas, device_scale));
}

}  // namespace ui