blob: 76e0984f9ae0b3b818a172d8acfb81ee4773075f [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "examples/ganesh_app/ganesh_view.h"
#include "base/logging.h"
#include "mojo/skia/ganesh_surface.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
namespace examples {
namespace {
mojo::Size ToSize(const mojo::Rect& rect) {
mojo::Size size;
size.width = rect.width;
size.height = rect.height;
return size;
}
} // namespace
GaneshView::GaneshView(mojo::Shell* shell, mojo::View* view)
: view_(view),
gl_context_(mojo::GLContext::Create(shell)),
gr_context_(gl_context_),
texture_uploader_(this, shell, gl_context_) {
view_->AddObserver(this);
Draw(ToSize(view_->bounds()));
}
GaneshView::~GaneshView() {
if (gl_context_)
gl_context_->Destroy();
}
void GaneshView::OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) {
view_->SetSurfaceId(surface_id.Pass());
}
void GaneshView::OnViewDestroyed(mojo::View* view) {
DCHECK(view == view_);
view_->RemoveObserver(this);
delete this;
}
void GaneshView::OnViewInputEvent(mojo::View* view,
const mojo::EventPtr& event) {
Draw(ToSize(view_->bounds()));
}
void GaneshView::OnViewBoundsChanged(mojo::View* view,
const mojo::Rect& old_bounds,
const mojo::Rect& new_bounds) {
Draw(ToSize(new_bounds));
}
void GaneshView::Draw(const mojo::Size& size) {
mojo::GaneshContext::Scope scope(&gr_context_);
mojo::GaneshSurface surface(
&gr_context_, make_scoped_ptr(new mojo::GLTexture(gl_context_, size)));
SkCanvas* canvas = surface.canvas();
canvas->clear(SK_ColorCYAN);
SkPaint paint;
paint.setColor(SK_ColorGREEN);
SkRect rect = SkRect::MakeWH(size.width, size.height);
rect.inset(10, 10);
canvas->drawRect(rect, paint);
paint.setColor(SK_ColorRED);
paint.setFlags(SkPaint::kAntiAlias_Flag);
canvas->drawCircle(50, 100, 100, paint);
canvas->flush();
texture_uploader_.Upload(surface.TakeTexture());
}
} // namespace examples