{"action":"created","comment":{"url":"https://api.github.com/repos/servo/rust-layers/pulls/comments/32963466","id":32963466,"diff_hunk":"@@ -330,273 +436,322 @@ impl RenderContext {\n             buffers: RenderContext::init_buffers(),\n             compositing_context: compositing_context,\n             show_debug_borders: show_debug_borders,\n+            force_near_texture_filter: force_near_texture_filter,\n         }\n     }\n \n     fn init_buffers() -> Buffers {\n-        let textured_quad_vertex_buffer = gl::gen_buffers(1)[0];\n-        gl::bind_buffer(gl::ARRAY_BUFFER, textured_quad_vertex_buffer);\n-        gl::buffer_data(gl::ARRAY_BUFFER, &TEXTURED_QUAD_VERTICES, gl::STATIC_DRAW);\n+        let quad_vertex_buffer = gl::gen_buffers(1)[0];\n+        gl::bind_buffer(gl::ARRAY_BUFFER, quad_vertex_buffer);\n \n         let line_quad_vertex_buffer = gl::gen_buffers(1)[0];\n         gl::bind_buffer(gl::ARRAY_BUFFER, line_quad_vertex_buffer);\n-        gl::buffer_data(gl::ARRAY_BUFFER, &LINE_QUAD_VERTICES, gl::STATIC_DRAW);\n \n         Buffers {\n-            textured_quad_vertex_buffer: textured_quad_vertex_buffer,\n+            quad_vertex_buffer: quad_vertex_buffer,\n             line_quad_vertex_buffer: line_quad_vertex_buffer,\n         }\n     }\n-}\n \n-pub fn bind_and_render_quad(render_context: RenderContext,\n+    fn bind_and_render_solid_quad(&self,\n+                                  vertices: &[ColorVertex; 4],\n+                                  transform: &Matrix4,\n+                                  projection: &Matrix4,\n+                                  color: &Color) {\n+        self.solid_color_program.enable_attribute_arrays();\n+        gl::use_program(self.solid_color_program.program.id);\n+        self.solid_color_program.bind_uniforms_and_attributes_for_quad(vertices,\n+                                                                       transform,\n+                                                                       projection,\n+                                                                       &self.buffers,\n+                                                                       color);\n+        gl::draw_arrays(gl::TRIANGLE_STRIP, 0, 4);\n+        self.solid_color_program.disable_attribute_arrays();\n+    }\n+\n+    fn bind_and_render_quad(&self,\n+                            vertices: &[TextureVertex; 4],\n                             texture: &Texture,\n                             transform: &Matrix4,\n-                            scene_size: Size2D<f32>,\n-                            unit_rect: Rect<f32>,\n+                            projection_matrix: &Matrix4,\n                             opacity: f32) {\n-    let mut texture_coordinates_need_to_be_scaled_by_size = false;\n-    let program = match texture.target {\n-        TextureTarget2D => render_context.texture_2d_program,\n-        TextureTargetRectangle(..) => match render_context.texture_rectangle_program {\n-            Some(program) => {\n-                texture_coordinates_need_to_be_scaled_by_size = true;\n-                program\n-            }\n-            None => panic!(\"There is no shader program for texture rectangle\"),\n-        },\n-    };\n-    program.enable_attribute_arrays();\n-\n-    gl::use_program(program.program.id);\n-    gl::active_texture(gl::TEXTURE0);\n-\n-    // FIXME: This should technically check that the transform\n-    // matrix only contains scale in these components.\n-    let has_scale = transform.m11 as usize != texture.size.width ||\n-                    transform.m22 as usize != texture.size.height;\n-    let filter_mode = if has_scale {\n-        Linear\n-    } else {\n-        Nearest\n-    };\n-    texture.set_filter_mode(filter_mode);\n-\n-    let _bound_texture = texture.bind();\n-\n-    // Set the projection matrix.\n-    let projection_matrix = Matrix4::ortho(\n-        0.0, scene_size.width, scene_size.height, 0.0, -10.0, 10.0);\n-\n-    // We calculate a transformation matrix for the texture coordinates\n-    // which is useful for flipping the texture vertically or scaling the\n-    // coordinates when dealing with GL_ARB_texture_rectangle.\n-    let mut texture_transform = Matrix4::identity();\n-    if texture.flip == VerticalFlip {\n-        texture_transform = texture_transform.scale(1.0, -1.0, 1.0);\n-    }\n-    if texture_coordinates_need_to_be_scaled_by_size {\n-        texture_transform = texture_transform.scale(texture.size.width as f32,\n-                                                    texture.size.height as f32,\n-                                                    1.0);\n-    }\n-    if texture.flip == VerticalFlip {\n-        texture_transform = texture_transform.translate(0.0, -1.0, 0.0);\n-    }\n-\n-    program.bind_uniforms_and_attributes(transform,\n-                                         &projection_matrix,\n-                                         &texture_transform,\n-                                         &render_context.buffers,\n-                                         unit_rect,\n-                                         opacity);\n-\n-    // Draw!\n-    gl::draw_arrays(gl::TRIANGLE_STRIP, 0, 4);\n-    gl::bind_texture(gl::TEXTURE_2D, 0);\n-\n-    program.disable_attribute_arrays()\n-}\n+        let mut texture_coordinates_need_to_be_scaled_by_size = false;\n+        let program = match texture.target {\n+            TextureTarget2D => self.texture_2d_program,\n+            TextureTargetRectangle(..) => match self.texture_rectangle_program {\n+                Some(program) => {\n+                    texture_coordinates_need_to_be_scaled_by_size = true;\n+                    program\n+                }\n+                None => panic!(\"There is no shader program for texture rectangle\"),\n+            },\n+        };\n+        program.enable_attribute_arrays();\n+\n+        gl::use_program(program.program.id);\n+        gl::active_texture(gl::TEXTURE0);\n+        gl::bind_texture(texture.target.as_gl_target(), texture.native_texture());\n+\n+        let filter_mode = if self.force_near_texture_filter {\n+            gl::NEAREST\n+        } else {\n+            gl::LINEAR\n+        } as GLint;\n+        gl::tex_parameter_i(texture.target.as_gl_target(), gl::TEXTURE_MAG_FILTER, filter_mode);\n+        gl::tex_parameter_i(texture.target.as_gl_target(), gl::TEXTURE_MIN_FILTER, filter_mode);\n+\n+        // We calculate a transformation matrix for the texture coordinates\n+        // which is useful for flipping the texture vertically or scaling the\n+        // coordinates when dealing with GL_ARB_texture_rectangle.\n+        let mut texture_transform = Matrix4::identity();\n+        if texture.flip == VerticalFlip {\n+            texture_transform = texture_transform.scale(1.0, -1.0, 1.0);\n+        }\n+        if texture_coordinates_need_to_be_scaled_by_size {\n+            texture_transform = texture_transform.scale(texture.size.width as f32,\n+                                                        texture.size.height as f32,\n+                                                        1.0);\n+        }\n+        if texture.flip == VerticalFlip {\n+            texture_transform = texture_transform.translate(0.0, -1.0, 0.0);\n+        }\n \n-pub fn bind_and_render_quad_lines(render_context: RenderContext,\n-                                  transform: &Matrix4,\n-                                  scene_size: Size2D<f32>,\n-                                  color: Color,\n-                                  line_thickness: usize) {\n-    let solid_color_program = render_context.solid_color_program;\n-    solid_color_program.enable_attribute_arrays();\n-    gl::use_program(solid_color_program.program.id);\n-    let projection_matrix = Matrix4::ortho(\n-        0.0, scene_size.width, scene_size.height, 0.0, -10.0, 10.0);\n-    solid_color_program.bind_uniforms_and_attributes_for_lines(transform,\n-                                                               &projection_matrix,\n-                                                               &render_context.buffers,\n-                                                               color);\n-    gl::line_width(line_thickness as GLfloat);\n-    gl::draw_arrays(gl::LINE_STRIP, 0, 5);\n-    solid_color_program.disable_attribute_arrays();\n-}\n+        program.bind_uniforms_and_attributes(vertices,\n+                                             transform,\n+                                             &projection_matrix,\n+                                             &texture_transform,\n+                                             &self.buffers,\n+                                             opacity);\n \n-pub fn bind_and_render_solid_quad(render_context: RenderContext,\n-                                  transform: &Matrix4,\n-                                  scene_size: Size2D<f32>,\n-                                  color: Color,\n-                                  unit_rect: Rect<f32>) {\n-    let solid_color_program = render_context.solid_color_program;\n-    solid_color_program.enable_attribute_arrays();\n-    gl::use_program(solid_color_program.program.id);\n-    let projection_matrix = Matrix4::ortho(\n-        0.0, scene_size.width, scene_size.height, 0.0, -10.0, 10.0);\n-    solid_color_program.bind_uniforms_and_attributes_for_quad(transform,\n-                                                              &projection_matrix,\n-                                                              &render_context.buffers,\n-                                                              color,\n-                                                              unit_rect);\n-    gl::draw_arrays(gl::TRIANGLE_STRIP, 0, 4);\n-    solid_color_program.disable_attribute_arrays();\n-}\n+        // Draw!\n+        gl::draw_arrays(gl::TRIANGLE_STRIP, 0, 4);\n+        gl::bind_texture(gl::TEXTURE_2D, 0);\n \n-fn map_clip_to_unit_rectangle(rect: Rect<f32>,\n-                              clip_rect: Option<Rect<f32>>)\n-                              -> Rect<f32> {\n-    match clip_rect {\n-        Some(clip_rect) => {\n-            match clip_rect.intersection(&rect) {\n-                Some(intersected_rect) => {\n-                    let offset = Point2D::new(0., 0.) - rect.origin;\n-                    intersected_rect.translate(&offset).scale(1. / rect.size.width,\n-                                                              1. / rect.size.height)\n-                }\n-                None => Rect::new(Point2D::new(0., 0.), Size2D::new(0., 0.)),\n-            }\n-        },\n-        None => Rect::new(Point2D::new(0., 0.), Size2D::new(1., 1.))\n+        gl::bind_texture(texture.target.as_gl_target(), 0);\n+        program.disable_attribute_arrays()\n     }\n-}\n \n-// Layer rendering\n-pub trait Render {\n-    fn render(&self,\n-              render_context: RenderContext,\n-              transform: Matrix4,\n-              scene_size: Size2D<f32>,\n-              mut clip_rect: Option<Rect<f32>>,\n-              content_offset: Point2D<f32>,\n-              opacity: f32);\n-}\n+    pub fn bind_and_render_quad_lines(&self,\n+                                      vertices: &[ColorVertex; 5],\n+                                      transform: &Matrix4,\n+                                      projection: &Matrix4,\n+                                      color: &Color,\n+                                      line_thickness: usize) {\n+        self.solid_color_program.enable_attribute_arrays();\n+        gl::use_program(self.solid_color_program.program.id);\n+        self.solid_color_program.bind_uniforms_and_attributes_for_lines(vertices,\n+                                                                        transform,\n+                                                                        projection,\n+                                                                        &self.buffers,\n+                                                                        color);\n+        gl::line_width(line_thickness as GLfloat);\n+        gl::draw_arrays(gl::LINE_STRIP, 0, 5);\n+        self.solid_color_program.disable_attribute_arrays();\n+    }\n \n-impl<T> Render for layers::Layer<T> {\n-    fn render(&self,\n-              render_context: RenderContext,\n-              transform: Matrix4,\n-              scene_size: Size2D<f32>,\n-              mut clip_rect: Option<Rect<f32>>,\n-              _: Point2D<f32>,\n-              _: f32) {\n-        let bounds = self.bounds.borrow().to_untyped();\n-        let cumulative_transform = transform.translate(bounds.origin.x, bounds.origin.y, 0.0);\n-        let tile_transform = cumulative_transform.mul(&*self.transform.borrow());\n-        let content_offset = self.content_offset.borrow().to_untyped();\n-        let opacity = *self.opacity.borrow();\n-\n-        if self.background_color.borrow().a != 0.0 {\n-            let background_transform = tile_transform.scale(bounds.size.width,\n-                                                            bounds.size.height,\n-                                                            1.0);\n-            let background_unit_rect = map_clip_to_unit_rectangle(bounds.translate(&content_offset),\n-                                                                  clip_rect);\n-            bind_and_render_solid_quad(render_context,\n-                                       &background_transform,\n-                                       scene_size,\n-                                       *self.background_color.borrow(),\n-                                       background_unit_rect);\n-        }\n+    fn render_layer<T>(&self,\n+                       layer: Rc<Layer<T>>,\n+                       transform: &Matrix4,\n+                       projection: &Matrix4,\n+                       clip_rect: Option<Rect<f32>>,\n+                       gfx_context: &NativeCompositingGraphicsContext) {\n+        let ts = layer.transform_state.borrow();\n \n-        self.create_textures(&render_context.compositing_context);\n-        self.do_for_all_tiles(|tile: &Tile| {\n-            tile.render(render_context,\n-                        tile_transform,\n-                        scene_size,\n-                        clip_rect,\n-                        content_offset,\n-                        opacity)\n-        });\n+        let transform = transform.mul(&ts.final_transform);\n \n-        if render_context.show_debug_borders {\n-            let quad_transform = tile_transform.scale(bounds.size.width, bounds.size.height, 1.);\n-            bind_and_render_quad_lines(render_context,\n-                                       &quad_transform,\n-                                       scene_size,\n-                                       LAYER_DEBUG_BORDER_COLOR,\n-                                       LAYER_DEBUG_BORDER_THICKNESS);\n-        }\n+        let background_color = *layer.background_color.borrow();\n \n-        if *self.masks_to_bounds.borrow() {\n-            clip_rect = match clip_rect {\n-                Some(ref clip_rect) => clip_rect.intersection(&bounds),\n-                None => Some(bounds),\n-            };\n+        // Create native textures for this layer\n+        layer.create_textures(gfx_context);\n \n-            // We move our clipping rectangle into the coordinate system of child layers\n-            // and also account for the content offset, so that we can test based on\n-            // the final screen position.\n-            clip_rect = match clip_rect {\n-                Some(ref clip_rect) => {\n-                    let clip_offset = content_offset - bounds.origin;\n-                    Some(clip_rect.translate(&clip_offset))\n-                },\n-                None => return, // Don't render children, because we have an empty clip rect.\n-            };\n-        }\n+        let layer_rect = clip_rect.map_or(Some(ts.world_rect), |clip_rect| {\n+            clip_rect.intersection(&ts.world_rect)\n+        });\n \n-        for child in self.children().iter() {\n-            child.render(render_context,\n-                         cumulative_transform,\n-                         scene_size,\n-                         clip_rect,\n-                         Point2D::new(0., 0.),\n-                         opacity)\n-        }\n+        if let Some(layer_rect) = layer_rect {\n+            let lx0 = layer_rect.origin.x;\n+            let ly0 = layer_rect.origin.y;\n+            let lx1 = layer_rect.origin.x + layer_rect.size.width;\n+            let ly1 = layer_rect.origin.y + layer_rect.size.height;\n+\n+            if background_color.a != 0.0 {\n+                let bg_vertices = [\n+                    ColorVertex::new(lx0, ly0),\n+                    ColorVertex::new(lx1, ly0),\n+                    ColorVertex::new(lx0, ly1),\n+                    ColorVertex::new(lx1, ly1),\n+                ];\n+\n+                self.bind_and_render_solid_quad(&bg_vertices,\n+                                                &transform,\n+                                                &projection,\n+                                                &background_color);\n+            }\n \n+            layer.do_for_all_tiles(|tile: &Tile| {\n+                if !tile.texture.is_zero() && tile.bounds.is_some() {\n+                    let opacity = *layer.opacity.borrow();\n+\n+                    let tile_rect = tile.bounds.unwrap()\n+                                               .to_untyped()\n+                                               .translate(&ts.world_rect.origin);\n+                    let clipped_tile_rect = clip_rect.map_or(Some(tile_rect), |clip_rect| {\n+                        clip_rect.intersection(&tile_rect)\n+                    });\n+\n+                    if let Some(clipped_tile_rect) = clipped_tile_rect {\n+                        let tx0 = tile_rect.origin.x;\n+                        let ty0 = tile_rect.origin.y;\n+\n+                        let cx0 = clipped_tile_rect.origin.x;\n+                        let cx1 = clipped_tile_rect.origin.x + clipped_tile_rect.size.width;\n+                        let cy0 = clipped_tile_rect.origin.y;\n+                        let cy1 = clipped_tile_rect.origin.y + clipped_tile_rect.size.height;","path":"src/rendergl.rs","position":745,"original_position":745,"commit_id":"0d7fe2b53b9e1d8d7e768a3ce9338194a9eb3d92","original_commit_id":"0d7fe2b53b9e1d8d7e768a3ce9338194a9eb3d92","user":{"login":"pcwalton","id":157897,"avatar_url":"https://avatars.githubusercontent.com/u/157897?v=3","gravatar_id":"","url":"https://api.github.com/users/pcwalton","html_url":"https://github.com/pcwalton","followers_url":"https://api.github.com/users/pcwalton/followers","following_url":"https://api.github.com/users/pcwalton/following{/other_user}","gists_url":"https://api.github.com/users/pcwalton/gists{/gist_id}","starred_url":"https://api.github.com/users/pcwalton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pcwalton/subscriptions","organizations_url":"https://api.github.com/users/pcwalton/orgs","repos_url":"https://api.github.com/users/pcwalton/repos","events_url":"https://api.github.com/users/pcwalton/events{/privacy}","received_events_url":"https://api.github.com/users/pcwalton/received_events","type":"User","site_admin":false},"body":"Use `.max_y()`","created_at":"2015-06-22T17:58:41Z","updated_at":"2015-06-22T17:58:41Z","html_url":"https://github.com/servo/rust-layers/pull/182#discussion_r32963466","pull_request_url":"https://api.github.com/repos/servo/rust-layers/pulls/182","_links":{"self":{"href":"https://api.github.com/repos/servo/rust-layers/pulls/comments/32963466"},"html":{"href":"https://github.com/servo/rust-layers/pull/182#discussion_r32963466"},"pull_request":{"href":"https://api.github.com/repos/servo/rust-layers/pulls/182"}}},"pull_request":{"url":"https://api.github.com/repos/servo/rust-layers/pulls/182","id":38067959,"html_url":"https://github.com/servo/rust-layers/pull/182","diff_url":"https://github.com/servo/rust-layers/pull/182.diff","patch_url":"https://github.com/servo/rust-layers/pull/182.patch","issue_url":"https://api.github.com/repos/servo/rust-layers/issues/182","number":182,"state":"open","locked":false,"title":"Implement enough of 3d transforms spec to run the CSS FPS demo.","user":{"login":"glennw","id":2350882,"avatar_url":"https://avatars.githubusercontent.com/u/2350882?v=3","gravatar_id":"","url":"https://api.github.com/users/glennw","html_url":"https://github.com/glennw","followers_url":"https://api.github.com/users/glennw/followers","following_url":"https://api.github.com/users/glennw/following{/other_user}","gists_url":"https://api.github.com/users/glennw/gists{/gist_id}","starred_url":"https://api.github.com/users/glennw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/glennw/subscriptions","organizations_url":"https://api.github.com/users/glennw/orgs","repos_url":"https://api.github.com/users/glennw/repos","events_url":"https://api.github.com/users/glennw/events{/privacy}","received_events_url":"https://api.github.com/users/glennw/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-06-19T00:42:53Z","updated_at":"2015-06-22T17:58:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c282d99107bb5b071aedbd91c1a1172f34272b54","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/servo/rust-layers/pulls/182/commits","review_comments_url":"https://api.github.com/repos/servo/rust-layers/pulls/182/comments","review_comment_url":"https://api.github.com/repos/servo/rust-layers/pulls/comments{/number}","comments_url":"https://api.github.com/repos/servo/rust-layers/issues/182/comments","statuses_url":"https://api.github.com/repos/servo/rust-layers/statuses/0d7fe2b53b9e1d8d7e768a3ce9338194a9eb3d92","head":{"label":"glennw:3d-transforms","ref":"3d-transforms","sha":"0d7fe2b53b9e1d8d7e768a3ce9338194a9eb3d92","user":{"login":"glennw","id":2350882,"avatar_url":"https://avatars.githubusercontent.com/u/2350882?v=3","gravatar_id":"","url":"https://api.github.com/users/glennw","html_url":"https://github.com/glennw","followers_url":"https://api.github.com/users/glennw/followers","following_url":"https://api.github.com/users/glennw/following{/other_user}","gists_url":"https://api.github.com/users/glennw/gists{/gist_id}","starred_url":"https://api.github.com/users/glennw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/glennw/subscriptions","organizations_url":"https://api.github.com/users/glennw/orgs","repos_url":"https://api.github.com/users/glennw/repos","events_url":"https://api.github.com/users/glennw/events{/privacy}","received_events_url":"https://api.github.com/users/glennw/received_events","type":"User","site_admin":false},"repo":{"id":24618928,"name":"rust-layers","full_name":"glennw/rust-layers","owner":{"login":"glennw","id":2350882,"avatar_url":"https://avatars.githubusercontent.com/u/2350882?v=3","gravatar_id":"","url":"https://api.github.com/users/glennw","html_url":"https://github.com/glennw","followers_url":"https://api.github.com/users/glennw/followers","following_url":"https://api.github.com/users/glennw/following{/other_user}","gists_url":"https://api.github.com/users/glennw/gists{/gist_id}","starred_url":"https://api.github.com/users/glennw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/glennw/subscriptions","organizations_url":"https://api.github.com/users/glennw/orgs","repos_url":"https://api.github.com/users/glennw/repos","events_url":"https://api.github.com/users/glennw/events{/privacy}","received_events_url":"https://api.github.com/users/glennw/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/glennw/rust-layers","description":"A GPU-accelerated 2D animation library for Rust","fork":true,"url":"https://api.github.com/repos/glennw/rust-layers","forks_url":"https://api.github.com/repos/glennw/rust-layers/forks","keys_url":"https://api.github.com/repos/glennw/rust-layers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/glennw/rust-layers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/glennw/rust-layers/teams","hooks_url":"https://api.github.com/repos/glennw/rust-layers/hooks","issue_events_url":"https://api.github.com/repos/glennw/rust-layers/issues/events{/number}","events_url":"https://api.github.com/repos/glennw/rust-layers/events","assignees_url":"https://api.github.com/repos/glennw/rust-layers/assignees{/user}","branches_url":"https://api.github.com/repos/glennw/rust-layers/branches{/branch}","tags_url":"https://api.github.com/repos/glennw/rust-layers/tags","blobs_url":"https://api.github.com/repos/glennw/rust-layers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/glennw/rust-layers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/glennw/rust-layers/git/refs{/sha}","trees_url":"https://api.github.com/repos/glennw/rust-layers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/glennw/rust-layers/statuses/{sha}","languages_url":"https://api.github.com/repos/glennw/rust-layers/languages","stargazers_url":"https://api.github.com/repos/glennw/rust-layers/stargazers","contributors_url":"https://api.github.com/repos/glennw/rust-layers/contributors","subscribers_url":"https://api.github.com/repos/glennw/rust-layers/subscribers","subscription_url":"https://api.github.com/repos/glennw/rust-layers/subscription","commits_url":"https://api.github.com/repos/glennw/rust-layers/commits{/sha}","git_commits_url":"https://api.github.com/repos/glennw/rust-layers/git/commits{/sha}","comments_url":"https://api.github.com/repos/glennw/rust-layers/comments{/number}","issue_comment_url":"https://api.github.com/repos/glennw/rust-layers/issues/comments{/number}","contents_url":"https://api.github.com/repos/glennw/rust-layers/contents/{+path}","compare_url":"https://api.github.com/repos/glennw/rust-layers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/glennw/rust-layers/merges","archive_url":"https://api.github.com/repos/glennw/rust-layers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/glennw/rust-layers/downloads","issues_url":"https://api.github.com/repos/glennw/rust-layers/issues{/number}","pulls_url":"https://api.github.com/repos/glennw/rust-layers/pulls{/number}","milestones_url":"https://api.github.com/repos/glennw/rust-layers/milestones{/number}","notifications_url":"https://api.github.com/repos/glennw/rust-layers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/glennw/rust-layers/labels{/name}","releases_url":"https://api.github.com/repos/glennw/rust-layers/releases{/id}","created_at":"2014-09-30T00:56:54Z","updated_at":"2014-10-17T03:49:38Z","pushed_at":"2015-06-20T03:08:03Z","git_url":"git://github.com/glennw/rust-layers.git","ssh_url":"git@github.com:glennw/rust-layers.git","clone_url":"https://github.com/glennw/rust-layers.git","svn_url":"https://github.com/glennw/rust-layers","homepage":null,"size":750,"stargazers_count":0,"watchers_count":0,"language":"Rust","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"servo:master","ref":"master","sha":"65001b9e18631172a457c31c04be990639c02c35","user":{"login":"servo","id":2566135,"avatar_url":"https://avatars.githubusercontent.com/u/2566135?v=3","gravatar_id":"","url":"https://api.github.com/users/servo","html_url":"https://github.com/servo","followers_url":"https://api.github.com/users/servo/followers","following_url":"https://api.github.com/users/servo/following{/other_user}","gists_url":"https://api.github.com/users/servo/gists{/gist_id}","starred_url":"https://api.github.com/users/servo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/servo/subscriptions","organizations_url":"https://api.github.com/users/servo/orgs","repos_url":"https://api.github.com/users/servo/repos","events_url":"https://api.github.com/users/servo/events{/privacy}","received_events_url":"https://api.github.com/users/servo/received_events","type":"Organization","site_admin":false},"repo":{"id":4827716,"name":"rust-layers","full_name":"servo/rust-layers","owner":{"login":"servo","id":2566135,"avatar_url":"https://avatars.githubusercontent.com/u/2566135?v=3","gravatar_id":"","url":"https://api.github.com/users/servo","html_url":"https://github.com/servo","followers_url":"https://api.github.com/users/servo/followers","following_url":"https://api.github.com/users/servo/following{/other_user}","gists_url":"https://api.github.com/users/servo/gists{/gist_id}","starred_url":"https://api.github.com/users/servo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/servo/subscriptions","organizations_url":"https://api.github.com/users/servo/orgs","repos_url":"https://api.github.com/users/servo/repos","events_url":"https://api.github.com/users/servo/events{/privacy}","received_events_url":"https://api.github.com/users/servo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/servo/rust-layers","description":"A GPU-accelerated 2D animation library for Rust","fork":false,"url":"https://api.github.com/repos/servo/rust-layers","forks_url":"https://api.github.com/repos/servo/rust-layers/forks","keys_url":"https://api.github.com/repos/servo/rust-layers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/servo/rust-layers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/servo/rust-layers/teams","hooks_url":"https://api.github.com/repos/servo/rust-layers/hooks","issue_events_url":"https://api.github.com/repos/servo/rust-layers/issues/events{/number}","events_url":"https://api.github.com/repos/servo/rust-layers/events","assignees_url":"https://api.github.com/repos/servo/rust-layers/assignees{/user}","branches_url":"https://api.github.com/repos/servo/rust-layers/branches{/branch}","tags_url":"https://api.github.com/repos/servo/rust-layers/tags","blobs_url":"https://api.github.com/repos/servo/rust-layers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/servo/rust-layers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/servo/rust-layers/git/refs{/sha}","trees_url":"https://api.github.com/repos/servo/rust-layers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/servo/rust-layers/statuses/{sha}","languages_url":"https://api.github.com/repos/servo/rust-layers/languages","stargazers_url":"https://api.github.com/repos/servo/rust-layers/stargazers","contributors_url":"https://api.github.com/repos/servo/rust-layers/contributors","subscribers_url":"https://api.github.com/repos/servo/rust-layers/subscribers","subscription_url":"https://api.github.com/repos/servo/rust-layers/subscription","commits_url":"https://api.github.com/repos/servo/rust-layers/commits{/sha}","git_commits_url":"https://api.github.com/repos/servo/rust-layers/git/commits{/sha}","comments_url":"https://api.github.com/repos/servo/rust-layers/comments{/number}","issue_comment_url":"https://api.github.com/repos/servo/rust-layers/issues/comments{/number}","contents_url":"https://api.github.com/repos/servo/rust-layers/contents/{+path}","compare_url":"https://api.github.com/repos/servo/rust-layers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/servo/rust-layers/merges","archive_url":"https://api.github.com/repos/servo/rust-layers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/servo/rust-layers/downloads","issues_url":"https://api.github.com/repos/servo/rust-layers/issues{/number}","pulls_url":"https://api.github.com/repos/servo/rust-layers/pulls{/number}","milestones_url":"https://api.github.com/repos/servo/rust-layers/milestones{/number}","notifications_url":"https://api.github.com/repos/servo/rust-layers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/servo/rust-layers/labels{/name}","releases_url":"https://api.github.com/repos/servo/rust-layers/releases{/id}","created_at":"2012-06-29T01:42:23Z","updated_at":"2015-06-17T12:56:34Z","pushed_at":"2015-06-20T03:08:04Z","git_url":"git://github.com/servo/rust-layers.git","ssh_url":"git@github.com:servo/rust-layers.git","clone_url":"https://github.com/servo/rust-layers.git","svn_url":"https://github.com/servo/rust-layers","homepage":null,"size":1963,"stargazers_count":29,"watchers_count":29,"language":"Rust","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":28,"mirror_url":null,"open_issues_count":4,"forks":28,"open_issues":4,"watchers":29,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/servo/rust-layers/pulls/182"},"html":{"href":"https://github.com/servo/rust-layers/pull/182"},"issue":{"href":"https://api.github.com/repos/servo/rust-layers/issues/182"},"comments":{"href":"https://api.github.com/repos/servo/rust-layers/issues/182/comments"},"review_comments":{"href":"https://api.github.com/repos/servo/rust-layers/pulls/182/comments"},"review_comment":{"href":"https://api.github.com/repos/servo/rust-layers/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/servo/rust-layers/pulls/182/commits"},"statuses":{"href":"https://api.github.com/repos/servo/rust-layers/statuses/0d7fe2b53b9e1d8d7e768a3ce9338194a9eb3d92"}}}}