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