| Index: compositor/gl/opengl_visitor.cc
 | 
| diff --git a/compositor/gl/opengl_visitor.cc b/compositor/gl/opengl_visitor.cc
 | 
| index 1f903f048f154fbf8970ebcb0ce559755d4b6b9f..c7d3154c6fe9bc2070f93282abf257c9d9ae3149 100644
 | 
| --- a/compositor/gl/opengl_visitor.cc
 | 
| +++ b/compositor/gl/opengl_visitor.cc
 | 
| @@ -396,10 +396,10 @@ OpenGlDrawVisitor::~OpenGlDrawVisitor() {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void OpenGlDrawVisitor::BindImage(const ImageContainer* container,
 | 
| +void OpenGlDrawVisitor::BindImage(const ImageContainer& container,
 | 
|                                    RealCompositor::ImageActor* actor) {
 | 
|    GLenum pixel_data_format = 0;
 | 
| -  switch (container->format()) {
 | 
| +  switch (container.format()) {
 | 
|      case IMAGE_FORMAT_RGBA_32:  // fallthrough
 | 
|      case IMAGE_FORMAT_RGBX_32:
 | 
|        pixel_data_format = GL_RGBA;
 | 
| @@ -410,7 +410,7 @@ void OpenGlDrawVisitor::BindImage(const ImageContainer* container,
 | 
|        break;
 | 
|      default:
 | 
|        NOTREACHED() << "Unhandled image container data format "
 | 
| -                   << container->format();
 | 
| +                   << container.format();
 | 
|    }
 | 
|  
 | 
|    // Create an OpenGL texture with the loaded image data.
 | 
| @@ -432,153 +432,16 @@ void OpenGlDrawVisitor::BindImage(const ImageContainer* container,
 | 
|                                 GL_TEXTURE_WRAP_T,
 | 
|                                 GL_CLAMP_TO_EDGE);
 | 
|    gl_interface_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
 | 
| -                            container->width(), container->height(),
 | 
| +                            container.width(), container.height(),
 | 
|                              0, pixel_data_format, GL_UNSIGNED_BYTE,
 | 
| -                            container->data());
 | 
| +                            container.data());
 | 
|    CHECK_GL_ERROR(gl_interface_);
 | 
|    scoped_ptr<OpenGlTextureData> data(new OpenGlTextureData(gl_interface_));
 | 
|    data->SetTexture(new_texture);
 | 
| -  data->set_has_alpha(ImageFormatUsesAlpha(container->format()));
 | 
| +  data->set_has_alpha(ImageFormatUsesAlpha(container.format()));
 | 
|    actor->set_texture_data(data.release());
 | 
|  }
 | 
|  
 | 
| -void OpenGlDrawVisitor::VisitImage(RealCompositor::ImageActor* actor) {
 | 
| -  if (!actor->IsVisible())
 | 
| -    return;
 | 
| -
 | 
| -  PROFILER_MARKER_BEGIN(VisitImage);
 | 
| -
 | 
| -  // All ImageActors are also QuadActors, and so we let the
 | 
| -  // QuadActor do all the actual drawing.
 | 
| -  VisitQuad(actor);
 | 
| -  PROFILER_MARKER_END(VisitImage);
 | 
| -}
 | 
| -
 | 
| -void OpenGlDrawVisitor::VisitTexturePixmap(
 | 
| -    RealCompositor::TexturePixmapActor* actor) {
 | 
| -  if (!actor->IsVisible())
 | 
| -    return;
 | 
| -
 | 
| -  PROFILER_MARKER_BEGIN(VisitTexturePixmap);
 | 
| -
 | 
| -  // Make sure there's a bound texture.
 | 
| -  if (!actor->texture_data()) {
 | 
| -    if (!actor->pixmap()) {
 | 
| -      PROFILER_MARKER_END(VisitTexturePixmap);
 | 
| -      return;
 | 
| -    }
 | 
| -
 | 
| -    scoped_ptr<OpenGlPixmapData> data(new OpenGlPixmapData(this));
 | 
| -    if (!data->Init(actor)) {
 | 
| -      PROFILER_MARKER_END(VisitTexturePixmap);
 | 
| -      return;
 | 
| -    }
 | 
| -    data->set_has_alpha(!actor->pixmap_is_opaque());
 | 
| -    actor->set_texture_data(data.release());
 | 
| -  }
 | 
| -
 | 
| -  // All texture pixmaps are also QuadActors, and so we let the
 | 
| -  // QuadActor do all the actual drawing.
 | 
| -  VisitQuad(actor);
 | 
| -  PROFILER_MARKER_END(VisitTexturePixmap);
 | 
| -}
 | 
| -
 | 
| -void OpenGlDrawVisitor::VisitQuad(RealCompositor::QuadActor* actor) {
 | 
| -  if (!actor->IsVisible())
 | 
| -    return;
 | 
| -
 | 
| -#ifdef EXTRA_LOGGING
 | 
| -  DLOG(INFO) << "Drawing quad " << actor->name() << ".";
 | 
| -#endif
 | 
| -  PROFILER_DYNAMIC_MARKER_BEGIN(actor->name().c_str());
 | 
| -
 | 
| -  // Calculate the vertex colors, taking into account the actor color,
 | 
| -  // opacity and the dimming gradient.
 | 
| -  float actor_opacity = actor->is_opaque() ? 1.0f :
 | 
| -                        actor->opacity() * ancestor_opacity_;
 | 
| -  float dimmed_transparency_begin = 1.f - actor->dimmed_opacity_begin();
 | 
| -  float dimmed_transparency_end = 1.f - actor->dimmed_opacity_end();
 | 
| -  float red = actor->color().red;
 | 
| -  float green = actor->color().green;
 | 
| -  float blue = actor->color().blue;
 | 
| -  DCHECK_LE(actor_opacity, 1.f);
 | 
| -  DCHECK_GE(actor_opacity, 0.f);
 | 
| -  DCHECK_LE(dimmed_transparency_begin, 1.f);
 | 
| -  DCHECK_GE(dimmed_transparency_begin, 0.f);
 | 
| -  DCHECK_LE(dimmed_transparency_end, 1.f);
 | 
| -  DCHECK_GE(dimmed_transparency_end, 0.f);
 | 
| -  DCHECK_LE(red, 1.f);
 | 
| -  DCHECK_GE(red, 0.f);
 | 
| -  DCHECK_LE(green, 1.f);
 | 
| -  DCHECK_GE(green, 0.f);
 | 
| -  DCHECK_LE(blue, 1.f);
 | 
| -  DCHECK_GE(blue, 0.f);
 | 
| -
 | 
| -  if (state_cache_.ColorStateChanged(actor_opacity,
 | 
| -                                     dimmed_transparency_begin,
 | 
| -                                     dimmed_transparency_end,
 | 
| -                                     red, green, blue)) {
 | 
| -    // Scale the vertex colors on the right by the transparency, since
 | 
| -    // we want it to fade to black as transparency of the dimming
 | 
| -    // overlay goes to zero. (note that the dimming is not *really* an
 | 
| -    // overlay -- it's just multiplied in here to simulate that).
 | 
| -    float dim_red_begin = red * dimmed_transparency_begin;
 | 
| -    float dim_green_begin = green * dimmed_transparency_begin;
 | 
| -    float dim_blue_begin = blue * dimmed_transparency_begin;
 | 
| -    float dim_red_end = red * dimmed_transparency_end;
 | 
| -    float dim_green_end = green * dimmed_transparency_end;
 | 
| -    float dim_blue_end = blue * dimmed_transparency_end;
 | 
| -
 | 
| -    quad_drawing_data_->set_vertex_color(
 | 
| -        0, dim_red_begin, dim_green_begin, dim_blue_begin, actor_opacity);
 | 
| -    quad_drawing_data_->set_vertex_color(
 | 
| -        1, dim_red_begin, dim_green_begin, dim_blue_begin, actor_opacity);
 | 
| -    quad_drawing_data_->set_vertex_color(
 | 
| -        2, dim_red_end, dim_green_end, dim_blue_end, actor_opacity);
 | 
| -    quad_drawing_data_->set_vertex_color(
 | 
| -        3, dim_red_end, dim_green_end, dim_blue_end, actor_opacity);
 | 
| -
 | 
| -    gl_interface_->EnableClientState(GL_COLOR_ARRAY);
 | 
| -    // Have to un-bind the array buffer to set the color pointer so that
 | 
| -    // it uses the color buffer instead of the vertex buffer memory.
 | 
| -    gl_interface_->BindBuffer(GL_ARRAY_BUFFER, 0);
 | 
| -    gl_interface_->ColorPointer(4, GL_FLOAT, 0,
 | 
| -                                quad_drawing_data_->color_buffer());
 | 
| -  }
 | 
| -
 | 
| -  gl_interface_->BindBuffer(GL_ARRAY_BUFFER,
 | 
| -                            quad_drawing_data_->vertex_buffer());
 | 
| -  CHECK_GL_ERROR(gl_interface_);
 | 
| -
 | 
| -  // Find out if this quad has pixmap or texture data to bind.
 | 
| -  if (actor->texture_data()) {
 | 
| -    // Actor has a texture to bind.
 | 
| -    gl_interface_->Enable(GL_TEXTURE_2D);
 | 
| -    gl_interface_->BindTexture(GL_TEXTURE_2D,
 | 
| -                               actor->texture_data()->texture());
 | 
| -  } else {
 | 
| -    // Actor has no texture.
 | 
| -    gl_interface_->Disable(GL_TEXTURE_2D);
 | 
| -  }
 | 
| -
 | 
| -#ifdef EXTRA_LOGGING
 | 
| -  DLOG(INFO) << "  at: (" << actor->x() << ", "  << actor->y()
 | 
| -             << ", " << actor->z() << ") with scale: ("
 | 
| -             << actor->scale_x() << ", "  << actor->scale_y() << ") at size ("
 | 
| -             << actor->width() << "x"  << actor->height()
 | 
| -             << ") and opacity " << actor_opacity;
 | 
| -#endif
 | 
| -
 | 
| -  gl_interface_->PushMatrix();
 | 
| -  // operator[] in Matrix4 returns by value in const version.
 | 
| -  Matrix4 model_view = actor->model_view();
 | 
| -  gl_interface_->LoadMatrixf(&model_view[0][0]);
 | 
| -  gl_interface_->DrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 | 
| -  gl_interface_->PopMatrix();
 | 
| -  CHECK_GL_ERROR(gl_interface_);
 | 
| -  PROFILER_DYNAMIC_MARKER_END();
 | 
| -}
 | 
| -
 | 
|  void OpenGlDrawVisitor::DrawNeedle() {
 | 
|    PROFILER_MARKER_BEGIN(DrawNeedle);
 | 
|    gl_interface_->BindBuffer(GL_ARRAY_BUFFER,
 | 
| @@ -731,4 +594,141 @@ void OpenGlDrawVisitor::VisitContainer(RealCompositor::ContainerActor* actor) {
 | 
|    ancestor_opacity_ = original_opacity;
 | 
|  }
 | 
|  
 | 
| +void OpenGlDrawVisitor::VisitImage(RealCompositor::ImageActor* actor) {
 | 
| +  if (!actor->IsVisible())
 | 
| +    return;
 | 
| +
 | 
| +  PROFILER_MARKER_BEGIN(VisitImage);
 | 
| +
 | 
| +  // All ImageActors are also QuadActors, and so we let the
 | 
| +  // QuadActor do all the actual drawing.
 | 
| +  VisitQuad(actor);
 | 
| +  PROFILER_MARKER_END(VisitImage);
 | 
| +}
 | 
| +
 | 
| +void OpenGlDrawVisitor::VisitTexturePixmap(
 | 
| +    RealCompositor::TexturePixmapActor* actor) {
 | 
| +  if (!actor->IsVisible())
 | 
| +    return;
 | 
| +
 | 
| +  PROFILER_MARKER_BEGIN(VisitTexturePixmap);
 | 
| +
 | 
| +  // Make sure there's a bound texture.
 | 
| +  if (!actor->texture_data()) {
 | 
| +    if (!actor->pixmap()) {
 | 
| +      PROFILER_MARKER_END(VisitTexturePixmap);
 | 
| +      return;
 | 
| +    }
 | 
| +
 | 
| +    scoped_ptr<OpenGlPixmapData> data(new OpenGlPixmapData(this));
 | 
| +    if (!data->Init(actor)) {
 | 
| +      PROFILER_MARKER_END(VisitTexturePixmap);
 | 
| +      return;
 | 
| +    }
 | 
| +    data->set_has_alpha(!actor->pixmap_is_opaque());
 | 
| +    actor->set_texture_data(data.release());
 | 
| +  }
 | 
| +
 | 
| +  // All texture pixmaps are also QuadActors, and so we let the
 | 
| +  // QuadActor do all the actual drawing.
 | 
| +  VisitQuad(actor);
 | 
| +  PROFILER_MARKER_END(VisitTexturePixmap);
 | 
| +}
 | 
| +
 | 
| +void OpenGlDrawVisitor::VisitQuad(RealCompositor::QuadActor* actor) {
 | 
| +  if (!actor->IsVisible())
 | 
| +    return;
 | 
| +
 | 
| +#ifdef EXTRA_LOGGING
 | 
| +  DLOG(INFO) << "Drawing quad " << actor->name() << ".";
 | 
| +#endif
 | 
| +  PROFILER_DYNAMIC_MARKER_BEGIN(actor->name().c_str());
 | 
| +
 | 
| +  // Calculate the vertex colors, taking into account the actor color,
 | 
| +  // opacity and the dimming gradient.
 | 
| +  float actor_opacity = actor->is_opaque() ? 1.0f :
 | 
| +                        actor->opacity() * ancestor_opacity_;
 | 
| +  float dimmed_transparency_begin = 1.f - actor->dimmed_opacity_begin();
 | 
| +  float dimmed_transparency_end = 1.f - actor->dimmed_opacity_end();
 | 
| +  float red = actor->color().red;
 | 
| +  float green = actor->color().green;
 | 
| +  float blue = actor->color().blue;
 | 
| +  DCHECK_LE(actor_opacity, 1.f);
 | 
| +  DCHECK_GE(actor_opacity, 0.f);
 | 
| +  DCHECK_LE(dimmed_transparency_begin, 1.f);
 | 
| +  DCHECK_GE(dimmed_transparency_begin, 0.f);
 | 
| +  DCHECK_LE(dimmed_transparency_end, 1.f);
 | 
| +  DCHECK_GE(dimmed_transparency_end, 0.f);
 | 
| +  DCHECK_LE(red, 1.f);
 | 
| +  DCHECK_GE(red, 0.f);
 | 
| +  DCHECK_LE(green, 1.f);
 | 
| +  DCHECK_GE(green, 0.f);
 | 
| +  DCHECK_LE(blue, 1.f);
 | 
| +  DCHECK_GE(blue, 0.f);
 | 
| +
 | 
| +  if (state_cache_.ColorStateChanged(actor_opacity,
 | 
| +                                     dimmed_transparency_begin,
 | 
| +                                     dimmed_transparency_end,
 | 
| +                                     red, green, blue)) {
 | 
| +    // Scale the vertex colors on the right by the transparency, since
 | 
| +    // we want it to fade to black as transparency of the dimming
 | 
| +    // overlay goes to zero. (note that the dimming is not *really* an
 | 
| +    // overlay -- it's just multiplied in here to simulate that).
 | 
| +    float dim_red_begin = red * dimmed_transparency_begin;
 | 
| +    float dim_green_begin = green * dimmed_transparency_begin;
 | 
| +    float dim_blue_begin = blue * dimmed_transparency_begin;
 | 
| +    float dim_red_end = red * dimmed_transparency_end;
 | 
| +    float dim_green_end = green * dimmed_transparency_end;
 | 
| +    float dim_blue_end = blue * dimmed_transparency_end;
 | 
| +
 | 
| +    quad_drawing_data_->set_vertex_color(
 | 
| +        0, dim_red_begin, dim_green_begin, dim_blue_begin, actor_opacity);
 | 
| +    quad_drawing_data_->set_vertex_color(
 | 
| +        1, dim_red_begin, dim_green_begin, dim_blue_begin, actor_opacity);
 | 
| +    quad_drawing_data_->set_vertex_color(
 | 
| +        2, dim_red_end, dim_green_end, dim_blue_end, actor_opacity);
 | 
| +    quad_drawing_data_->set_vertex_color(
 | 
| +        3, dim_red_end, dim_green_end, dim_blue_end, actor_opacity);
 | 
| +
 | 
| +    gl_interface_->EnableClientState(GL_COLOR_ARRAY);
 | 
| +    // Have to un-bind the array buffer to set the color pointer so that
 | 
| +    // it uses the color buffer instead of the vertex buffer memory.
 | 
| +    gl_interface_->BindBuffer(GL_ARRAY_BUFFER, 0);
 | 
| +    gl_interface_->ColorPointer(4, GL_FLOAT, 0,
 | 
| +                                quad_drawing_data_->color_buffer());
 | 
| +  }
 | 
| +
 | 
| +  gl_interface_->BindBuffer(GL_ARRAY_BUFFER,
 | 
| +                            quad_drawing_data_->vertex_buffer());
 | 
| +  CHECK_GL_ERROR(gl_interface_);
 | 
| +
 | 
| +  // Find out if this quad has pixmap or texture data to bind.
 | 
| +  if (actor->texture_data()) {
 | 
| +    // Actor has a texture to bind.
 | 
| +    gl_interface_->Enable(GL_TEXTURE_2D);
 | 
| +    gl_interface_->BindTexture(GL_TEXTURE_2D,
 | 
| +                               actor->texture_data()->texture());
 | 
| +  } else {
 | 
| +    // Actor has no texture.
 | 
| +    gl_interface_->Disable(GL_TEXTURE_2D);
 | 
| +  }
 | 
| +
 | 
| +#ifdef EXTRA_LOGGING
 | 
| +  DLOG(INFO) << "  at: (" << actor->x() << ", "  << actor->y()
 | 
| +             << ", " << actor->z() << ") with scale: ("
 | 
| +             << actor->scale_x() << ", "  << actor->scale_y() << ") at size ("
 | 
| +             << actor->width() << "x"  << actor->height()
 | 
| +             << ") and opacity " << actor_opacity;
 | 
| +#endif
 | 
| +
 | 
| +  gl_interface_->PushMatrix();
 | 
| +  // operator[] in Matrix4 returns by value in const version.
 | 
| +  Matrix4 model_view = actor->model_view();
 | 
| +  gl_interface_->LoadMatrixf(&model_view[0][0]);
 | 
| +  gl_interface_->DrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 | 
| +  gl_interface_->PopMatrix();
 | 
| +  CHECK_GL_ERROR(gl_interface_);
 | 
| +  PROFILER_DYNAMIC_MARKER_END();
 | 
| +}
 | 
| +
 | 
|  }  // namespace window_manager
 | 
| 
 |