Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Unified Diff: compositor/gl/opengl_visitor.cc

Issue 6793005: Add the xrender backend to the window manager. (Closed) Base URL: ssh://gitrw.chromium.org:9222/window_manager.git@master
Patch Set: Address fourth round of comments. Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « compositor/gl/opengl_visitor.h ('k') | compositor/gles/opengles_visitor.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « compositor/gl/opengl_visitor.h ('k') | compositor/gles/opengles_visitor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698