Commit Graph

382 Commits

Author SHA1 Message Date
980ba7f85a app: move memsize functions into their own files gimp-memsize.[ch] 2014-08-12 13:57:57 +02:00
c88800e840 app: add gimp-priorities.h and keep the most important priorities there
also add comments with all predefined priorities as documentation.
2014-07-02 04:47:24 +02:00
f2b265f751 app: more correct code in gimp_projection_chunk_render_iteration()
wasn't broken before, just too obscure.
2014-06-30 23:12:53 +02:00
3795c597ba app: add gimp_projection_stop_rendering()
which stops a running chunk renderer and moves its remaining
unrendered region back to the projection's dirty region.
2014-06-29 23:57:22 +02:00
ef79cfdade app: Make GIMP_PROJECTION_CHUNK_TIME a gdouble
Otherwise, it's immediately rounded to 0.
2014-06-22 10:38:44 -04:00
3af1fff5af app: make the first image jump to the center of the canvas before rendering
Make GIMP_DISPLAY_SHELL_FILL_IDLE_PRIORITY a bit higher than
GIMP_PROJECTION_IDLE_PRIORITY which is the priority of chunk
rendering.
2014-06-17 23:29:24 +02:00
9f0fde1397 app: add gimp_gegl_pyramid_get_memsize(), used by gimp_projection_get_memsize() 2014-06-15 18:21:05 +02:00
02c9dacc8f app: s/GimpPrecision/GimpComponentType/ in gimp_projection_estimate_memsize() 2014-06-14 23:20:52 +02:00
69b7cda375 app: fix projection and display render chunk-size envvars 2014-06-04 02:07:08 +02:00
2c4d5e4391 app: make projection chunk size and display render chunk size configurable
Set the GIMP_PROJECTION_CHUNK_SIZE and GIMP_DISPLAY_RENDER_BUF_SIZE
environment variables to "WIDTHxHEIGHT".
2014-06-04 01:23:41 +02:00
dcc60e12b6 app: aim for 15fps projection rendering
Allow for more tiles to update, making it possible to see more of the updated
image when tuning paremters / dragging items interactively. Lower frame rate
for more image content is better than 60fps for a small rectangle in the upper
left.
2014-06-03 01:31:02 +02:00
06d91251da Bug 731085 - Dragging an image out of the image area freezes GIMP
In GimpProjection, use gimp_rectangle_intersect() instead of ad-hoc
CLAMP() constructs to sanitize rectangles, and don't let rectangles
enter the projection if they don't intersect with the projectable.

(apparently I have killed some check that did the same when porting
to cairo regions).
2014-06-01 21:30:11 +02:00
49818c7179 app: more cleanup in GimpProjection
Pull freeing the update regions into gimp_projection_free_buffer()
because freeing the buffer definitely obsoletes them. Get rid of
the last x1, y1, x2, y2 and use x, y, w, h inatead.
2014-05-31 15:13:32 +02:00
0b01f3b2b8 app: remove duplicate typedef GimpProjectionPrivate 2014-05-31 09:58:14 +02:00
5db796e17d app: improve code readability in GimpProjection 2014-05-31 02:58:21 +02:00
639319367a app: allow to set a "priority rectangle" on GimpProjection
If it is set, that rectangle gets processed first when
idle-constructing the image via ChunkRender.
2014-05-31 02:34:56 +02:00
f509fce5d2 app: clean up the projections ChunkRender code
Remove member "running" it was always identical to "idle_id != 0".
Rename and reorder variables to make more sense. Simplify
gimp_projection_chunk_render_iteration() work area calculation.
2014-05-31 01:42:28 +02:00
9b341d05bb app: remove GimpArea and use cairo_region_t instead
This may or may not remove some logic that avoids drawing tiny update
regions, and may or may not improve things or make them worse. Will
add code that actually tile-aligns update areas later.
2014-05-31 01:26:06 +02:00
a8f0c0e998 app: move all GimpProjection members to a private struct 2014-05-31 00:08:43 +02:00
db52f88308 app: Set Gimp specific TileHandler properties
Remove a dependency on GEGL setting Gimp specific properties
on custom tile handlers.
2014-02-02 02:12:02 -08:00
697572ccc0 app,libgimp*: fix includes to follow our include policy
- don't include <gdk-pixbuf/gdk-pixbuf.h> in headers in app/
- instead, include it in many .c files instead of <glib-object.h>,
  finally acknowledging the fact that app/ depends on gdk-pixbuf almost
  globally
- fix up includes as if libgimpbase depended in GIO, which it soon will
2013-10-15 01:58:39 +02:00
a4dd86fcda app: add a read-only "buffer" property to GimpPickableInterface
and implement it in GimpDrawable and GimpProjection. Will need this
later.
2013-09-05 10:37:09 +02:00
8ec824f158 app: do not render many tiles twice
removing the area that is going to be rendered from the dirty area
before rendering it, prevents tile-handler-projection to render it
again.

This was the reason why caching showed an improvement also during
the construction of the projection. And it was a regression that
I introduced in a previous commit
2013-08-11 08:49:38 +02:00
5b7953a423 app: do not invalidate always the whole layer 2013-08-10 16:43:08 +02:00
40f41055b9 app: fix the tile pyramid invalidation bug
when toggling the visibility of a single layer image with
alpha channel, zoomed at 50%, the projection wasn't
properly redrawn. It seems there's a GEGL bug exposed
by normal layer mode operation fast path.
2013-08-10 16:22:27 +02:00
40e7ca7442 app: speed up image rendering by removing expose overhead
measure the time it takes to render projection chunks and continue
rendering until 0.01 seconds have passed. This ways we avoid excessive
expose roundtrips.
2013-08-09 20:20:02 +02:00
b05ff480fd app: move the work of construction the projection into the chunk renderer
so we can control how much time it takes, and can further optimize it.
This is needed for gtk3 because it should happen between clock ticks,
not in the expose handler, and in gtk2 the old code would have the
unfortunate property to potentially render at very high frame rates,
including all the overhead of exposing.
2013-08-09 19:17:02 +02:00
3b12541d61 app: rename GimpProjection's IdleRender stuff to ChunkRender
and separate the chunk rendering logic from the fact that it's invoked
from an idle callback. Idle rendering no longer works in GTK+ 3.8 and
later because the expose logic was changed from an idle function to a
frame clock, and when we switch to that in gtk3-port, the diff to
master should stay readable (and rebasable) in this critical part of
the code.
2013-07-28 15:57:28 +02:00
a9ddcde6ed app: change projection idle chunk size back to 256x128
because it made applying of expensive filters pretty unresponsive.
Don't revert commit b7b504d624 tho
because it also moves the #defines to a proper place.
2013-05-25 16:37:52 +02:00
b7b504d624 app: double the chunks of the projection idle renderer: 256x128 -> 512x256 2013-05-22 21:20:23 +02:00
06968d9bf9 Bug 690325 - Image Display broken: a rectangle undrawn to the top left
Let GimpTileHandlerProjection know how large the projection is so it
can calculate the number of levels in the pyramid, and always
invalidate all levels.
2013-03-30 17:44:59 +01:00
766999ce3f app: make sure the projection buffer exists in gimp_projection_pickable_flush()
This does not make any difference for normal images, but for images
without display (like when creating thumbnails, or for GUI-less
scripting), this is now needed because we create the initial
projection much more lazily, and got an empty projection.
2012-12-18 19:30:33 +01:00
2ad8373c42 app: construct the image's first projection incrementally
just as all subsequent ones. Fixes potentially huge delay for new
images, because we used to construct the entire projection in one go.
2012-12-15 19:33:21 +01:00
101a9b9887 app: make image and projection size estimations precision-aware
GimpProjection estimation was still assuming 8 bit, so was
GimpTemplate. Also, calculate GIMP_PROJECTION_IDLE_PRIORITY
inatead of hardcoding it.
2012-08-24 22:16:02 +02:00
6b6d39fc64 app: add GimpTileHandlerProjection and use it to validate the projection
as the projection buffer is being read from. Projection performance is
now back at its old speed.
2012-07-05 21:42:26 +02:00
8c871b3a5f app: fix buffer == NULL warning in GimpProjection 2012-06-26 16:09:29 +02:00
373a4e7469 app: completely remove TileManager and friends (base/ and paint-funcs/)
And along with it a lot of stuff like the drawable preview cache, the
gegl tile manager backend, temporary gimp_gegl_buffer_foo() stuff, and
the remaining bits of performance.

The projection is in an evil semi-ported state which makes it work
ok-ish for stuff like layer moving, but absolutely unbearable for
painting, there is also an off-by-one rendering glitch at some zoom
levels.
2012-06-20 21:44:09 +02:00
7539b9e359 app: simplify projection construction by not doing things GEGL should do 2012-05-20 20:24:45 +02:00
d294cfb8b2 app: remove the legacy projection construction code 2012-05-19 00:06:03 +02:00
8a53c7d29b app: fix crashing brain damage when getting the projection's buffer
Introduced when removing gimp_pickable_get_tiles().
2012-05-09 15:30:30 +02:00
69893e4f72 app: remove GimpPickable::get_tiles()
and change some legacy places to get their tiles from the buffer
returned by GimpPickable::get_buffer().
2012-05-06 01:01:54 +02:00
3ea0e3f090 app: return double not int from GimpPickable::get_opacity_at()
and fix GimpLayer's impl to honor the mask also for layers without
alpha.
2012-05-02 17:51:07 +02:00
e6975ed065 app: add format parameter to GimpPickable::get_pixel_at()
allowing NULL for the pickable's native format. Fix and simplify auto
cropping to always use "R'G'B'A u8".
2012-05-02 17:51:07 +02:00
105d2207ef app: require a non-NULL format in gimp_tile_manager_create_buffer() 2012-05-02 17:50:56 +02:00
deb9b9caa8 app: replace GimpProjectable::get_image_type() by ::get_format()
and change semantics to returning the format it wants to be projected
in, not its actual format.
2012-05-02 17:50:42 +02:00
2a853cd1ee app: remove GimpPickable::get_bytes() 2012-05-02 17:50:42 +02:00
5e754a9641 app: remove GimpPickable::get_image_type() 2012-05-02 17:50:42 +02:00
5fba7c70c7 app: replace the tile pyramid's GimpImageType by bytes, it needs nothing else 2012-05-02 17:50:41 +02:00
ee97c1f4ff app: correct usage of babl formats
GIMP was doing evil hacks lying to GEGL about it's pixels being in a linear
color space when they are not. This causes incorrect rendering, makes gaussian
blur misbehave etc.

The legacy projection modes should be implemented using the same 2.2 gamma
formats that are correct to specify for sRGB data. (for proper color
management in higher bitdepths; icc backend babl formats should be used.)

For the old image modes correct babl formats are:

R'G'B'A u8  -  8 bit RGB with 2.2 gamma (sRGB) with linear alpha component
R'G'B' u8   -  8 bit RGB with 2.2 gamma (sRGB)
Y'A u8      -  8 bit Grayscale with 2.2 gamma with linear alpha component
Y' u8       -  8 bit Grayscale with 2.2 gamma

Y u8        -  8 bit linear data, used for masks/channels
A u8        -  8 bit linear alpha

-----------------------------------------------

RGBA float  -     32bit floating point linear light RGB
RaGaBaA float  -  32bit floating point linear light RGB, premultiplied alpha
                  to be used for processing that needs to scale by the alpha,
                  (blurs, resampling etc)
R'G'B'A float  -  32bit floating point sRGB with gamma, to be used where
                  the result depends on being closer to perceptual when
                  processing, can be used a cheaper alternative to CIE Lab
                  based modes.

-----------------------------------------------

The legacy layer modes should use the formats with gamma 2.2 only for loading
and rendering legacy XCF files correctly, in the brave new world compositing
should most likely be done in linear light with "RGBA float" and even better
"RaGaBaA float" like GEGL does for porter duff and other compositing modes.

The ability to chose the legacy layer modes should probably be hidden from the
user unless an old .xcf has been opened.
2012-05-02 17:50:38 +02:00
c3a818f8f8 app: properly sync the projection's tiles and their buffer
Esp. don't keep two buffer "views" on the tiles around,
2012-05-02 17:46:15 +02:00