summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cc/blink/web_image_layer_impl.cc7
-rw-r--r--cc/blink/web_image_layer_impl.h1
-rw-r--r--cc/layers/picture_layer.cc13
-rw-r--r--cc/layers/picture_layer.h3
-rw-r--r--cc/layers/picture_layer_impl.cc25
-rw-r--r--cc/layers/picture_layer_impl.h4
-rw-r--r--cc/layers/tiled_layer_impl.cc3
-rw-r--r--cc/output/gl_renderer.cc6
-rw-r--r--cc/output/renderer_pixeltest.cc143
-rw-r--r--cc/output/software_renderer.cc7
-rw-r--r--cc/output/software_renderer_unittest.cc3
-rw-r--r--cc/quads/content_draw_quad_base.cc9
-rw-r--r--cc/quads/content_draw_quad_base.h7
-rw-r--r--cc/quads/draw_quad_unittest.cc41
-rw-r--r--cc/quads/picture_draw_quad.cc8
-rw-r--r--cc/quads/picture_draw_quad.h2
-rw-r--r--cc/quads/tile_draw_quad.cc12
-rw-r--r--cc/quads/tile_draw_quad.h6
-rw-r--r--cc/test/render_pass_test_common.cc3
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc1
-rw-r--r--content/common/cc_messages.h1
-rw-r--r--content/common/cc_messages_unittest.cc4
-rw-r--r--mojo/converters/surfaces/surfaces_type_converters.cc4
-rw-r--r--mojo/services/public/interfaces/surfaces/quads.mojom1
24 files changed, 258 insertions, 56 deletions
diff --git a/cc/blink/web_image_layer_impl.cc b/cc/blink/web_image_layer_impl.cc
index ee80ca6..afd551a 100644
--- a/cc/blink/web_image_layer_impl.cc
+++ b/cc/blink/web_image_layer_impl.cc
@@ -35,4 +35,11 @@ void WebImageLayerImpl::setImageBitmap(const SkBitmap& bitmap) {
}
}
+void WebImageLayerImpl::setNearestNeighbor(bool nearest_neighbor) {
+ if (WebLayerImpl::UsingPictureLayer()) {
+ static_cast<cc::PictureImageLayer*>(layer_->layer())
+ ->SetNearestNeighbor(nearest_neighbor);
+ }
+}
+
} // namespace cc_blink
diff --git a/cc/blink/web_image_layer_impl.h b/cc/blink/web_image_layer_impl.h
index e0591aa..48c31ea 100644
--- a/cc/blink/web_image_layer_impl.h
+++ b/cc/blink/web_image_layer_impl.h
@@ -22,6 +22,7 @@ class WebImageLayerImpl : public blink::WebImageLayer {
// blink::WebImageLayer implementation.
virtual blink::WebLayer* layer();
virtual void setImageBitmap(const SkBitmap& bitmap);
+ virtual void setNearestNeighbor(bool nearest_neighbor);
private:
scoped_ptr<WebLayerImpl> layer_;
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index 8a4fd67..48f3f73 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -24,7 +24,8 @@ PictureLayer::PictureLayer(ContentLayerClient* client)
instrumentation_object_tracker_(id()),
update_source_frame_number_(-1),
can_use_lcd_text_for_update_(true),
- is_mask_(false) {
+ is_mask_(false),
+ nearest_neighbor_(false) {
}
PictureLayer::PictureLayer(ContentLayerClient* client,
@@ -65,6 +66,8 @@ void PictureLayer::PushPropertiesTo(LayerImpl* base_layer) {
recording_source_->SetEmptyBounds();
}
+ layer_impl->SetNearestNeighbor(nearest_neighbor_);
+
scoped_refptr<RasterSource> raster_source =
recording_source_->CreateRasterSource();
raster_source->SetBackgoundColor(SafeOpaqueBackgroundColor());
@@ -205,6 +208,14 @@ void PictureLayer::ClearClient() {
UpdateDrawsContent(HasDrawableContent());
}
+void PictureLayer::SetNearestNeighbor(bool nearest_neighbor) {
+ if (nearest_neighbor_ == nearest_neighbor)
+ return;
+
+ nearest_neighbor_ = nearest_neighbor;
+ SetNeedsCommit();
+}
+
bool PictureLayer::HasDrawableContent() const {
return client_ && Layer::HasDrawableContent();
}
diff --git a/cc/layers/picture_layer.h b/cc/layers/picture_layer.h
index 04c5f8f..648d1c9 100644
--- a/cc/layers/picture_layer.h
+++ b/cc/layers/picture_layer.h
@@ -23,6 +23,8 @@ class CC_EXPORT PictureLayer : public Layer {
void ClearClient();
+ void SetNearestNeighbor(bool nearest_neighbor);
+
// Layer interface.
scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override;
void SetLayerTreeHost(LayerTreeHost* host) override;
@@ -69,6 +71,7 @@ class CC_EXPORT PictureLayer : public Layer {
int update_source_frame_number_;
bool can_use_lcd_text_for_update_;
bool is_mask_;
+ bool nearest_neighbor_;
DISALLOW_COPY_AND_ASSIGN(PictureLayer);
};
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index b8444de..392450a3 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -85,7 +85,8 @@ PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl,
needs_post_commit_initialization_(true),
should_update_tile_priorities_(false),
only_used_low_res_last_append_quads_(false),
- is_mask_(is_mask) {
+ is_mask_(is_mask),
+ nearest_neighbor_(false) {
layer_tree_impl()->RegisterPictureLayerImpl(this);
}
@@ -141,6 +142,8 @@ void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
twin_layer_ = layer_impl;
layer_impl->twin_layer_ = this;
+ layer_impl->SetNearestNeighbor(nearest_neighbor_);
+
// Solid color layers have no tilings.
DCHECK_IMPLIES(raster_source_->IsSolidColor(), tilings_->num_tilings() == 0);
// The pending tree should only have a high res (and possibly low res) tiling.
@@ -241,8 +244,9 @@ void PictureLayerImpl::AppendQuads(RenderPass* render_pass,
PictureDrawQuad* quad =
render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
quad->SetNew(shared_quad_state, geometry_rect, opaque_rect,
- visible_geometry_rect, texture_rect, texture_size, RGBA_8888,
- quad_content_rect, max_contents_scale, raster_source_);
+ visible_geometry_rect, texture_rect, texture_size,
+ nearest_neighbor_, RGBA_8888, quad_content_rect,
+ max_contents_scale, raster_source_);
return;
}
@@ -354,7 +358,8 @@ void PictureLayerImpl::AppendQuads(RenderPass* render_pass,
draw_info.get_resource_id(),
texture_rect,
iter.texture_size(),
- draw_info.contents_swizzled());
+ draw_info.contents_swizzled(),
+ nearest_neighbor_);
has_draw_quad = true;
break;
}
@@ -376,8 +381,8 @@ void PictureLayerImpl::AppendQuads(RenderPass* render_pass,
render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
quad->SetNew(shared_quad_state, geometry_rect, opaque_rect,
visible_geometry_rect, texture_rect, iter.texture_size(),
- format, iter->content_rect(), iter->contents_scale(),
- raster_source_);
+ nearest_neighbor_, format, iter->content_rect(),
+ iter->contents_scale(), raster_source_);
has_draw_quad = true;
break;
}
@@ -810,6 +815,14 @@ void PictureLayerImpl::GetContentsResourceId(
*resource_size = iter.texture_size();
}
+void PictureLayerImpl::SetNearestNeighbor(bool nearest_neighbor) {
+ if (nearest_neighbor_ == nearest_neighbor)
+ return;
+
+ nearest_neighbor_ = nearest_neighbor;
+ NoteLayerPropertyChanged();
+}
+
void PictureLayerImpl::DoPostCommitInitialization() {
// TODO(danakj): Remove this.
DCHECK(needs_post_commit_initialization_);
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h
index 0b94f41..f17743d 100644
--- a/cc/layers/picture_layer_impl.h
+++ b/cc/layers/picture_layer_impl.h
@@ -85,6 +85,8 @@ class CC_EXPORT PictureLayerImpl
void GetContentsResourceId(ResourceProvider::ResourceId* resource_id,
gfx::Size* resource_size) const override;
+ void SetNearestNeighbor(bool nearest_neighbor);
+
size_t GPUMemoryUsageInBytes() const override;
void RunMicroBenchmark(MicroBenchmarkImpl* benchmark) override;
@@ -173,6 +175,8 @@ class CC_EXPORT PictureLayerImpl
bool only_used_low_res_last_append_quads_;
const bool is_mask_;
+ bool nearest_neighbor_;
+
// Any draw properties derived from |transform|, |viewport|, and |clip|
// parameters in LayerTreeHostImpl::SetExternalDrawConstraints are not valid
// for prioritizing tiles during resourceless software draws. This is because
diff --git a/cc/layers/tiled_layer_impl.cc b/cc/layers/tiled_layer_impl.cc
index c66e124..a36c030 100644
--- a/cc/layers/tiled_layer_impl.cc
+++ b/cc/layers/tiled_layer_impl.cc
@@ -262,7 +262,8 @@ void TiledLayerImpl::AppendQuads(RenderPass* render_pass,
tile->resource_id(),
tex_coord_rect,
texture_size,
- tile->contents_swizzled());
+ tile->contents_swizzled(),
+ false);
}
}
}
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 13a98f6..ee94a4c 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -1626,7 +1626,8 @@ void GLRenderer::DrawContentQuadAA(const DrawingFrame* frame,
SetupQuadForAntialiasing(device_transform, quad, &local_quad, edge);
ResourceProvider::ScopedSamplerGL quad_resource_lock(
- resource_provider_, resource_id, GL_LINEAR);
+ resource_provider_, resource_id,
+ quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR);
SamplerType sampler =
SamplerTypeFromTextureTarget(quad_resource_lock.target());
@@ -1710,7 +1711,8 @@ void GLRenderer::DrawContentQuadNoAA(const DrawingFrame* frame,
bool scaled = (tex_to_geom_scale_x != 1.f || tex_to_geom_scale_y != 1.f);
GLenum filter =
- (scaled || !quad->quadTransform().IsIdentityOrIntegerTranslation())
+ (scaled || !quad->quadTransform().IsIdentityOrIntegerTranslation()) &&
+ !quad->nearest_neighbor
? GL_LINEAR
: GL_NEAREST;
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index 53b5b98..b51aef6 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -1725,6 +1725,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
gfx::Rect viewport(this->device_viewport_size_);
// TODO(enne): the renderer should figure this out on its own.
ResourceFormat texture_format = RGBA_8888;
+ bool nearest_neighbor = false;
RenderPassId id(1, 1);
gfx::Transform transform_to_root;
@@ -1761,8 +1762,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
blue_quad->SetNew(blue_shared_state,
viewport, // Intentionally bigger than clip.
gfx::Rect(), viewport, gfx::RectF(viewport),
- viewport.size(), texture_format, viewport, 1.f,
- blue_pile.get());
+ viewport.size(), nearest_neighbor, texture_format, viewport,
+ 1.f, blue_pile.get());
// One viewport-filling green quad.
scoped_refptr<FakePicturePileImpl> green_pile =
@@ -1780,7 +1781,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
green_quad->SetNew(green_shared_state, viewport, gfx::Rect(), viewport,
gfx::RectF(0.f, 0.f, 1.f, 1.f), viewport.size(),
- texture_format, viewport, 1.f, green_pile.get());
+ nearest_neighbor, texture_format, viewport, 1.f,
+ green_pile.get());
RenderPassList pass_list;
pass_list.push_back(pass.Pass());
@@ -1796,6 +1798,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
gfx::Size pile_tile_size(1000, 1000);
gfx::Rect viewport(this->device_viewport_size_);
ResourceFormat texture_format = RGBA_8888;
+ bool nearest_neighbor = false;
RenderPassId id(1, 1);
gfx::Transform transform_to_root;
@@ -1818,8 +1821,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
PictureDrawQuad* green_quad =
pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
green_quad->SetNew(green_shared_state, viewport, gfx::Rect(), viewport,
- gfx::RectF(0, 0, 1, 1), viewport.size(), texture_format,
- viewport, 1.f, green_pile.get());
+ gfx::RectF(0, 0, 1, 1), viewport.size(), nearest_neighbor,
+ texture_format, viewport, 1.f, green_pile.get());
// One viewport-filling white quad.
scoped_refptr<FakePicturePileImpl> white_pile =
@@ -1836,8 +1839,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
PictureDrawQuad* white_quad =
pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
white_quad->SetNew(white_shared_state, viewport, gfx::Rect(), viewport,
- gfx::RectF(0, 0, 1, 1), viewport.size(), texture_format,
- viewport, 1.f, white_pile.get());
+ gfx::RectF(0, 0, 1, 1), viewport.size(), nearest_neighbor,
+ texture_format, viewport, 1.f, white_pile.get());
RenderPassList pass_list;
pass_list.push_back(pass.Pass());
@@ -1873,6 +1876,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
gfx::Size pile_tile_size(1000, 1000);
gfx::Rect viewport(this->device_viewport_size_);
ResourceFormat texture_format = RGBA_8888;
+ bool nearest_neighbor = false;
RenderPassId id(1, 1);
gfx::Transform transform_to_root;
@@ -1903,8 +1907,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
PictureDrawQuad* quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
quad->SetNew(shared_state, viewport, gfx::Rect(), viewport,
- gfx::RectF(0, 0, 2, 2), viewport.size(), texture_format,
- viewport, 1.f, pile.get());
+ gfx::RectF(0, 0, 2, 2), viewport.size(), nearest_neighbor,
+ texture_format, viewport, 1.f, pile.get());
RenderPassList pass_list;
pass_list.push_back(pass.Pass());
@@ -1917,11 +1921,118 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
ExactPixelComparator(true)));
}
+// This disables filtering by setting |nearest_neighbor| on the PictureDrawQuad.
+TYPED_TEST(RendererPixelTest, PictureDrawQuadNearestNeighbor) {
+ gfx::Size pile_tile_size(1000, 1000);
+ gfx::Rect viewport(this->device_viewport_size_);
+ ResourceFormat texture_format = RGBA_8888;
+ bool nearest_neighbor = true;
+
+ RenderPassId id(1, 1);
+ gfx::Transform transform_to_root;
+ scoped_ptr<RenderPass> pass =
+ CreateTestRenderPass(id, viewport, transform_to_root);
+
+ SkBitmap bitmap;
+ bitmap.allocN32Pixels(2, 2);
+ {
+ SkAutoLockPixels lock(bitmap);
+ SkCanvas canvas(bitmap);
+ canvas.drawPoint(0, 0, SK_ColorGREEN);
+ canvas.drawPoint(0, 1, SK_ColorBLUE);
+ canvas.drawPoint(1, 0, SK_ColorBLUE);
+ canvas.drawPoint(1, 1, SK_ColorGREEN);
+ }
+
+ scoped_refptr<FakePicturePileImpl> pile =
+ FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
+ SkPaint paint;
+ paint.setFilterLevel(SkPaint::kLow_FilterLevel);
+ pile->add_draw_bitmap_with_paint(bitmap, gfx::Point(), paint);
+ pile->RerecordPile();
+
+ gfx::Transform content_to_target_transform;
+ SharedQuadState* shared_state = CreateTestSharedQuadState(
+ content_to_target_transform, viewport, pass.get());
+
+ PictureDrawQuad* quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
+ quad->SetNew(shared_state, viewport, gfx::Rect(), viewport,
+ gfx::RectF(0, 0, 2, 2), viewport.size(), nearest_neighbor,
+ texture_format, viewport, 1.f, pile.get());
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ EXPECT_TRUE(this->RunPixelTest(
+ &pass_list,
+ base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
+ ExactPixelComparator(true)));
+}
+
+// This disables filtering by setting |nearest_neighbor| on the TileDrawQuad.
+TYPED_TEST(RendererPixelTest, TileDrawQuadNearestNeighbor) {
+ gfx::Rect viewport(this->device_viewport_size_);
+ bool swizzle_contents = true;
+ bool nearest_neighbor = true;
+
+ SkBitmap bitmap;
+ bitmap.allocN32Pixels(2, 2);
+ {
+ SkAutoLockPixels lock(bitmap);
+ SkCanvas canvas(bitmap);
+ canvas.drawPoint(0, 0, SK_ColorGREEN);
+ canvas.drawPoint(0, 1, SK_ColorBLUE);
+ canvas.drawPoint(1, 0, SK_ColorBLUE);
+ canvas.drawPoint(1, 1, SK_ColorGREEN);
+ }
+
+ gfx::Size tile_size(2, 2);
+ ResourceProvider::ResourceId resource =
+ this->resource_provider_->CreateResource(
+ tile_size,
+ GL_CLAMP_TO_EDGE,
+ ResourceProvider::TextureHintImmutable,
+ RGBA_8888);
+
+ {
+ SkAutoLockPixels lock(bitmap);
+ this->resource_provider_->SetPixels(
+ resource,
+ static_cast<uint8_t*>(bitmap.getPixels()),
+ gfx::Rect(tile_size),
+ gfx::Rect(tile_size),
+ gfx::Vector2d());
+ }
+
+ RenderPassId id(1, 1);
+ gfx::Transform transform_to_root;
+ scoped_ptr<RenderPass> pass =
+ CreateTestRenderPass(id, viewport, transform_to_root);
+
+ gfx::Transform content_to_target_transform;
+ SharedQuadState* shared_state = CreateTestSharedQuadState(
+ content_to_target_transform, viewport, pass.get());
+
+ TileDrawQuad* quad = pass->CreateAndAppendDrawQuad<TileDrawQuad>();
+ quad->SetNew(shared_state, viewport, gfx::Rect(), viewport, resource,
+ gfx::Rect(tile_size), tile_size, swizzle_contents,
+ nearest_neighbor);
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ EXPECT_TRUE(this->RunPixelTest(
+ &pass_list,
+ base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
+ ExactPixelComparator(true)));
+}
+
TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) {
gfx::Size pile_tile_size(1000, 1000);
gfx::Rect viewport(this->device_viewport_size_);
// TODO(enne): the renderer should figure this out on its own.
ResourceFormat texture_format = RGBA_8888;
+ bool nearest_neighbor = false;
RenderPassId id(1, 1);
gfx::Transform transform_to_root;
@@ -1954,15 +2065,15 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) {
pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
green_quad1->SetNew(top_right_green_shared_quad_state, green_rect1,
gfx::Rect(), green_rect1, gfx::RectF(green_rect1.size()),
- green_rect1.size(), texture_format, green_rect1, 1.f,
- green_pile.get());
+ green_rect1.size(), nearest_neighbor, texture_format,
+ green_rect1, 1.f, green_pile.get());
PictureDrawQuad* green_quad2 =
pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
green_quad2->SetNew(top_right_green_shared_quad_state, green_rect2,
gfx::Rect(), green_rect2, gfx::RectF(green_rect2.size()),
- green_rect2.size(), texture_format, green_rect2, 1.f,
- green_pile.get());
+ green_rect2.size(), nearest_neighbor, texture_format,
+ green_rect2, 1.f, green_pile.get());
// Add a green clipped checkerboard in the bottom right to help test
// interleaving picture quad content and solid color content.
@@ -2030,7 +2141,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) {
PictureDrawQuad* blue_quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
blue_quad->SetNew(blue_shared_state, quad_content_rect, gfx::Rect(),
quad_content_rect, gfx::RectF(quad_content_rect),
- content_union_rect.size(), texture_format,
+ content_union_rect.size(), nearest_neighbor, texture_format,
content_union_rect, contents_scale, pile.get());
// Fill left half of viewport with green.
@@ -2215,6 +2326,7 @@ TEST_F(GLRendererPixelTest, PictureDrawQuadTexture4444) {
gfx::Size pile_tile_size(1000, 1000);
gfx::Rect viewport(this->device_viewport_size_);
ResourceFormat texture_format = RGBA_4444;
+ bool nearest_neighbor = false;
RenderPassId id(1, 1);
gfx::Transform transform_to_root;
@@ -2236,7 +2348,8 @@ TEST_F(GLRendererPixelTest, PictureDrawQuadTexture4444) {
PictureDrawQuad* blue_quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
blue_quad->SetNew(blue_shared_state, viewport, gfx::Rect(), viewport,
gfx::RectF(0.f, 0.f, 1.f, 1.f), viewport.size(),
- texture_format, viewport, 1.f, blue_pile.get());
+ nearest_neighbor, texture_format, viewport, 1.f,
+ blue_pile.get());
RenderPassList pass_list;
pass_list.push_back(pass.Pass());
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
index ddd3473..1b18648 100644
--- a/cc/output/software_renderer.cc
+++ b/cc/output/software_renderer.cc
@@ -347,7 +347,8 @@ void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame,
// (http://crbug.com/280374).
skia::RefPtr<SkDrawFilter> opacity_filter =
skia::AdoptRef(new skia::OpacityDrawFilter(
- quad->opacity(), frame->disable_picture_quad_image_filtering));
+ quad->opacity(), frame->disable_picture_quad_image_filtering ||
+ quad->nearest_neighbor));
DCHECK(!current_canvas_->getDrawFilter());
current_canvas_->setDrawFilter(opacity_filter.get());
@@ -449,7 +450,9 @@ void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame,
QuadVertexRect(), quad->rect, quad->visible_rect);
SkRect uv_rect = gfx::RectFToSkRect(visible_tex_coord_rect);
- current_paint_.setFilterLevel(SkPaint::kLow_FilterLevel);
+ current_paint_.setFilterLevel(quad->nearest_neighbor
+ ? SkPaint::kNone_FilterLevel
+ : SkPaint::kLow_FilterLevel);
current_canvas_->drawBitmapRectToRect(
*lock.sk_bitmap(),
&uv_rect,
diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc
index ea584ee..7f689a8 100644
--- a/cc/output/software_renderer_unittest.cc
+++ b/cc/output/software_renderer_unittest.cc
@@ -211,6 +211,7 @@ TEST_F(SoftwareRendererTest, TileQuad) {
resource_cyan,
gfx::RectF(inner_size),
inner_size,
+ false,
false);
TileDrawQuad* outer_quad =
root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>();
@@ -221,6 +222,7 @@ TEST_F(SoftwareRendererTest, TileQuad) {
resource_yellow,
gfx::RectF(outer_size),
outer_size,
+ false,
false);
RenderPassList list;
@@ -294,6 +296,7 @@ TEST_F(SoftwareRendererTest, TileQuadVisibleRect) {
resource_cyan,
gfx::RectF(tile_size),
tile_size,
+ false,
false);
quad->visible_rect = visible_rect;
diff --git a/cc/quads/content_draw_quad_base.cc b/cc/quads/content_draw_quad_base.cc
index fd6e91b..7304498 100644
--- a/cc/quads/content_draw_quad_base.cc
+++ b/cc/quads/content_draw_quad_base.cc
@@ -25,13 +25,15 @@ void ContentDrawQuadBase::SetNew(const SharedQuadState* shared_quad_state,
const gfx::Rect& visible_rect,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
- bool swizzle_contents) {
+ bool swizzle_contents,
+ bool nearest_neighbor) {
bool needs_blending = false;
DrawQuad::SetAll(shared_quad_state, material, rect, opaque_rect,
visible_rect, needs_blending);
this->tex_coord_rect = tex_coord_rect;
this->texture_size = texture_size;
this->swizzle_contents = swizzle_contents;
+ this->nearest_neighbor = nearest_neighbor;
}
void ContentDrawQuadBase::SetAll(const SharedQuadState* shared_quad_state,
@@ -42,12 +44,14 @@ void ContentDrawQuadBase::SetAll(const SharedQuadState* shared_quad_state,
bool needs_blending,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
- bool swizzle_contents) {
+ bool swizzle_contents,
+ bool nearest_neighbor) {
DrawQuad::SetAll(shared_quad_state, material, rect, opaque_rect,
visible_rect, needs_blending);
this->tex_coord_rect = tex_coord_rect;
this->texture_size = texture_size;
this->swizzle_contents = swizzle_contents;
+ this->nearest_neighbor = nearest_neighbor;
}
void ContentDrawQuadBase::ExtendValue(base::debug::TracedValue* value) const {
@@ -60,6 +64,7 @@ void ContentDrawQuadBase::ExtendValue(base::debug::TracedValue* value) const {
value->EndDictionary();
value->SetBoolean("swizzle_contents", swizzle_contents);
+ value->SetBoolean("nearest_neighbor", nearest_neighbor);
}
} // namespace cc
diff --git a/cc/quads/content_draw_quad_base.h b/cc/quads/content_draw_quad_base.h
index b0e53dc..58aa727 100644
--- a/cc/quads/content_draw_quad_base.h
+++ b/cc/quads/content_draw_quad_base.h
@@ -23,7 +23,8 @@ class CC_EXPORT ContentDrawQuadBase : public DrawQuad {
const gfx::Rect& visible_rect,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
- bool swizzle_contents);
+ bool swizzle_contents,
+ bool nearest_neighbor);
void SetAll(const SharedQuadState* shared_quad_state,
DrawQuad::Material material,
@@ -33,11 +34,13 @@ class CC_EXPORT ContentDrawQuadBase : public DrawQuad {
bool needs_blending,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
- bool swizzle_contents);
+ bool swizzle_contents,
+ bool nearest_neighbor);
gfx::RectF tex_coord_rect;
gfx::Size texture_size;
bool swizzle_contents;
+ bool nearest_neighbor;
protected:
ContentDrawQuadBase();
diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc
index e65b326..97fea32 100644
--- a/cc/quads/draw_quad_unittest.cc
+++ b/cc/quads/draw_quad_unittest.cc
@@ -600,15 +600,17 @@ TEST(DrawQuadTest, CopyTileDrawQuad) {
gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
gfx::Size texture_size(85, 32);
bool swizzle_contents = true;
+ bool nearest_neighbor = true;
CREATE_SHARED_STATE();
- CREATE_QUAD_6_NEW(TileDrawQuad,
+ CREATE_QUAD_7_NEW(TileDrawQuad,
opaque_rect,
visible_rect,
resource_id,
tex_coord_rect,
texture_size,
- swizzle_contents);
+ swizzle_contents,
+ nearest_neighbor);
EXPECT_EQ(DrawQuad::TILED_CONTENT, copy_quad->material);
EXPECT_EQ(opaque_rect, copy_quad->opaque_rect);
EXPECT_EQ(visible_rect, copy_quad->visible_rect);
@@ -616,17 +618,20 @@ TEST(DrawQuadTest, CopyTileDrawQuad) {
EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
EXPECT_EQ(texture_size, copy_quad->texture_size);
EXPECT_EQ(swizzle_contents, copy_quad->swizzle_contents);
+ EXPECT_EQ(nearest_neighbor, copy_quad->nearest_neighbor);
- CREATE_QUAD_4_ALL(TileDrawQuad,
+ CREATE_QUAD_5_ALL(TileDrawQuad,
resource_id,
tex_coord_rect,
texture_size,
- swizzle_contents);
+ swizzle_contents,
+ nearest_neighbor);
EXPECT_EQ(DrawQuad::TILED_CONTENT, copy_quad->material);
EXPECT_EQ(resource_id, copy_quad->resource_id);
EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
EXPECT_EQ(texture_size, copy_quad->texture_size);
EXPECT_EQ(swizzle_contents, copy_quad->swizzle_contents);
+ EXPECT_EQ(nearest_neighbor, copy_quad->nearest_neighbor);
}
TEST(DrawQuadTest, CopyYUVVideoDrawQuad) {
@@ -680,31 +685,34 @@ TEST(DrawQuadTest, CopyPictureDrawQuad) {
gfx::Rect visible_rect(40, 50, 30, 20);
gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
gfx::Size texture_size(85, 32);
+ bool nearest_neighbor = true;
ResourceFormat texture_format = RGBA_8888;
gfx::Rect content_rect(30, 40, 20, 30);
float contents_scale = 3.141592f;
scoped_refptr<RasterSource> raster_source = PicturePileImpl::Create();
CREATE_SHARED_STATE();
- CREATE_QUAD_8_NEW(PictureDrawQuad, opaque_rect, visible_rect, tex_coord_rect,
- texture_size, texture_format, content_rect, contents_scale,
- raster_source);
+ CREATE_QUAD_9_NEW(PictureDrawQuad, opaque_rect, visible_rect, tex_coord_rect,
+ texture_size, nearest_neighbor, texture_format,
+ content_rect, contents_scale, raster_source);
EXPECT_EQ(DrawQuad::PICTURE_CONTENT, copy_quad->material);
EXPECT_EQ(opaque_rect, copy_quad->opaque_rect);
EXPECT_EQ(visible_rect, copy_quad->visible_rect);
EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
EXPECT_EQ(texture_size, copy_quad->texture_size);
+ EXPECT_EQ(nearest_neighbor, copy_quad->nearest_neighbor);
EXPECT_EQ(texture_format, copy_quad->texture_format);
EXPECT_EQ(content_rect, copy_quad->content_rect);
EXPECT_EQ(contents_scale, copy_quad->contents_scale);
EXPECT_EQ(raster_source, copy_quad->raster_source);
- CREATE_QUAD_6_ALL(PictureDrawQuad, tex_coord_rect, texture_size,
- texture_format, content_rect, contents_scale,
- raster_source);
+ CREATE_QUAD_7_ALL(PictureDrawQuad, tex_coord_rect, texture_size,
+ nearest_neighbor, texture_format, content_rect,
+ contents_scale, raster_source);
EXPECT_EQ(DrawQuad::PICTURE_CONTENT, copy_quad->material);
EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
EXPECT_EQ(texture_size, copy_quad->texture_size);
+ EXPECT_EQ(nearest_neighbor, copy_quad->nearest_neighbor);
EXPECT_EQ(texture_format, copy_quad->texture_format);
EXPECT_EQ(content_rect, copy_quad->content_rect);
EXPECT_EQ(contents_scale, copy_quad->contents_scale);
@@ -871,15 +879,17 @@ TEST_F(DrawQuadIteratorTest, TileDrawQuad) {
gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
gfx::Size texture_size(85, 32);
bool swizzle_contents = true;
+ bool nearest_neighbor = true;
CREATE_SHARED_STATE();
- CREATE_QUAD_6_NEW(TileDrawQuad,
+ CREATE_QUAD_7_NEW(TileDrawQuad,
opaque_rect,
visible_rect,
resource_id,
tex_coord_rect,
texture_size,
- swizzle_contents);
+ swizzle_contents,
+ nearest_neighbor);
EXPECT_EQ(resource_id, quad_new->resource_id);
EXPECT_EQ(1, IterateAndCount(quad_new));
EXPECT_EQ(resource_id + 1, quad_new->resource_id);
@@ -924,15 +934,16 @@ TEST_F(DrawQuadIteratorTest, DISABLED_PictureDrawQuad) {
gfx::Rect visible_rect(40, 50, 30, 20);
gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
gfx::Size texture_size(85, 32);
+ bool nearest_neighbor = true;
ResourceFormat texture_format = RGBA_8888;
gfx::Rect content_rect(30, 40, 20, 30);
float contents_scale = 3.141592f;
scoped_refptr<PicturePileImpl> raster_source = PicturePileImpl::Create();
CREATE_SHARED_STATE();
- CREATE_QUAD_8_NEW(PictureDrawQuad, opaque_rect, visible_rect, tex_coord_rect,
- texture_size, texture_format, content_rect, contents_scale,
- raster_source);
+ CREATE_QUAD_9_NEW(PictureDrawQuad, opaque_rect, visible_rect, tex_coord_rect,
+ texture_size, nearest_neighbor, texture_format,
+ content_rect, contents_scale, raster_source);
EXPECT_EQ(0, IterateAndCount(quad_new));
}
diff --git a/cc/quads/picture_draw_quad.cc b/cc/quads/picture_draw_quad.cc
index bf329c2..2171542 100644
--- a/cc/quads/picture_draw_quad.cc
+++ b/cc/quads/picture_draw_quad.cc
@@ -23,6 +23,7 @@ void PictureDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
const gfx::Rect& visible_rect,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
+ bool nearest_neighbor,
ResourceFormat texture_format,
const gfx::Rect& content_rect,
float contents_scale,
@@ -35,7 +36,8 @@ void PictureDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
visible_rect,
tex_coord_rect,
texture_size,
- !PlatformColor::SameComponentOrder(texture_format));
+ !PlatformColor::SameComponentOrder(texture_format),
+ nearest_neighbor);
this->content_rect = content_rect;
this->contents_scale = contents_scale;
this->raster_source = raster_source;
@@ -49,6 +51,7 @@ void PictureDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
bool needs_blending,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
+ bool nearest_neighbor,
ResourceFormat texture_format,
const gfx::Rect& content_rect,
float contents_scale,
@@ -62,7 +65,8 @@ void PictureDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
tex_coord_rect,
texture_size,
!PlatformColor::SameComponentOrder(
- texture_format));
+ texture_format),
+ nearest_neighbor);
this->content_rect = content_rect;
this->contents_scale = contents_scale;
this->raster_source = raster_source;
diff --git a/cc/quads/picture_draw_quad.h b/cc/quads/picture_draw_quad.h
index 62c9f18..624b69c 100644
--- a/cc/quads/picture_draw_quad.h
+++ b/cc/quads/picture_draw_quad.h
@@ -28,6 +28,7 @@ class CC_EXPORT PictureDrawQuad : public ContentDrawQuadBase {
const gfx::Rect& visible_rect,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
+ bool nearest_neighbor,
ResourceFormat texture_format,
const gfx::Rect& content_rect,
float contents_scale,
@@ -40,6 +41,7 @@ class CC_EXPORT PictureDrawQuad : public ContentDrawQuadBase {
bool needs_blending,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
+ bool nearest_neighbor,
ResourceFormat texture_format,
const gfx::Rect& content_rect,
float contents_scale,
diff --git a/cc/quads/tile_draw_quad.cc b/cc/quads/tile_draw_quad.cc
index ea3a14a..88a4b3af 100644
--- a/cc/quads/tile_draw_quad.cc
+++ b/cc/quads/tile_draw_quad.cc
@@ -25,7 +25,8 @@ void TileDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
unsigned resource_id,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
- bool swizzle_contents) {
+ bool swizzle_contents,
+ bool nearest_neighbor) {
ContentDrawQuadBase::SetNew(shared_quad_state,
DrawQuad::TILED_CONTENT,
rect,
@@ -33,7 +34,8 @@ void TileDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
visible_rect,
tex_coord_rect,
texture_size,
- swizzle_contents);
+ swizzle_contents,
+ nearest_neighbor);
this->resource_id = resource_id;
}
@@ -45,10 +47,12 @@ void TileDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
unsigned resource_id,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
- bool swizzle_contents) {
+ bool swizzle_contents,
+ bool nearest_neighbor) {
ContentDrawQuadBase::SetAll(shared_quad_state, DrawQuad::TILED_CONTENT, rect,
opaque_rect, visible_rect, needs_blending,
- tex_coord_rect, texture_size, swizzle_contents);
+ tex_coord_rect, texture_size, swizzle_contents,
+ nearest_neighbor);
this->resource_id = resource_id;
}
diff --git a/cc/quads/tile_draw_quad.h b/cc/quads/tile_draw_quad.h
index d776057..e668ddb 100644
--- a/cc/quads/tile_draw_quad.h
+++ b/cc/quads/tile_draw_quad.h
@@ -21,7 +21,8 @@ class CC_EXPORT TileDrawQuad : public ContentDrawQuadBase {
unsigned resource_id,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
- bool swizzle_contents);
+ bool swizzle_contents,
+ bool nearest_neighbor);
void SetAll(const SharedQuadState* shared_quad_state,
const gfx::Rect& rect,
@@ -31,7 +32,8 @@ class CC_EXPORT TileDrawQuad : public ContentDrawQuadBase {
unsigned resource_id,
const gfx::RectF& tex_coord_rect,
const gfx::Size& texture_size,
- bool swizzle_contents);
+ bool swizzle_contents,
+ bool nearest_neighbor);
unsigned resource_id;
diff --git a/cc/test/render_pass_test_common.cc b/cc/test/render_pass_test_common.cc
index b79fc1f..7237ce1 100644
--- a/cc/test/render_pass_test_common.cc
+++ b/cc/test/render_pass_test_common.cc
@@ -198,6 +198,7 @@ void TestRenderPass::AppendOneOfEveryQuadType(
resource2,
gfx::RectF(0, 0, 50, 50),
gfx::Size(50, 50),
+ false,
false);
SharedQuadState* transformed_state = this->CreateAndAppendSharedQuadState();
@@ -215,6 +216,7 @@ void TestRenderPass::AppendOneOfEveryQuadType(
resource3,
gfx::RectF(0, 0, 100, 100),
gfx::Size(100, 100),
+ false,
false);
SharedQuadState* shared_state2 = this->CreateAndAppendSharedQuadState();
@@ -235,6 +237,7 @@ void TestRenderPass::AppendOneOfEveryQuadType(
resource4,
gfx::RectF(0, 0, 100, 100),
gfx::Size(100, 100),
+ false,
false);
ResourceProvider::ResourceId plane_resources[4];
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index c8e27a9..fc4780f 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -4186,6 +4186,7 @@ class BlendStateCheckLayer : public LayerImpl {
resource_id_,
gfx::RectF(0.f, 0.f, 1.f, 1.f),
gfx::Size(1, 1),
+ false,
false);
test_blending_draw_quad->visible_rect = quad_visible_rect_;
EXPECT_EQ(blend_, test_blending_draw_quad->ShouldDrawWithBlending());
diff --git a/content/common/cc_messages.h b/content/common/cc_messages.h
index 21bc4c7..9808438 100644
--- a/content/common/cc_messages.h
+++ b/content/common/cc_messages.h
@@ -222,6 +222,7 @@ IPC_STRUCT_TRAITS_BEGIN(cc::TileDrawQuad)
IPC_STRUCT_TRAITS_MEMBER(tex_coord_rect)
IPC_STRUCT_TRAITS_MEMBER(texture_size)
IPC_STRUCT_TRAITS_MEMBER(swizzle_contents)
+ IPC_STRUCT_TRAITS_MEMBER(nearest_neighbor)
IPC_STRUCT_TRAITS_END()
IPC_STRUCT_TRAITS_BEGIN(cc::YUVVideoDrawQuad)
diff --git a/content/common/cc_messages_unittest.cc b/content/common/cc_messages_unittest.cc
index ef16091..d3ec0df 100644
--- a/content/common/cc_messages_unittest.cc
+++ b/content/common/cc_messages_unittest.cc
@@ -194,6 +194,7 @@ class CCMessagesTest : public testing::Test {
EXPECT_EQ(a->tex_coord_rect, b->tex_coord_rect);
EXPECT_EQ(a->texture_size, b->texture_size);
EXPECT_EQ(a->swizzle_contents, b->swizzle_contents);
+ EXPECT_EQ(a->nearest_neighbor, b->nearest_neighbor);
}
void Compare(const YUVVideoDrawQuad* a, const YUVVideoDrawQuad* b) {
@@ -456,7 +457,8 @@ TEST_F(CCMessagesTest, AllQuads) {
arbitrary_resourceid3,
arbitrary_rectf1,
arbitrary_size1,
- arbitrary_bool2);
+ arbitrary_bool2,
+ arbitrary_bool3);
pass_cmp->CopyFromAndAppendDrawQuad(tile_in, tile_in->shared_quad_state);
YUVVideoDrawQuad* yuvvideo_in =
diff --git a/mojo/converters/surfaces/surfaces_type_converters.cc b/mojo/converters/surfaces/surfaces_type_converters.cc
index 1a6ab99..c064dc8 100644
--- a/mojo/converters/surfaces/surfaces_type_converters.cc
+++ b/mojo/converters/surfaces/surfaces_type_converters.cc
@@ -158,7 +158,8 @@ bool ConvertDrawQuad(const QuadPtr& input,
tile_state->resource_id,
tile_state->tex_coord_rect.To<gfx::RectF>(),
tile_state->texture_size.To<gfx::Size>(),
- tile_state->swizzle_contents);
+ tile_state->swizzle_contents,
+ tile_state->nearest_neighbor);
break;
}
case MATERIAL_YUV_VIDEO_CONTENT: {
@@ -309,6 +310,7 @@ QuadPtr TypeConverter<QuadPtr, cc::DrawQuad>::Convert(
tile_state->tex_coord_rect = RectF::From(tile_quad->tex_coord_rect);
tile_state->texture_size = Size::From(tile_quad->texture_size);
tile_state->swizzle_contents = tile_quad->swizzle_contents;
+ tile_state->nearest_neighbor = tile_quad->nearest_neighbor;
tile_state->resource_id = tile_quad->resource_id;
quad->tile_quad_state = tile_state.Pass();
break;
diff --git a/mojo/services/public/interfaces/surfaces/quads.mojom b/mojo/services/public/interfaces/surfaces/quads.mojom
index 61115f7..8f5cd1f 100644
--- a/mojo/services/public/interfaces/surfaces/quads.mojom
+++ b/mojo/services/public/interfaces/surfaces/quads.mojom
@@ -71,6 +71,7 @@ struct TileQuadState {
RectF tex_coord_rect;
Size texture_size;
bool swizzle_contents;
+ bool nearest_neighbor;
uint32 resource_id;
};