From 87c5c2726c130aab12c6c1808dca00c01c4c970a Mon Sep 17 00:00:00 2001 From: Matt Watson Date: Wed, 7 Aug 2013 17:59:30 -0700 Subject: Fixed the pixbuf sizing on the category images Before it was just for the big title image. Moved the function to utils so we didn't have the same code in two places. Also removed some clutter stuff from utils as there was no reason for that [endlessm/eos-sdk#247] --- wikipedia/utils.js | 57 ++++++++++++++++--------------------- wikipedia/views/category_button.js | 24 ++++------------ wikipedia/views/title_label_view.js | 31 ++++---------------- 3 files changed, 34 insertions(+), 78 deletions(-) (limited to 'wikipedia') diff --git a/wikipedia/utils.js b/wikipedia/utils.js index 404f412..f08deed 100644 --- a/wikipedia/utils.js +++ b/wikipedia/utils.js @@ -162,39 +162,30 @@ const array_contains = function (arr, obj, same_type) { return false; }; -// Convenience function to parse a clutter color from a string -function parse_clutter_color(color_string) { - let [res, color] = Clutter.Color.from_string(color_string); - return color; -} - -// Convenience function to load a gresource image into a Clutter.Image -function load_clutter_image_from_resource(resource_path) { - let pixbuf = GdkPixbuf.Pixbuf.new_from_resource(resource_path); - let image = new Clutter.Image(); - if (pixbuf != null) { - image.set_data(pixbuf.get_pixels(), - pixbuf.get_has_alpha() - ? Cogl.PixelFormat.RGBA_8888 - : Cogl.PixelFormat.RGB_888, - pixbuf.get_width(), - pixbuf.get_height(), - pixbuf.get_rowstride()); - } - return image; -} - -// Private function to format a clutter actors allocation and print it -function _clutter_allocation_printer(actor, box, flag) { - print("Allocation for", actor); - print(" Xs:", box.x1, box.x2); - print(" Ys:", box.y1, box.y2); -} - -// Call this function on a clutter actor to have it log it's allocation to -// console -function print_clutter_actor_allocation(actor) { - actor.connect('allocation-changed', _clutter_allocation_printer); +/* + * Loads a pixbuf sized to cover the dest_width and dest_height with the + * image in res_path, while mataining the aspect ratio of the image + */ +function load_pixbuf_cover(res_path, dest_width, dest_height) { + let [load_width, load_height] = [dest_width, dest_height]; + // TODO: We need to get the size of the source image, so right now we + // are loading the image twice, once to get the size, and the again at + // the proper size. We should eventually use a GdkPixbuf.Loader and + // connect to the size-prepared signal, as described in the + // documentation + let temp_pixbuf = GdkPixbuf.Pixbuf.new_from_resource(res_path); + let source_aspect = temp_pixbuf.width / temp_pixbuf.height; + let dest_aspect = dest_width / dest_height; + if(dest_aspect > source_aspect) + load_height = -1; + else + load_width = -1; + let source_pixbuf = GdkPixbuf.Pixbuf.new_from_resource_at_scale(res_path, + load_width, load_height, true); + let cropped_pixbuf = source_pixbuf; + if(dest_width < source_pixbuf.width || dest_height < source_pixbuf.height) + cropped_pixbuf = source_pixbuf.new_subpixbuf(0, 0, dest_width, dest_height); + return cropped_pixbuf; } // Convenience function to convert a resource URI to a resource path, for diff --git a/wikipedia/views/category_button.js b/wikipedia/views/category_button.js index 0761a58..7fde6a1 100644 --- a/wikipedia/views/category_button.js +++ b/wikipedia/views/category_button.js @@ -112,9 +112,10 @@ const CategoryButton = new Lang.Class({ set image_uri(value) { this._image_uri = value; if(this._image) { - let res_path = Utils.resourceUriToPath(value); let allocation = this.get_allocation(); - this._updateImage(res_path, allocation.width, allocation.height); + let new_pixbuf = Utils.load_pixbuf_cover(Utils.resourceUriToPath(this._image_uri), + allocation.width, allocation.height); + this._image.set_from_pixbuf(new_pixbuf); } }, @@ -132,29 +133,14 @@ const CategoryButton = new Lang.Class({ vfunc_size_allocate: function(allocation) { this.parent(allocation); - this._updateImage(Utils.resourceUriToPath(this._image_uri), + let new_pixbuf = Utils.load_pixbuf_cover(Utils.resourceUriToPath(this._image_uri), allocation.width, allocation.height); + this._image.set_from_pixbuf(new_pixbuf); }, // HANDLERS _onButtonPress: function(widget, event) { this.emit('clicked') - }, - - // PRIVATE - - _updateImage: function(res_path, width, height) { - let [source_width, source_height] = [width, height]; - if(width > height) - source_height = -1; - else - source_width = -1; - let source_pixbuf = GdkPixbuf.Pixbuf.new_from_resource_at_scale(res_path, - source_width, source_height, true); - let cropped_pixbuf = source_pixbuf; - if(width < source_pixbuf.width || height < source_pixbuf.height) - cropped_pixbuf = source_pixbuf.new_subpixbuf(0, 0, width, height); - this._image.set_from_pixbuf(cropped_pixbuf); } }); diff --git a/wikipedia/views/title_label_view.js b/wikipedia/views/title_label_view.js index 8ea821b..479747d 100644 --- a/wikipedia/views/title_label_view.js +++ b/wikipedia/views/title_label_view.js @@ -60,8 +60,9 @@ const TitleLabelView = new Lang.Class({ vfunc_size_allocate: function(allocation) { this.parent(allocation); if(this._image_uri !== "" && this._image_uri != null) { - this._updateImage(Utils.resourceUriToPath(this._image_uri), + let new_pixbuf = Utils.load_pixbuf_cover(Utils.resourceUriToPath(this._image_uri), allocation.width, allocation.height); + this._image.set_from_pixbuf(new_pixbuf); } }, @@ -86,31 +87,9 @@ const TitleLabelView = new Lang.Class({ if(this._image) { let res_path = Utils.resourceUriToPath(value); let allocation = this.get_allocation(); - this._updateImage(res_path, allocation.width, allocation.height); + let new_pixbuf = Utils.load_pixbuf_cover(Utils.resourceUriToPath(this._image_uri), + allocation.width, allocation.height); + this._image.set_from_pixbuf(new_pixbuf); } - }, - - // PRIVATE - - _updateImage: function(res_path, dest_width, dest_height) { - let [source_width, source_height] = [dest_width, dest_height]; - // TODO: We need to get the size of the source image, so right now we - // are loading the image twice, once to get the size, and the again at - // the proper size. We should eventually use a GdkPixbuf.Loader and - // connect to the size-prepared signal, as described in the - // documentation - let temp_pixbuf = GdkPixbuf.Pixbuf.new_from_resource(res_path); - let source_aspect = temp_pixbuf.width / temp_pixbuf.height; - let dest_aspect = dest_width / dest_height; - if(dest_aspect > source_aspect) - source_height = -1; - else - source_width = -1; - let source_pixbuf = GdkPixbuf.Pixbuf.new_from_resource_at_scale(res_path, - source_width, source_height, true); - let cropped_pixbuf = source_pixbuf; - if(dest_width < source_pixbuf.width || dest_height < source_pixbuf.height) - cropped_pixbuf = source_pixbuf.new_subpixbuf(0, 0, dest_width, dest_height); - this._image.set_from_pixbuf(cropped_pixbuf); } }); -- cgit v1.2.3