17f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard/* 27f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * Copyright 2010, The Android Open Source Project 37f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * 47f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * Redistribution and use in source and binary forms, with or without 57f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * modification, are permitted provided that the following conditions 67f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * are met: 77f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * * Redistributions of source code must retain the above copyright 87f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * notice, this list of conditions and the following disclaimer. 97f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * * Redistributions in binary form must reproduce the above copyright 107f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * notice, this list of conditions and the following disclaimer in the 117f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * documentation and/or other materials provided with the distribution. 127f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * 137f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 147f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 157f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 167f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 177f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 187f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 197f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 207f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 217f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 227f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 237f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 247f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard */ 257f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 267f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#define LOG_TAG "WebCore" 277f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 287f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "config.h" 293718b58e4da76b7025aa5316a51264c5e38f2569John Reck#include "RenderSkinMediaButton.h" 303718b58e4da76b7025aa5316a51264c5e38f2569John Reck 317f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "Document.h" 327f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "IntRect.h" 337f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "Node.h" 349d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins#include "RenderObject.h" 353718b58e4da76b7025aa5316a51264c5e38f2569John Reck#include "RenderSkinAndroid.h" 369d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins#include "RenderSlider.h" 377f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "SkCanvas.h" 387f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "SkNinePatch.h" 397f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include "SkRect.h" 40a54eb7fa1e850d7096f97065f35ed00bcb5384d3Mathias Agopian#include <androidfw/AssetManager.h> 417f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include <utils/Debug.h> 427f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard#include <utils/Log.h> 4379768700a853c40c66ff0b0591957958667fdd9eSteve Block#include <wtf/text/CString.h> 447f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 45ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdochextern android::AssetManager* globalAssetManager(); 46ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch 477f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roardstruct PatchData { 487f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard const char* name; 497f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard int8_t outset, margin; 507f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard}; 517f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 527f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roardstatic const PatchData gFiles[] = 537f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { 549d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins { "scrubber_primary_holo.9.png", 0, 0 }, // SLIDER_TRACK, left of the SLIDER_THUMB 557f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { "ic_media_pause.png", 0, 0}, // PAUSE 567f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { "ic_media_play.png", 0, 0 }, // PLAY 577f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { "ic_media_pause.png", 0, 0 }, // MUTE 587f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { "ic_media_rew.png", 0, 0 }, // REWIND 597f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { "ic_media_ff.png", 0, 0 }, // FORWARD 60833c9ceaa300f52cf2d1b12a9b3482ad417a3c21Nicolas Roard { "ic_media_fullscreen.png", 0, 0 }, // FULLSCREEN 61de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu { "spinner_76_outer_holo.png", 0, 0 }, // SPINNER_OUTER 62de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu { "spinner_76_inner_holo.png", 0, 0 }, // SPINNER_INNER 63de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu { "ic_media_video_poster.png", 0, 0 }, // VIDEO 647f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { "btn_media_player_disabled.9.png", 0, 0 }, // BACKGROUND_SLIDER 655de943634277e6efbe111dbea829454fe497a278Leon Scroggins { "scrubber_track_holo_dark.9.png", 0, 0 }, // SLIDER_TRACK 669062292ef8421fc64437c478064f2ba21515ddc8Teng-Hui Zhu { "scrubber_control_normal_holo.png", 0, 0 } // SLIDER_THUMB 677f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard }; 687f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 697f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roardstatic SkBitmap gButton[sizeof(gFiles)/sizeof(gFiles[0])]; 707f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roardstatic bool gDecoded; 71ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdochstatic bool gDecodingFailed; 727f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 737f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roardnamespace WebCore { 747f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 75ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdochvoid RenderSkinMediaButton::Decode() 767f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{ 77ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch String drawableDirectory = RenderSkinAndroid::DrawableDirectory(); 787f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 797f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard gDecoded = true; 80ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch gDecodingFailed = false; 81ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch android::AssetManager* am = globalAssetManager(); 827f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard for (size_t i = 0; i < sizeof(gFiles)/sizeof(gFiles[0]); i++) { 837f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard String path = drawableDirectory + gFiles[i].name; 847f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard if (!RenderSkinAndroid::DecodeBitmap(am, path.utf8().data(), &gButton[i])) { 85ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch gDecodingFailed = true; 86a09e7cf49f43950a799f936bf42a9912d696547bSteve Block ALOGD("RenderSkinButton::Init: button assets failed to decode\n\tBrowser buttons will not draw"); 877f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard break; 887f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 897f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 907f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard} 917f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 923718b58e4da76b7025aa5316a51264c5e38f2569John Reckvoid RenderSkinMediaButton::Draw(SkCanvas* canvas, const IntRect& r, 933718b58e4da76b7025aa5316a51264c5e38f2569John Reck MediaButton buttonType, bool translucent, 943718b58e4da76b7025aa5316a51264c5e38f2569John Reck bool drawBackground, const IntRect& thumb) 957f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard{ 96ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch if (!gDecoded) { 97ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch Decode(); 98ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch } 99ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch 10064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard if (!canvas) 10164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard return; 10264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard 1037f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard // If we failed to decode, do nothing. This way the browser still works, 1047f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard // and webkit will still draw the label and layout space for us. 105ce03c1c1203621e552d41a8b3831837636f364a9Ben Murdoch if (gDecodingFailed) 1067f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard return; 1077f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 1085de943634277e6efbe111dbea829454fe497a278Leon Scroggins bool drawsNinePatch = false; 1097f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard bool drawsImage = true; 1107f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 1117f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard int ninePatchIndex = 0; 1127f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard int imageIndex = 0; 1137f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 1147f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard SkRect bounds(r); 1157f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard SkScalar imageMargin = 8; 1167f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard SkPaint paint; 117c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard 118c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard int alpha = 255; 119c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard if (translucent) 120c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard alpha = 190; 121c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard 122c7eaa372f2a1bece832b0efe7ffed793c8c742c4Nicolas Roard SkColor backgroundColor = SkColorSetARGB(alpha, 34, 34, 34); 1237f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard SkColor trackBackgroundColor = SkColorSetARGB(255, 100, 100, 100); 124ee677f6fd67ba73ab199614a8feb02d41544b3caLeon Scroggins paint.setColor(backgroundColor); 1254754f7630fe9e26150d5ed2cfb4f231c57539c02Leon Scroggins paint.setFlags(SkPaint::kFilterBitmap_Flag); 1267f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 1277f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard switch (buttonType) { 1287f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard case PAUSE: 1297f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard case PLAY: 1307f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard case MUTE: 1317f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard case REWIND: 1327f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard case FORWARD: 133833c9ceaa300f52cf2d1b12a9b3482ad417a3c21Nicolas Roard case FULLSCREEN: 1347f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { 1357f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard imageIndex = buttonType + 1; 1367f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard paint.setColor(backgroundColor); 1377f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard break; 1387f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 139de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu case SPINNER_OUTER: 140de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu case SPINNER_INNER: 141de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu case VIDEO: 142de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu { 143de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu imageIndex = buttonType + 1; 144de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu break; 145de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu } 1467f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard case BACKGROUND_SLIDER: 1477f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { 1487f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard drawsImage = false; 1497f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard break; 1507f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 1517f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard case SLIDER_TRACK: 1527f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { 1535de943634277e6efbe111dbea829454fe497a278Leon Scroggins drawsNinePatch = true; 1547f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard drawsImage = false; 1555de943634277e6efbe111dbea829454fe497a278Leon Scroggins ninePatchIndex = buttonType + 1; 1567f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard break; 1577f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 1587f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard case SLIDER_THUMB: 1597f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard { 1605de943634277e6efbe111dbea829454fe497a278Leon Scroggins imageMargin = 0; 1615de943634277e6efbe111dbea829454fe497a278Leon Scroggins imageIndex = buttonType + 1; 1627f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard break; 1637f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 1647f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard default: 1655de943634277e6efbe111dbea829454fe497a278Leon Scroggins return; 1667f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 1677f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 168d649883ce629c0de432e075254b517a50685792eTeng-Hui Zhu if (drawBackground) { 1697f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard canvas->drawRect(r, paint); 1707f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 1717f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 1727f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard if (drawsNinePatch) { 1737f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard const PatchData& pd = gFiles[ninePatchIndex]; 1747f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard int marginValue = pd.margin + pd.outset; 1757f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 1767f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard SkIRect margin; 1777f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard margin.set(marginValue, marginValue, marginValue, marginValue); 1789d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins if (buttonType == SLIDER_TRACK) { 1799d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins // Cut the height in half (with some extra slop determined by trial 1809d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins // and error to get the placement just right. 1819d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins SkScalar quarterHeight = SkScalarHalf(SkScalarHalf(bounds.height())); 1829d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins bounds.fTop += quarterHeight + SkScalarHalf(3); 1839d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins bounds.fBottom += -quarterHeight + SK_ScalarHalf; 1843718b58e4da76b7025aa5316a51264c5e38f2569John Reck if (!thumb.isEmpty()) { 1859d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins // Inset the track by half the width of the thumb, so the track 1869d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins // does not appear to go beyond the space where the thumb can 1879d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins // be. 1889d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins SkScalar thumbHalfWidth = SkIntToScalar(thumb.width()/2); 1899d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins bounds.fLeft += thumbHalfWidth; 1909d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins bounds.fRight -= thumbHalfWidth; 1919d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins if (thumb.x() > 0) { 1929d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins // The video is past the starting point. Show the area to 1939d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins // left of the thumb as having been played. 1949d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins SkScalar alreadyPlayed = SkIntToScalar(thumb.center().x() + r.x()); 1959d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins SkRect playedRect(bounds); 1969d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins playedRect.fRight = alreadyPlayed; 1979d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins SkNinePatch::DrawNine(canvas, playedRect, gButton[0], margin); 1989d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins bounds.fLeft = alreadyPlayed; 1999d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins } 2009d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins 2019d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins } 2029d867bf3af621a847929fdc13e4c36ffcaa580f2Leon Scroggins } 203ee677f6fd67ba73ab199614a8feb02d41544b3caLeon Scroggins SkNinePatch::DrawNine(canvas, bounds, gButton[ninePatchIndex], margin); 2047f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 2057f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 2067f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard if (drawsImage) { 2077f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard SkScalar SIZE = gButton[imageIndex].width(); 2087f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard SkScalar width = r.width(); 2097f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard SkScalar scale = SkScalarDiv(width - 2*imageMargin, SIZE); 2107f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard int saveScaleCount = canvas->save(); 2117f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard canvas->translate(bounds.fLeft + imageMargin, bounds.fTop + imageMargin); 2127f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard canvas->scale(scale, scale); 2137f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard canvas->drawBitmap(gButton[imageIndex], 0, 0, &paint); 2147f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard canvas->restoreToCount(saveScaleCount); 2157f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard } 2167f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard} 2177f493d591dfd3492d5916ca301a4dbcd61554a06Nicolas Roard 218de89b1aa0a100f46600ed48b6b3b57759c446447Teng-Hui Zhu} // WebCore 219