| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of the WebKit project. | 2 * This file is part of the WebKit project. |
| 3 * | 3 * |
| 4 * Copyright (C) 2006 Apple Computer, Inc. | 4 * Copyright (C) 2006 Apple Computer, Inc. |
| 5 * Copyright (C) 2008, 2009 Google, Inc. | 5 * Copyright (C) 2008, 2009 Google, Inc. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "ChromiumBridge.h" | 31 #include "ChromiumBridge.h" |
| 32 #include "CSSStyleSheet.h" | 32 #include "CSSStyleSheet.h" |
| 33 #include "CSSValueKeywords.h" | 33 #include "CSSValueKeywords.h" |
| 34 #include "Document.h" | 34 #include "Document.h" |
| 35 #include "FontSelector.h" | 35 #include "FontSelector.h" |
| 36 #include "FontUtilsChromiumWin.h" | 36 #include "FontUtilsChromiumWin.h" |
| 37 #include "GraphicsContext.h" | 37 #include "GraphicsContext.h" |
| 38 #include "RenderBox.h" | 38 #include "RenderBox.h" |
| 39 #include "ScrollbarTheme.h" | 39 #include "ScrollbarTheme.h" |
| 40 #include "SkiaUtils.h" | 40 #include "SkiaUtils.h" |
| 41 #include "ThemeHelperChromiumWin.h" | 41 #include "TransparencyWin.h" |
| 42 #include "UserAgentStyleSheets.h" | 42 #include "UserAgentStyleSheets.h" |
| 43 #include "WindowsVersion.h" | 43 #include "WindowsVersion.h" |
| 44 | 44 |
| 45 // FIXME: This dependency should eventually be removed. | 45 // FIXME: This dependency should eventually be removed. |
| 46 #include <skia/ext/skia_utils_win.h> | 46 #include <skia/ext/skia_utils_win.h> |
| 47 | 47 |
| 48 #define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(structName, member) \ | 48 #define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(structName, member) \ |
| 49 offsetof(structName, member) + \ | 49 offsetof(structName, member) + \ |
| 50 (sizeof static_cast<structName*>(0)->member) | 50 (sizeof static_cast<structName*>(0)->member) |
| 51 #define NONCLIENTMETRICS_SIZE_PRE_VISTA \ | 51 #define NONCLIENTMETRICS_SIZE_PRE_VISTA \ |
| 52 SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont) | 52 SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont) |
| 53 | 53 |
| 54 namespace WebCore { | 54 namespace WebCore { |
| 55 | 55 |
| 56 namespace { |
| 57 |
| 58 bool canvasHasMultipleLayers(const SkCanvas* canvas) |
| 59 { |
| 60 SkCanvas::LayerIter iter(const_cast<SkCanvas*>(canvas), false); |
| 61 iter.next(); // There is always at least one layer. |
| 62 return !iter.done(); // There is > 1 layer if the the iterator can stil adv
ance. |
| 63 } |
| 64 |
| 65 class ThemePainter : public TransparencyWin { |
| 66 public: |
| 67 ThemePainter(GraphicsContext* context, const IntRect& r) { |
| 68 // Compute the transform mode. |
| 69 TransformMode transformMode; |
| 70 const TransformationMatrix& matrix = context->getCTM(); |
| 71 if (matrix.b() != 0 || matrix.c() != 0) // Skew. |
| 72 transformMode = Untransform; |
| 73 else if (matrix.a() != 1.0 || matrix.d() != 1.0) // Scale. |
| 74 transformMode = ScaleTransform; |
| 75 else // Nothing interesting. |
| 76 transformMode = KeepTransform; |
| 77 |
| 78 // Compute the layer mode. |
| 79 LayerMode layerMode; |
| 80 if (context->platformContext()->isDrawingToImageBuffer()) // Might have
transparent background. |
| 81 layerMode = WhiteLayer; |
| 82 else if (canvasHasMultipleLayers(context->platformContext()->canvas()))
// Needs antialiasing help. |
| 83 layerMode = OpaqueCompositeLayer; |
| 84 else // Nothing interesting. |
| 85 layerMode = transformMode == KeepTransform ? NoLayer : OpaqueComposi
teLayer; |
| 86 |
| 87 init(context, layerMode, transformMode, r); |
| 88 } |
| 89 }; |
| 90 |
| 91 } // namespace |
| 92 |
| 56 static void getNonClientMetrics(NONCLIENTMETRICS* metrics) { | 93 static void getNonClientMetrics(NONCLIENTMETRICS* metrics) { |
| 57 static UINT size = WebCore::isVistaOrNewer() ? | 94 static UINT size = WebCore::isVistaOrNewer() ? |
| 58 sizeof(NONCLIENTMETRICS) : NONCLIENTMETRICS_SIZE_PRE_VISTA; | 95 sizeof(NONCLIENTMETRICS) : NONCLIENTMETRICS_SIZE_PRE_VISTA; |
| 59 metrics->cbSize = size; | 96 metrics->cbSize = size; |
| 60 bool success = !!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, size, metrics
, 0); | 97 bool success = !!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, size, metrics
, 0); |
| 61 ASSERT(success); | 98 ASSERT(success); |
| 62 } | 99 } |
| 63 | 100 |
| 64 enum PaddingType { | 101 enum PaddingType { |
| 65 TopPadding, | 102 TopPadding, |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 void RenderThemeChromiumWin::setRadioSize(RenderStyle* style) const | 403 void RenderThemeChromiumWin::setRadioSize(RenderStyle* style) const |
| 367 { | 404 { |
| 368 // Use same sizing for radio box as checkbox. | 405 // Use same sizing for radio box as checkbox. |
| 369 setCheckboxSize(style); | 406 setCheckboxSize(style); |
| 370 } | 407 } |
| 371 | 408 |
| 372 bool RenderThemeChromiumWin::paintButton(RenderObject* o, const RenderObject::Pa
intInfo& i, const IntRect& r) | 409 bool RenderThemeChromiumWin::paintButton(RenderObject* o, const RenderObject::Pa
intInfo& i, const IntRect& r) |
| 373 { | 410 { |
| 374 const ThemeData& themeData = getThemeData(o); | 411 const ThemeData& themeData = getThemeData(o); |
| 375 | 412 |
| 376 WebCore::ThemeHelperWin helper(i.context, r); | 413 WebCore::ThemePainter painter(i.context, r); |
| 377 ChromiumBridge::paintButton(helper.context(), | 414 ChromiumBridge::paintButton(painter.context(), |
| 378 themeData.m_part, | 415 themeData.m_part, |
| 379 themeData.m_state, | 416 themeData.m_state, |
| 380 themeData.m_classicState, | 417 themeData.m_classicState, |
| 381 helper.rect()); | 418 painter.drawRect()); |
| 382 return false; | 419 return false; |
| 383 } | 420 } |
| 384 | 421 |
| 385 bool RenderThemeChromiumWin::paintTextField(RenderObject* o, const RenderObject:
:PaintInfo& i, const IntRect& r) | 422 bool RenderThemeChromiumWin::paintTextField(RenderObject* o, const RenderObject:
:PaintInfo& i, const IntRect& r) |
| 386 { | 423 { |
| 387 return paintTextFieldInternal(o, i, r, true); | 424 return paintTextFieldInternal(o, i, r, true); |
| 388 } | 425 } |
| 389 | 426 |
| 390 bool RenderThemeChromiumWin::paintSearchField(RenderObject* o, const RenderObjec
t::PaintInfo& i, const IntRect& r) | 427 bool RenderThemeChromiumWin::paintSearchField(RenderObject* o, const RenderObjec
t::PaintInfo& i, const IntRect& r) |
| 391 { | 428 { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 else | 471 else |
| 435 buttonX = o->style()->direction() == LTR ? r.right() - spacingRight - bu
ttonWidth : r.x() + spacingLeft; | 472 buttonX = o->style()->direction() == LTR ? r.right() - spacingRight - bu
ttonWidth : r.x() + spacingLeft; |
| 436 | 473 |
| 437 // Compute the rectangle of the button in the destination image. | 474 // Compute the rectangle of the button in the destination image. |
| 438 IntRect rect(buttonX, | 475 IntRect rect(buttonX, |
| 439 r.y() + spacingTop, | 476 r.y() + spacingTop, |
| 440 std::min(buttonWidth, r.right() - r.x()), | 477 std::min(buttonWidth, r.right() - r.x()), |
| 441 r.height() - (spacingTop + spacingBottom)); | 478 r.height() - (spacingTop + spacingBottom)); |
| 442 | 479 |
| 443 // Get the correct theme data for a textfield and paint the menu. | 480 // Get the correct theme data for a textfield and paint the menu. |
| 444 WebCore::ThemeHelperWin helper(i.context, rect); | 481 WebCore::ThemePainter painter(i.context, rect); |
| 445 ChromiumBridge::paintMenuList(helper.context(), | 482 ChromiumBridge::paintMenuList(painter.context(), |
| 446 CP_DROPDOWNBUTTON, | 483 CP_DROPDOWNBUTTON, |
| 447 determineState(o), | 484 determineState(o), |
| 448 determineClassicState(o), | 485 determineClassicState(o), |
| 449 helper.rect()); | 486 painter.drawRect()); |
| 450 return false; | 487 return false; |
| 451 } | 488 } |
| 452 | 489 |
| 453 void RenderThemeChromiumWin::adjustMenuListButtonStyle(CSSStyleSelector* selecto
r, RenderStyle* style, Element* e) const | 490 void RenderThemeChromiumWin::adjustMenuListButtonStyle(CSSStyleSelector* selecto
r, RenderStyle* style, Element* e) const |
| 454 { | 491 { |
| 455 adjustMenuListStyle(selector, style, e); | 492 adjustMenuListStyle(selector, style, e); |
| 456 } | 493 } |
| 457 | 494 |
| 458 // Used to paint styled menulists (i.e. with a non-default border) | 495 // Used to paint styled menulists (i.e. with a non-default border) |
| 459 bool RenderThemeChromiumWin::paintMenuListButton(RenderObject* o, const RenderOb
ject::PaintInfo& i, const IntRect& r) | 496 bool RenderThemeChromiumWin::paintMenuListButton(RenderObject* o, const RenderOb
ject::PaintInfo& i, const IntRect& r) |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 break; | 593 break; |
| 557 } | 594 } |
| 558 | 595 |
| 559 result.m_state = determineState(o); | 596 result.m_state = determineState(o); |
| 560 result.m_classicState |= determineClassicState(o); | 597 result.m_classicState |= determineClassicState(o); |
| 561 | 598 |
| 562 return result; | 599 return result; |
| 563 } | 600 } |
| 564 | 601 |
| 565 bool RenderThemeChromiumWin::paintTextFieldInternal(RenderObject* o, | 602 bool RenderThemeChromiumWin::paintTextFieldInternal(RenderObject* o, |
| 566 const RenderObject::PaintInfo& i, | 603 const RenderObject::PaintInf
o& i, |
| 567 const IntRect& r, | 604 const IntRect& r, |
| 568 bool drawEdges) | 605 bool drawEdges) |
| 569 { | 606 { |
| 570 // Nasty hack to make us not paint the border on text fields with a | 607 // Nasty hack to make us not paint the border on text fields with a |
| 571 // border-radius. Webkit paints elements with border-radius for us. | 608 // border-radius. Webkit paints elements with border-radius for us. |
| 572 // FIXME: Get rid of this if-check once we can properly clip rounded | 609 // FIXME: Get rid of this if-check once we can properly clip rounded |
| 573 // borders: http://b/1112604 and http://b/1108635 | 610 // borders: http://b/1112604 and http://b/1108635 |
| 574 // FIXME: make sure we do the right thing if css background-clip is set. | 611 // FIXME: make sure we do the right thing if css background-clip is set. |
| 575 if (o->style()->hasBorderRadius()) | 612 if (o->style()->hasBorderRadius()) |
| 576 return false; | 613 return false; |
| 577 | 614 |
| 578 const ThemeData& themeData = getThemeData(o); | 615 const ThemeData& themeData = getThemeData(o); |
| 579 | 616 |
| 580 WebCore::ThemeHelperWin helper(i.context, r); | 617 WebCore::ThemePainter painter(i.context, r); |
| 581 ChromiumBridge::paintTextField(helper.context(), | 618 ChromiumBridge::paintTextField(painter.context(), |
| 582 themeData.m_part, | 619 themeData.m_part, |
| 583 themeData.m_state, | 620 themeData.m_state, |
| 584 themeData.m_classicState, | 621 themeData.m_classicState, |
| 585 helper.rect(), | 622 painter.drawRect(), |
| 586 o->style()->backgroundColor(), | 623 o->style()->backgroundColor(), |
| 587 true, | 624 true, |
| 588 drawEdges); | 625 drawEdges); |
| 589 return false; | 626 return false; |
| 590 } | 627 } |
| 591 | 628 |
| 592 int RenderThemeChromiumWin::menuListInternalPadding(RenderStyle* style, int padd
ingType) const | 629 int RenderThemeChromiumWin::menuListInternalPadding(RenderStyle* style, int padd
ingType) const |
| 593 { | 630 { |
| 594 // This internal padding is in addition to the user-supplied padding. | 631 // This internal padding is in addition to the user-supplied padding. |
| 595 // Matches the FF behavior. | 632 // Matches the FF behavior. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 610 // static | 647 // static |
| 611 void RenderThemeChromiumWin::setFindInPageMode(bool enable) { | 648 void RenderThemeChromiumWin::setFindInPageMode(bool enable) { |
| 612 if (m_findInPageMode == enable) | 649 if (m_findInPageMode == enable) |
| 613 return; | 650 return; |
| 614 | 651 |
| 615 m_findInPageMode = enable; | 652 m_findInPageMode = enable; |
| 616 theme()->platformColorsDidChange(); | 653 theme()->platformColorsDidChange(); |
| 617 } | 654 } |
| 618 | 655 |
| 619 } // namespace WebCore | 656 } // namespace WebCore |
| OLD | NEW |