Index: chrome/browser/speech/speech_input_bubble.cc |
diff --git a/chrome/browser/speech/speech_input_bubble.cc b/chrome/browser/speech/speech_input_bubble.cc |
index 59cfd457908065bb9161891ebde4de70f2e348bb..111eaef90d84d321a47f39635d0a0f3c50ceb3fc 100644 |
--- a/chrome/browser/speech/speech_input_bubble.cc |
+++ b/chrome/browser/speech/speech_input_bubble.cc |
@@ -11,9 +11,10 @@ |
#include "ui/gfx/rect.h" |
SpeechInputBubble::FactoryMethod SpeechInputBubble::factory_ = NULL; |
-const int SpeechInputBubble::kBubbleTargetOffsetX = 5; |
+const int SpeechInputBubble::kBubbleTargetOffsetX = 10; |
SkBitmap* SpeechInputBubbleBase::mic_empty_ = NULL; |
+SkBitmap* SpeechInputBubbleBase::mic_noise_ = NULL; |
SkBitmap* SpeechInputBubbleBase::mic_full_ = NULL; |
SkBitmap* SpeechInputBubbleBase::mic_mask_ = NULL; |
SkBitmap* SpeechInputBubbleBase::spinner_ = NULL; |
@@ -39,6 +40,8 @@ SpeechInputBubbleBase::SpeechInputBubbleBase(TabContents* tab_contents) |
if (!mic_empty_) { // Static variables. |
mic_empty_ = ResourceBundle::GetSharedInstance().GetBitmapNamed( |
IDR_SPEECH_INPUT_MIC_EMPTY); |
+ mic_noise_ = ResourceBundle::GetSharedInstance().GetBitmapNamed( |
+ IDR_SPEECH_INPUT_MIC_NOISE); |
mic_full_ = ResourceBundle::GetSharedInstance().GetBitmapNamed( |
IDR_SPEECH_INPUT_MIC_FULL); |
mic_mask_ = ResourceBundle::GetSharedInstance().GetBitmapNamed( |
@@ -93,14 +96,9 @@ void SpeechInputBubbleBase::SetRecordingMode() { |
void SpeechInputBubbleBase::SetRecognizingMode() { |
display_mode_ = DISPLAY_MODE_RECOGNIZING; |
- UpdateLayout(); |
- |
animation_step_ = 0; |
- MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- task_factory_.NewRunnableMethod( |
- &SpeechInputBubbleBase::DoRecognizingAnimationStep), |
- kRecognizingAnimationStepMs); |
+ DoRecognizingAnimationStep(); |
+ UpdateLayout(); |
} |
void SpeechInputBubbleBase::DoRecognizingAnimationStep() { |
@@ -121,31 +119,39 @@ void SpeechInputBubbleBase::SetMessage(const string16& text) { |
UpdateLayout(); |
} |
-void SpeechInputBubbleBase::SetInputVolume(float volume) { |
- mic_image_->eraseARGB(0, 0, 0, 0); |
+void SpeechInputBubbleBase::DrawVolumeOverlay(SkCanvas* canvas, |
+ const SkBitmap& bitmap, |
+ float volume) { |
buffer_image_->eraseARGB(0, 0, 0, 0); |
int width = mic_image_->width(); |
int height = mic_image_->height(); |
- SkCanvas canvas(*mic_image_); |
SkCanvas buffer_canvas(*buffer_image_); |
- // The 'full volume' mic image is drawn clipped to the current volume level, |
- // and a gradient mask is applied over it with the 'multiply' compositing |
- // operator to show soft edges at the top. |
buffer_canvas.save(); |
- SkScalar clip_top = ((1.0f - volume) * height * 3) / 2.0f - height / 2.0f; |
- buffer_canvas.clipRect(SkRect::MakeLTRB(0, clip_top, |
- SkIntToScalar(width), SkIntToScalar(height))); |
- buffer_canvas.drawBitmap(*mic_full_, 0, 0); |
+ const int kVolumeSteps = 12; |
+ SkScalar clip_right = |
+ (((1.0f - volume) * (width * (kVolumeSteps + 1))) - width) / kVolumeSteps; |
+ buffer_canvas.clipRect(SkRect::MakeLTRB(0, 0, |
+ SkIntToScalar(width) - clip_right, SkIntToScalar(height))); |
+ buffer_canvas.drawBitmap(bitmap, 0, 0); |
buffer_canvas.restore(); |
SkPaint multiply_paint; |
multiply_paint.setXfermode(SkXfermode::Create(SkXfermode::kMultiply_Mode)); |
- buffer_canvas.drawBitmap(*mic_mask_, 0, clip_top, &multiply_paint); |
+ buffer_canvas.drawBitmap(*mic_mask_, -clip_right, 0, &multiply_paint); |
+ |
+ canvas->drawBitmap(*buffer_image_.get(), 0, 0); |
+} |
+ |
+void SpeechInputBubbleBase::SetInputVolume(float volume, float noise_volume) { |
+ mic_image_->eraseARGB(0, 0, 0, 0); |
+ SkCanvas canvas(*mic_image_); |
- // Draw the empty volume image first and the current volume image on top. |
+ // Draw the empty volume image first and the current volume image on top, |
+ // and then the noise volume image on top of both. |
canvas.drawBitmap(*mic_empty_, 0, 0); |
- canvas.drawBitmap(*buffer_image_.get(), 0, 0); |
+ DrawVolumeOverlay(&canvas, *mic_full_, volume); |
+ DrawVolumeOverlay(&canvas, *mic_noise_, noise_volume); |
SetImage(*mic_image_.get()); |
} |