/* * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.webkit.graphics; import java.lang.annotation.Native; import java.util.HashMap; import java.util.Map; final class RenderMediaControls { /** * Media control part constants (types for the paintControl method) */ @Native private static final int PLAY_BUTTON = 1; @Native private static final int PAUSE_BUTTON = 2; @Native private static final int DISABLED_PLAY_BUTTON = 3; @Native private static final int MUTE_BUTTON = 4; @Native private static final int UNMUTE_BUTTON = 5; @Native private static final int DISABLED_MUTE_BUTTON = 6; //@Native private static final int FULLSCREEN_BUTTON = 7; // background for control panel (except buttons) //@Native private static final int BACKGROUND = 8; // Time slider track is rendered by paintTimeSliderTrack @Native private static final int TIME_SLIDER_TRACK = 9; @Native private static final int TIME_SLIDER_THUMB = 10; @Native private static final int VOLUME_CONTAINER = 11; // Volume slider track is rendered by paintVolumeTrack @Native private static final int VOLUME_TRACK = 12; @Native private static final int VOLUME_THUMB = 13; //private static final int CURRENT_TIME = 14; //private static final int REMAINING_TIME = 15; private static String getControlName(int control) { switch (control) { case PLAY_BUTTON: return "PLAY_BUTTON"; case PAUSE_BUTTON: return "PAUSE_BUTTON"; case DISABLED_PLAY_BUTTON: return "DISABLED_PLAY_BUTTON"; case MUTE_BUTTON: return "MUTE_BUTTON"; case UNMUTE_BUTTON: return "UNMUTE_BUTTON"; case DISABLED_MUTE_BUTTON: return "DISABLED_MUTE_BUTTON"; //case FULLSCREEN_BUTTON: return "FULLSCREEN_BUTTON"; //case BACKGROUND: return "BACKGROUND"; case TIME_SLIDER_TRACK: return "TIME_SLIDER_TRACK"; case TIME_SLIDER_THUMB: return "TIME_SLIDER_THUMB"; case VOLUME_CONTAINER: return "VOLUME_CONTAINER"; case VOLUME_TRACK: return "VOLUME_TRACK"; case VOLUME_THUMB: return "VOLUME_THUMB"; //case CURRENT_TIME: return "CURRENT_TIME"; //case REMAINING_TIME: return "REMAINING_TIME"; } return "{UNKNOWN CONTROL " + control + "}"; } private RenderMediaControls() {} // disable instantiations static void paintControl(WCGraphicsContext gc, int type, int x, int y, int w, int h) { if (log) { log("paintControl, type=" + type + "(" + getControlName(type) + ")" + ", x=" + x + ", y=" + y + ", w=" + w + ", h=" + h); } switch (type) { case PLAY_BUTTON: paintControlImage("mediaPlay", gc, x, y, w, h); break; case PAUSE_BUTTON: paintControlImage("mediaPause", gc, x, y, w, h); break; case DISABLED_PLAY_BUTTON: paintControlImage("mediaPlayDisabled", gc, x, y, w, h); break; case MUTE_BUTTON: paintControlImage("mediaMute", gc, x, y, w, h); break; case UNMUTE_BUTTON: paintControlImage("mediaUnmute", gc, x, y, w, h); break; case DISABLED_MUTE_BUTTON: paintControlImage("mediaMuteDisabled", gc, x, y, w, h); break; case TIME_SLIDER_THUMB: paintControlImage("mediaTimeThumb", gc, x, y, w, h); break; case VOLUME_CONTAINER: break; case VOLUME_THUMB: paintControlImage("mediaVolumeThumb", gc, x, y, w, h); break; default: if (log) log("ERROR: paintControl, unknown type: " + type); break; } } private static final int TimeSliderTrackUnbufferedColor = rgba(0xec, 0x87, 0x7d); private static final int TimeSliderTrackBufferedColor = rgba(0xf9, 0x1a, 0x02); private static final int TimeSliderTrackThickness = 3; static void paintTimeSliderTrack(WCGraphicsContext gc, float duration, float curTime, float[] bufferedPairs, int x, int y, int w, int h) { if (log) { String bufStr = "{"; for (int i=0; i0) { bufStr += ", "; } bufStr += "[" + bufferedPairs[i] + "-" + bufferedPairs[i+1]+"]"; } bufStr +="}"; log("paintTimeSliderTrack, duration=" + duration + ", curTime=" + curTime + ", buffered=" + bufStr + ", x=" + x + ", y=" + y + ", w=" + w + ", h=" + h); } // make the track height TimeSliderTrackThickness pixels y += (h - TimeSliderTrackThickness)/2; h = TimeSliderTrackThickness; // descrease width by width of the thumb (increasing x by half of the value) int thumbWidth = (fwkGetSliderThumbSize(SLIDER_TYPE_TIME) >> 16) & 0xFFFF; w -= thumbWidth; x += thumbWidth/2; if (duration < 0) { // the media is not available } else { float timeToPixel = (1f / duration) * w; float start = 0f; for (int i=0; i controlImages = new HashMap(); private static WCImage getControlImage(String resName) { WCImage image = controlImages.get(resName); if (image == null) { WCImageDecoder decoder = WCGraphicsManager.getGraphicsManager().getImageDecoder(); decoder.loadFromResource(resName); WCImageFrame frame = decoder.getFrame(0, null); if (frame != null) { image = frame.getFrame(); controlImages.put(resName, image); } } return image; } private static void paintControlImage(String resName, WCGraphicsContext gc, int x, int y, int w, int h) { WCImage image = getControlImage(resName); if (image != null) { // don't stretch the image, just center it x += (w - image.getWidth()) / 2; w = image.getWidth(); y += (h - image.getHeight()) / 2; h = image.getHeight(); gc.drawImage(image, x, y, w, h, 0f, 0f, image.getWidth(), image.getHeight()); } else { if (log) log(" paintControlImage(" + resName + "), image is NULL"); } } private static int rgba(int r, int g, int b, int a) { return ((a & 0xFF) << 24) |((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF); } private static int rgba(int r, int g, int b) { return rgba(r, g, b, 0xFF); } private final static boolean log = false; private static void log(String s) { System.out.println(s); System.out.flush(); } }