Needed because a group layer's projection can have a different type
than its image, at least at some pathologic moment during image type
conversion. But even if it didn't, it's cleaner this way anyway.
* app/core/gimpprojectable.[ch]: add the new vfunc plus public API.
* app/core/gimpprojection.c: use it instead of using the type of the
image returned by gimp_projectable_get_image(). The get_image()
function is now unused in the projection and only needs to stay
because the projection is also a GimpPickable.
* app/core/gimpgrouplayer.c: implement GimpProjectable::get_image_type().
When the projectable's size or image type changes, stop the idle
renderer and remove all queued update area because everything needs to
be re-rendered anyway. Also honor the projectable's offset when
invalidating the entire projection after clearing the pyramid.
The only purpose of this change is to avoid having the "update"
signal twice on GimpGroupLayer (from GimpDrawable and from
GimpProjectable). Switch back to normal g_signal_connect()
in the projection.
Add/Subtract the projectable's offset whenever we go from coordinates
from our public interface (which are always image coordinates) and
coordinates in out internal tile pyramid (wihch always starts at 0,0).
The Gegl projection still needs an offset node that is missing.
Also, connect to the projectable's "update" signal using
g_signal_connect_closure_by_id() instead of simply g_signal_connect(),
so we really connect to the signal of the GimpProjectable interface
and not to the "update" signal of GimpDrawable (which is a conflict
that will happen on group layers).
(gimp_projection_validate_tile): fix stupid braino that made the
recently added optimization loop infinitely on images with a width
that is a multiple of TILE_WIDTH.
2009-01-17 Michael Natterer <mitch@gimp.org>
* all files with a GPL header and all COPYING files:
Change licence to GPLv3 (and to LGPLv3 for libgimp).
Cleaned up some copyright headers and regenerated the parsers in
the ImageMap plugin.
svn path=/trunk/; revision=27913
2008-12-08 Sven Neumann <sven@gimp.org>
* app/core/gimpchannel.c
* app/core/gimpdrawable-operation.c
* app/core/gimpdrawablestack.c
* app/core/gimpimage.c
* app/core/gimpimagemap.c
* app/core/gimplayer.c
* app/core/gimpprojection.c: gegl_node_add_child() and
gegl_node_remove_child() are public API in GEGL now.
svn path=/trunk/; revision=27770
2008-11-10 Michael Natterer <mitch@gimp.org>
* app/core/gimpprojection.[ch]
* app/core/gimpprojection-construct.c: add code that keeps the
gegl processor around across calls, but destroy it anyway until
gegl_processor_set_rectangle() is fixed.
svn path=/trunk/; revision=27607
2008-11-05 Michael Natterer <mitch@gimp.org>
This should remove any image or viewable dependency from the
projection (apart from the projectable's get_image() method, but
that one is not supposed to return the projection's model but
rather the image the projection is part of).
* app/core/gimpprojectable.[ch]: add vfunc get_size() which
completes the API needed for GEGL projection.
Add vfuncs get_layers(), get_channels(), get_components() and
get_colormap() which are needed for the legacy projection code.
* app/core/gimpimage.c: implement the new methods.
* app/core/gimpprojection.c
* app/core/gimpprojection-construct.c: use them and remove all
calls to image and viewable API.
svn path=/trunk/; revision=27558
2008-11-05 Michael Natterer <mitch@gimp.org>
* app/core/gimpprojectable.[ch]: add signal "structure-changed"
and API to emit it.
* app/core/gimpimage.c: emit it when the image emits
"mode-changed" and "size-changed".
* app/core/gimpprojection.c: connect to the new signal instead of
"mode-changed" and "size-changed" to get rid of one more image
dependency.
svn path=/trunk/; revision=27556
2008-11-04 Michael Natterer <mitch@gimp.org>
* app/core/gimpprojectable.[ch]: add vitrual function
invalidate_preview().
* app/core/gimpimage.c: implement it and redirect to
gimp_viewable_invalidate_preview().
* app/core/gimpprojection.c: call the new API instead of
gimp_viewable_invalidate_preview(). Some cleanup in the disabled
cow-projection code.
svn path=/trunk/; revision=27553
2008-11-04 Michael Natterer <mitch@gimp.org>
Unfinished first step to make the projection independent of
GimpImage, also one step closer to layer grouping.
* app/core/Makefile.am
* app/core/core-types.h
* app/core/gimpprojectable.[ch]: add new interface which abstracts
something that can have a projection attached to it. Has "update"
and "flush" signals and get_graph() and get_image()
vfuncs. get_image() is temporary until the hack is finishes.
* app/core/gimpimage.[ch]: implement GimpProjectableInterface,
remove "update" and "flush" signals and made get_graph() a private
implementation of the interface method. Moved interface method
implementations after virtual function implementations.
* app/core/gimpprojection.[ch]: change member "image" to
"projectable" and use the projectable API as often as
possible. Still some implicit dependencies on the projectable
being an image left but it's getting close.
* app/core/gimpprojection-construct.c: same here.
svn path=/trunk/; revision=27552
2008-11-04 Sven Neumann <sven@sven>
* app/base/tile-pyramid.[ch] (tile_pyramid_new):
* app/core/gimpprojection.c
(gimp_projection_get_tiles_at_level):
reverted last change as the code in tile-pyramid does care about
the pixel format and it should continue to reject types that it
cannot handle.
svn path=/trunk/; revision=27545
2008-11-04 Michael Natterer <mitch@gimp.org>
* app/base/tile-pyramid.[ch] (tile_pyramid_new): changed "type"
parameter into "bytes" because tile managers don't care about
the pixel format of their tiles. Reordered parameters to match
tile_manager_new().
* app/core/gimpprojection.c (gimp_projection_get_tiles_at_level):
pass the bytes instead of the image type.
svn path=/trunk/; revision=27544
* app/gegl/gimpoperation*.c: Prefix the GIMP GEGL operations with
"gimp:" instead of "gimp-" so we follow the GEGL prefix style and
better serialize to XML.
* app/tools/gimp*tool.c
* app/core/gimpdrawable-*.c
* app/core/gimpdrawable.c
* app/core/gimpimagemap.c
* app/core/gimpprojection.c: Changed accordingly.
svn path=/trunk/; revision=27512
2008-10-10 Michael Natterer <mitch@gimp.org>
Bug 554983 – Layers Projection using GEGL
First projection using GEGL, wheeeee. Disabled by default because
it doesn't work with floating selection (and will not, FS
refactoring is in the queue).
* app/core/gimpimage.[ch]: add gimp_image_get_graph() which
returns a GeglNode representing the image's projection.
(gimp_image_add_layer_node)
(gimp_image_remove_layer_node): new utility functions to add and
remove layer nodes to/from the graph.
(gimp_image_add_layer)
(gimp_image_remove_layer)
(gimp_image_position_layer): call them to keep the graph up to date.
* app/core/gimpdrawable.c (gimp_drawable_real_update): invalidate
the source node.
* app/core/gimpprojection.[ch]: keep a projection graph around and
add gimp_projection_get_sink_node() which returns the node that
writes to the projection tiles.
* app/core/gimpprojection-construct.c: add
gimp_projection_construct_gegl() which is a few-liner that uses a
GeglProcessor to run the projection graph.
(gimp_projection_construct): call the new function (disabled by
default).
svn path=/trunk/; revision=27207
2008-10-09 Michael Natterer <mitch@gimp.org>
Add GEGL_CFLAGS and #includes as if gimpdrawable.h and gimpimage.h
had a GEGL dependency (they will have in the next commit, but I
wanted to keep the commit separate).
* app/dialogs/Makefile.am
* app/file/Makefile.am
* app/gui/Makefile.am
* app/menus/Makefile.am
* app/paint/Makefile.am
* app/plug-in/Makefile.am
* app/text/Makefile.am
* app/vectors/Makefile.am
* app/widgets/Makefile.am
* app/xcf/Makefile.am: add GEGL_CFLAGS.
* app/actions/*.c
* app/core/*.c
* app/dialogs/*.c
* app/display/*.c
* app/file/*.c
* app/gui/*.c
* app/menus/*.c
* app/paint/*.c
* app/pdb/gimppdb-utils.c
* app/pdb/gimpprocedure.c
* app/plug-in/*.c
* app/text/*.c
* app/tools/*.c
* app/vectors/*.c
* app/widgets/*.c
* app/xcf/*.c: add <gegl.h> or replace <glib-object.h> by <gegl.h>
to all files which include a drawable subclass or gimpimage.h
* tools/pdbgen/app.pl: include <gegl.h> instead of <glib-object.h>
in all generated files.
* app/pdb/*-cmds.c: regenerated.
* data/images/gimp-splash.png: the goat is still sleeping.
By Aurore Derriennic.
svn path=/trunk/; revision=27202
2008-08-12 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c (gimp_projection_paint_area): moved
function calls out of CLAMP macros.
svn path=/trunk/; revision=26520
2008-01-22 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c (gimp_projection_idle_render_init):
decreased the priority of the projection idle renderer to 150,
halfway between G_PRIORITY_HIGH_IDLE and
G_PRIORITY_DEFAULT_IDLE.
Fixes bug #511214.
svn path=/trunk/; revision=24680
2007-12-13 Sven Neumann <sven@gimp.org>
Speed up our display rendering code paths by keeping data with
pre-multiplied alpha where possible. The projection tile-manager
at 100 % zoom is not affected. So we can still always get the
non-pre-multiplied pixel data.
* app/core/gimpprojection.[ch]: removed
gimp_projection_get_opacity(), the projection is always opaque.
* app/base/tile-pyramid.[ch]: use pre-multiplied alpha for the
upper levels of the pyramid. This speeds up validation of the
upper levels significantly.
* app/base/temp-buf.[ch]: added temp_buf_demultiply().
* app/core/gimpimage-preview.c: demultiply the preview temp-buf
obtained from the projection's tile tyramid.
* app/display/gimpdisplayshell-draw.c
* app/display/gimpdisplayshell-render.c: added code to deal with
pre-multiplied data. In fact all data returned by
render_image_tile_fault() is now pre-multiplied so that
render_image_rgb_a() and render_image_gray_a() don't need to use
the large lookup tables from gimprender.[ch] any longer.
svn path=/trunk/; revision=24352
2007-11-29 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c (gimp_projection_idle_render_init):
raise the priority of the idle renderer to
G_PRIORITY_DEFAULT_IDLE.
Should fix bug #499150.
svn path=/trunk/; revision=24241
2007-08-02 Michael Natterer <mitch@gimp.org>
Make sure image thumbnails that are saved or given to plugins are
constructed synchronously. Fixes bug #461703.
* app/core/gimpprojection.c (gimp_projection_pickable_flush):
invalidate the preview after constructing the projection.
* app/core/gimpimagefile.c (gimp_imagefile_save_thumb)
* tools/pdbgen/pdb/image.pdb (image_thumbnail): call
gimp_pickable_flush() on the projection so is constructed now, not
later.
* app/pdb/image_cmds.c: regenerated.
svn path=/trunk/; revision=23105
2007-06-26 Michael Natterer <mitch@gimp.org>
Invalidate the image preview after the projection is
completely constructed. Fixes bug #449141.
* app/core/gimpmarshal.list: add VOID:BOOLEAN
* app/core/gimpimage.[ch]: add boolean parameter
invalidate_preview to the "flush" signal.
* app/core/gimpprojection.[ch]: add boolean member
invalidate_preview to the GimpProjection struct. Set it to TRUE if
it was TRUE in the image's "flush" signal. When the projection is
completely constructed after a flush, invalidate the image's
preview.
* app/display/gimpdisplay-handlers.c
* app/widgets/gimpitemtreeview.c
* app/widgets/gimpimagedock.c
* app/widgets/gimpimageeditor.c: changed callback signatures
accordingly.
svn path=/trunk/; revision=22840
2007-06-21 Sven Neumann <sven@gimp.org>
* app/base/tile-manager.[ch]: use gboolean for boolean parameters.
* app/base/tile-pyramid.c (tile_pyramid_get_memsize): pass TRUE
for sparse to tile_manager_get_memsize().
* app/base/tile.c
* app/base/tile-swap.c: minor cleanups.
* app/core/gimpprojection.c (gimp_projection_get_tiles_at_level):
inline the creation of the TilePyramid.
svn path=/trunk/; revision=22818
2007-06-20 Sven Neumann <sven@gimp.org>
* app/base/Makefile.am
* app/base/base-types.h
* app/base/tile-pyramid.[ch]: image pyramid code split out of
GimpProjection.
* app/core/gimpprojection.[ch]: use the new TilePyramid.
svn path=/trunk/; revision=22807
2007-06-16 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c (gimp_projection_get_level): take
the
image size into account and return the level that is actually
used.
Fixes bug #448185.
svn path=/trunk/; revision=22792
2007-06-08 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c (gimp_projection_alloc_levels): use
a bit shift instead of a shift and a division.
svn path=/trunk/; revision=22745
2007-06-07 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c (gimp_projection_validate_pyramid_tile):
folded into a single loop.
svn path=/trunk/; revision=22740
2007-06-07 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c (gimp_projection_write_quarter):
weight the pixels by their alpha value.
svn path=/trunk/; revision=22738
2007-06-07 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c: lazily allocate the tile managers of
the image pyramid.
(gimp_projection_write_quarter): minor optimization.
svn path=/trunk/; revision=22736
2007-06-07 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c (gimp_projection_get_level):
reimplemented without using a logarithm.
svn path=/trunk/; revision=22734
2007-06-06 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.[ch]: minor API cleanup. Use
horizontal
and vertical scale to determine the pyramid level to use.
* app/display/gimpdisplayshell-draw.c
* app/display/gimpdisplayshell-render.c: follow the API change.
svn path=/trunk/; revision=22730
2007-06-06 Martin Nordholts <martinn@svn.gnome.org>
Implemented an image pyramid for the GimpProjection. An image pyramid
caches a projection at several sizes, causing the rendering code not to
have to swap in all tiles of a (potentially) large image; it can use
small versions of the projection if the user is zoomed out.
The image pyramid also imroves visual quality, especially at zoom levels
where there is a pyramid level that matches perfectly (i.e. at e.g. 50%,
25%, and 12.5% zoom). A step on the right track for bug #76096.
* app/core/gimpprojection.[ch]: Adjusted to make use of an image
pyramid. GimpProjection now keeps an array of TileManager:s, one per
pyramid level. Renamed _alloc_tiles to _alloc_levels.
* app/display/gimpdisplayshell-draw.c: (gimp_display_shell_draw_area):
Use the right GimpProjection level when drawing
* app/display/gimpdisplayshell-render.c: (render_image_init_info_full):
Setup RenderInfo with level in mind
* app/base/tile-manager.[ch]: Extended API a bit, nothing complicated.
* app/base/tile-manager-private.h (struct _TileManager): Keep a pointer
to the level below for use in an image pyramid.
svn path=/trunk/; revision=22727
2007-06-06 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.c (gimp_projection_estimate_memsize):
the projection is 2 bytes per pixel for grayscale images.
svn path=/trunk/; revision=22723
2007-06-06 Sven Neumann <sven@gimp.org>
* app/core/gimpprojection.[ch]: added function that estimates the
memory requirements for an image projection.
* app/core/gimptemplate.c (gimp_template_notify): use it.
svn path=/trunk/; revision=22721
2007-05-22 Sven Neumann <sven@gimp.org>
* app/core/gimparea.[ch]
* app/core/gimpprojection.c
* app/display/gimpdisplay.c: use GSlice to allocate GimpArea and
sanitize the API.
svn path=/trunk/; revision=22584
2007-05-02 Sven Neumann <sven@gimp.org>
* app/core/gimppickable.[ch]: removed get_color_at() from the
GimpPickable interface. Implement the same functionality using
get_pixel_at() but with a saner API.
* app/core/gimpdrawable.c
* app/core/gimpprojection.c
* app/core/gimpimagemap.c: removed get_color_at() implementations.
* app/tools/gimpbycolorselecttool.c: adapt to API change of
gimp_pickable_get_color_at().
* app/tools/gimprectangleselecttool.c: added missing include.
svn path=/trunk/; revision=22383
2007-04-27 Sven Neumann <sven@gimp.org>
* app/core/gimppickable.[ch]: added get_pixel_at() method to the
GimpPickable interface. This gives direct access to the pixel
without converting it to an RGB color.
* app/core/gimpdrawable.c
* app/core/gimpimagemap.c
* app/core/gimpprojection.c: implement the new method and also use
it to reimplement get_color_at().
* app/core/gimpimage-crop.c (gimp_image_crop_guess_bgcolor): use
gimp_pickable_get_pixel_at(). Fixes auto-shrink on indexed and
grayscale images.
svn path=/trunk/; revision=22359