mirror of https://github.com/GNOME/gimp.git
Disabled the copy-on-write for gimage projection. Duplicate op will now
Mon Nov 22 13:18:40 GMT 1999 Adam D. Moss <adam@gimp.org> * app/channel_ops.c: Disabled the copy-on-write for gimage projection. Duplicate op will now take as much time and memory as GIMP 1.0 in this respect. That sucks, but I'm damned if I can follow the twisted paths which GIMP treads in making this bahave badly. Can you?
This commit is contained in:
parent
7a14ed3eeb
commit
eb7d301336
|
@ -1,3 +1,11 @@
|
||||||
|
Mon Nov 22 13:18:40 GMT 1999 Adam D. Moss <adam@gimp.org>
|
||||||
|
|
||||||
|
* app/channel_ops.c: Disabled the copy-on-write for gimage
|
||||||
|
projection. Duplicate op will now take as much time and
|
||||||
|
memory as GIMP 1.0 in this respect. That sucks, but I'm
|
||||||
|
damned if I can follow the twisted paths which GIMP treads
|
||||||
|
in making this bahave badly. Can you?
|
||||||
|
|
||||||
1999-11-22 Michael Natterer <mitch@gimp.org>
|
1999-11-22 Michael Natterer <mitch@gimp.org>
|
||||||
|
|
||||||
* app/menus.c: move all sub-sub-menus of <Image>/Filters to the
|
* app/menus.c: move all sub-sub-menus of <Image>/Filters to the
|
||||||
|
|
|
@ -576,23 +576,6 @@ duplicate (GimpImage *gimage)
|
||||||
new_gimage->yresolution = gimage->yresolution;
|
new_gimage->yresolution = gimage->yresolution;
|
||||||
new_gimage->unit = gimage->unit;
|
new_gimage->unit = gimage->unit;
|
||||||
|
|
||||||
/* Copy-on-write the projection tilemanager so we don't have
|
|
||||||
* to reproject the new gimage - since if we do the duplicate
|
|
||||||
* operation correctly, the projection for the new gimage is
|
|
||||||
* identical to that of the source.
|
|
||||||
*/
|
|
||||||
new_gimage->construct_flag = gimage->construct_flag;
|
|
||||||
new_gimage->proj_type = gimage->proj_type;
|
|
||||||
new_gimage->proj_bytes = gimage->proj_bytes;
|
|
||||||
new_gimage->proj_level = gimage->proj_level;
|
|
||||||
pixel_region_init (&srcPR, gimp_image_projection (gimage), 0, 0,
|
|
||||||
gimage->width, gimage->height, FALSE);
|
|
||||||
pixel_region_init (&destPR, gimp_image_projection (new_gimage), 0, 0,
|
|
||||||
new_gimage->width, new_gimage->height, TRUE);
|
|
||||||
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
|
||||||
gdisplays_finish_draw();
|
|
||||||
copy_region(&srcPR, &destPR);
|
|
||||||
|
|
||||||
/* Copy floating layer */
|
/* Copy floating layer */
|
||||||
floating_layer = gimage_floating_sel (gimage);
|
floating_layer = gimage_floating_sel (gimage);
|
||||||
if (floating_layer)
|
if (floating_layer)
|
||||||
|
@ -726,8 +709,79 @@ duplicate (GimpImage *gimage)
|
||||||
return new_gimage;
|
return new_gimage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef I_LIKE_BOGUS_CRAP
|
||||||
|
static void
|
||||||
|
duplicate_projection (GimpImage *oldgimage, GimpImage *newgimage,
|
||||||
|
GDisplay *newgdisplay)
|
||||||
|
{
|
||||||
|
PixelRegion srcPR, destPR;
|
||||||
|
|
||||||
|
/* Copy-on-write the projection tilemanager so we don't have
|
||||||
|
* to reproject the new gimage - since if we do the duplicate
|
||||||
|
* operation correctly, the projection for the new gimage is
|
||||||
|
* identical to that of the source. (Is this true? View-only
|
||||||
|
* attributes vs. image meta-attributes? -- View-only attributes
|
||||||
|
* *should* strictly be applied post-projection.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
newgimage->construct_flag = oldgimage->construct_flag;
|
||||||
|
|
||||||
|
g_warning("CONSTR:%d %dx%dx%d",newgimage->construct_flag,
|
||||||
|
tile_manager_level_width(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_height(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_bpp(gimp_image_projection (newgimage))
|
||||||
|
);
|
||||||
|
|
||||||
|
gdisplay_expose_area(newgdisplay,
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height);
|
||||||
|
|
||||||
|
if (newgimage->construct_flag)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
|
||||||
|
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
||||||
|
gdisplays_finish_draw();
|
||||||
|
gdisplays_flush_now();
|
||||||
|
|
||||||
|
/*
|
||||||
|
newgimage->proj_type = oldgimage->proj_type;
|
||||||
|
newgimage->proj_bytes = oldgimage->proj_bytes;
|
||||||
|
newgimage->proj_level = oldgimage->proj_level;
|
||||||
|
|
||||||
|
gimage_projection_realloc (new_gimage);*/
|
||||||
|
/*
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage), 0, 0,
|
||||||
|
oldgimage->width, oldgimage->height, FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage), 0, 0,
|
||||||
|
newgimage->width, newgimage->height, TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);*/
|
||||||
|
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_ops_duplicate (GimpImage *gimage)
|
channel_ops_duplicate (GimpImage *gimage)
|
||||||
{
|
{
|
||||||
gdisplay_new (duplicate (gimage), 0x0101);
|
GDisplay *new_gdisp;
|
||||||
|
GImage *new_gimage;
|
||||||
|
|
||||||
|
new_gimage = duplicate (gimage);
|
||||||
|
|
||||||
|
new_gdisp = gdisplay_new (new_gimage, 0x0101);
|
||||||
|
|
||||||
|
/* duplicate_projection(gimage, new_gimage, new_gdisp); */
|
||||||
}
|
}
|
||||||
|
|
|
@ -576,23 +576,6 @@ duplicate (GimpImage *gimage)
|
||||||
new_gimage->yresolution = gimage->yresolution;
|
new_gimage->yresolution = gimage->yresolution;
|
||||||
new_gimage->unit = gimage->unit;
|
new_gimage->unit = gimage->unit;
|
||||||
|
|
||||||
/* Copy-on-write the projection tilemanager so we don't have
|
|
||||||
* to reproject the new gimage - since if we do the duplicate
|
|
||||||
* operation correctly, the projection for the new gimage is
|
|
||||||
* identical to that of the source.
|
|
||||||
*/
|
|
||||||
new_gimage->construct_flag = gimage->construct_flag;
|
|
||||||
new_gimage->proj_type = gimage->proj_type;
|
|
||||||
new_gimage->proj_bytes = gimage->proj_bytes;
|
|
||||||
new_gimage->proj_level = gimage->proj_level;
|
|
||||||
pixel_region_init (&srcPR, gimp_image_projection (gimage), 0, 0,
|
|
||||||
gimage->width, gimage->height, FALSE);
|
|
||||||
pixel_region_init (&destPR, gimp_image_projection (new_gimage), 0, 0,
|
|
||||||
new_gimage->width, new_gimage->height, TRUE);
|
|
||||||
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
|
||||||
gdisplays_finish_draw();
|
|
||||||
copy_region(&srcPR, &destPR);
|
|
||||||
|
|
||||||
/* Copy floating layer */
|
/* Copy floating layer */
|
||||||
floating_layer = gimage_floating_sel (gimage);
|
floating_layer = gimage_floating_sel (gimage);
|
||||||
if (floating_layer)
|
if (floating_layer)
|
||||||
|
@ -726,8 +709,79 @@ duplicate (GimpImage *gimage)
|
||||||
return new_gimage;
|
return new_gimage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef I_LIKE_BOGUS_CRAP
|
||||||
|
static void
|
||||||
|
duplicate_projection (GimpImage *oldgimage, GimpImage *newgimage,
|
||||||
|
GDisplay *newgdisplay)
|
||||||
|
{
|
||||||
|
PixelRegion srcPR, destPR;
|
||||||
|
|
||||||
|
/* Copy-on-write the projection tilemanager so we don't have
|
||||||
|
* to reproject the new gimage - since if we do the duplicate
|
||||||
|
* operation correctly, the projection for the new gimage is
|
||||||
|
* identical to that of the source. (Is this true? View-only
|
||||||
|
* attributes vs. image meta-attributes? -- View-only attributes
|
||||||
|
* *should* strictly be applied post-projection.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
newgimage->construct_flag = oldgimage->construct_flag;
|
||||||
|
|
||||||
|
g_warning("CONSTR:%d %dx%dx%d",newgimage->construct_flag,
|
||||||
|
tile_manager_level_width(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_height(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_bpp(gimp_image_projection (newgimage))
|
||||||
|
);
|
||||||
|
|
||||||
|
gdisplay_expose_area(newgdisplay,
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height);
|
||||||
|
|
||||||
|
if (newgimage->construct_flag)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
|
||||||
|
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
||||||
|
gdisplays_finish_draw();
|
||||||
|
gdisplays_flush_now();
|
||||||
|
|
||||||
|
/*
|
||||||
|
newgimage->proj_type = oldgimage->proj_type;
|
||||||
|
newgimage->proj_bytes = oldgimage->proj_bytes;
|
||||||
|
newgimage->proj_level = oldgimage->proj_level;
|
||||||
|
|
||||||
|
gimage_projection_realloc (new_gimage);*/
|
||||||
|
/*
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage), 0, 0,
|
||||||
|
oldgimage->width, oldgimage->height, FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage), 0, 0,
|
||||||
|
newgimage->width, newgimage->height, TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);*/
|
||||||
|
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_ops_duplicate (GimpImage *gimage)
|
channel_ops_duplicate (GimpImage *gimage)
|
||||||
{
|
{
|
||||||
gdisplay_new (duplicate (gimage), 0x0101);
|
GDisplay *new_gdisp;
|
||||||
|
GImage *new_gimage;
|
||||||
|
|
||||||
|
new_gimage = duplicate (gimage);
|
||||||
|
|
||||||
|
new_gdisp = gdisplay_new (new_gimage, 0x0101);
|
||||||
|
|
||||||
|
/* duplicate_projection(gimage, new_gimage, new_gdisp); */
|
||||||
}
|
}
|
||||||
|
|
|
@ -576,23 +576,6 @@ duplicate (GimpImage *gimage)
|
||||||
new_gimage->yresolution = gimage->yresolution;
|
new_gimage->yresolution = gimage->yresolution;
|
||||||
new_gimage->unit = gimage->unit;
|
new_gimage->unit = gimage->unit;
|
||||||
|
|
||||||
/* Copy-on-write the projection tilemanager so we don't have
|
|
||||||
* to reproject the new gimage - since if we do the duplicate
|
|
||||||
* operation correctly, the projection for the new gimage is
|
|
||||||
* identical to that of the source.
|
|
||||||
*/
|
|
||||||
new_gimage->construct_flag = gimage->construct_flag;
|
|
||||||
new_gimage->proj_type = gimage->proj_type;
|
|
||||||
new_gimage->proj_bytes = gimage->proj_bytes;
|
|
||||||
new_gimage->proj_level = gimage->proj_level;
|
|
||||||
pixel_region_init (&srcPR, gimp_image_projection (gimage), 0, 0,
|
|
||||||
gimage->width, gimage->height, FALSE);
|
|
||||||
pixel_region_init (&destPR, gimp_image_projection (new_gimage), 0, 0,
|
|
||||||
new_gimage->width, new_gimage->height, TRUE);
|
|
||||||
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
|
||||||
gdisplays_finish_draw();
|
|
||||||
copy_region(&srcPR, &destPR);
|
|
||||||
|
|
||||||
/* Copy floating layer */
|
/* Copy floating layer */
|
||||||
floating_layer = gimage_floating_sel (gimage);
|
floating_layer = gimage_floating_sel (gimage);
|
||||||
if (floating_layer)
|
if (floating_layer)
|
||||||
|
@ -726,8 +709,79 @@ duplicate (GimpImage *gimage)
|
||||||
return new_gimage;
|
return new_gimage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef I_LIKE_BOGUS_CRAP
|
||||||
|
static void
|
||||||
|
duplicate_projection (GimpImage *oldgimage, GimpImage *newgimage,
|
||||||
|
GDisplay *newgdisplay)
|
||||||
|
{
|
||||||
|
PixelRegion srcPR, destPR;
|
||||||
|
|
||||||
|
/* Copy-on-write the projection tilemanager so we don't have
|
||||||
|
* to reproject the new gimage - since if we do the duplicate
|
||||||
|
* operation correctly, the projection for the new gimage is
|
||||||
|
* identical to that of the source. (Is this true? View-only
|
||||||
|
* attributes vs. image meta-attributes? -- View-only attributes
|
||||||
|
* *should* strictly be applied post-projection.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
newgimage->construct_flag = oldgimage->construct_flag;
|
||||||
|
|
||||||
|
g_warning("CONSTR:%d %dx%dx%d",newgimage->construct_flag,
|
||||||
|
tile_manager_level_width(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_height(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_bpp(gimp_image_projection (newgimage))
|
||||||
|
);
|
||||||
|
|
||||||
|
gdisplay_expose_area(newgdisplay,
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height);
|
||||||
|
|
||||||
|
if (newgimage->construct_flag)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
|
||||||
|
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
||||||
|
gdisplays_finish_draw();
|
||||||
|
gdisplays_flush_now();
|
||||||
|
|
||||||
|
/*
|
||||||
|
newgimage->proj_type = oldgimage->proj_type;
|
||||||
|
newgimage->proj_bytes = oldgimage->proj_bytes;
|
||||||
|
newgimage->proj_level = oldgimage->proj_level;
|
||||||
|
|
||||||
|
gimage_projection_realloc (new_gimage);*/
|
||||||
|
/*
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage), 0, 0,
|
||||||
|
oldgimage->width, oldgimage->height, FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage), 0, 0,
|
||||||
|
newgimage->width, newgimage->height, TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);*/
|
||||||
|
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_ops_duplicate (GimpImage *gimage)
|
channel_ops_duplicate (GimpImage *gimage)
|
||||||
{
|
{
|
||||||
gdisplay_new (duplicate (gimage), 0x0101);
|
GDisplay *new_gdisp;
|
||||||
|
GImage *new_gimage;
|
||||||
|
|
||||||
|
new_gimage = duplicate (gimage);
|
||||||
|
|
||||||
|
new_gdisp = gdisplay_new (new_gimage, 0x0101);
|
||||||
|
|
||||||
|
/* duplicate_projection(gimage, new_gimage, new_gdisp); */
|
||||||
}
|
}
|
||||||
|
|
|
@ -576,23 +576,6 @@ duplicate (GimpImage *gimage)
|
||||||
new_gimage->yresolution = gimage->yresolution;
|
new_gimage->yresolution = gimage->yresolution;
|
||||||
new_gimage->unit = gimage->unit;
|
new_gimage->unit = gimage->unit;
|
||||||
|
|
||||||
/* Copy-on-write the projection tilemanager so we don't have
|
|
||||||
* to reproject the new gimage - since if we do the duplicate
|
|
||||||
* operation correctly, the projection for the new gimage is
|
|
||||||
* identical to that of the source.
|
|
||||||
*/
|
|
||||||
new_gimage->construct_flag = gimage->construct_flag;
|
|
||||||
new_gimage->proj_type = gimage->proj_type;
|
|
||||||
new_gimage->proj_bytes = gimage->proj_bytes;
|
|
||||||
new_gimage->proj_level = gimage->proj_level;
|
|
||||||
pixel_region_init (&srcPR, gimp_image_projection (gimage), 0, 0,
|
|
||||||
gimage->width, gimage->height, FALSE);
|
|
||||||
pixel_region_init (&destPR, gimp_image_projection (new_gimage), 0, 0,
|
|
||||||
new_gimage->width, new_gimage->height, TRUE);
|
|
||||||
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
|
||||||
gdisplays_finish_draw();
|
|
||||||
copy_region(&srcPR, &destPR);
|
|
||||||
|
|
||||||
/* Copy floating layer */
|
/* Copy floating layer */
|
||||||
floating_layer = gimage_floating_sel (gimage);
|
floating_layer = gimage_floating_sel (gimage);
|
||||||
if (floating_layer)
|
if (floating_layer)
|
||||||
|
@ -726,8 +709,79 @@ duplicate (GimpImage *gimage)
|
||||||
return new_gimage;
|
return new_gimage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef I_LIKE_BOGUS_CRAP
|
||||||
|
static void
|
||||||
|
duplicate_projection (GimpImage *oldgimage, GimpImage *newgimage,
|
||||||
|
GDisplay *newgdisplay)
|
||||||
|
{
|
||||||
|
PixelRegion srcPR, destPR;
|
||||||
|
|
||||||
|
/* Copy-on-write the projection tilemanager so we don't have
|
||||||
|
* to reproject the new gimage - since if we do the duplicate
|
||||||
|
* operation correctly, the projection for the new gimage is
|
||||||
|
* identical to that of the source. (Is this true? View-only
|
||||||
|
* attributes vs. image meta-attributes? -- View-only attributes
|
||||||
|
* *should* strictly be applied post-projection.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
newgimage->construct_flag = oldgimage->construct_flag;
|
||||||
|
|
||||||
|
g_warning("CONSTR:%d %dx%dx%d",newgimage->construct_flag,
|
||||||
|
tile_manager_level_width(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_height(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_bpp(gimp_image_projection (newgimage))
|
||||||
|
);
|
||||||
|
|
||||||
|
gdisplay_expose_area(newgdisplay,
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height);
|
||||||
|
|
||||||
|
if (newgimage->construct_flag)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
|
||||||
|
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
||||||
|
gdisplays_finish_draw();
|
||||||
|
gdisplays_flush_now();
|
||||||
|
|
||||||
|
/*
|
||||||
|
newgimage->proj_type = oldgimage->proj_type;
|
||||||
|
newgimage->proj_bytes = oldgimage->proj_bytes;
|
||||||
|
newgimage->proj_level = oldgimage->proj_level;
|
||||||
|
|
||||||
|
gimage_projection_realloc (new_gimage);*/
|
||||||
|
/*
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage), 0, 0,
|
||||||
|
oldgimage->width, oldgimage->height, FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage), 0, 0,
|
||||||
|
newgimage->width, newgimage->height, TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);*/
|
||||||
|
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_ops_duplicate (GimpImage *gimage)
|
channel_ops_duplicate (GimpImage *gimage)
|
||||||
{
|
{
|
||||||
gdisplay_new (duplicate (gimage), 0x0101);
|
GDisplay *new_gdisp;
|
||||||
|
GImage *new_gimage;
|
||||||
|
|
||||||
|
new_gimage = duplicate (gimage);
|
||||||
|
|
||||||
|
new_gdisp = gdisplay_new (new_gimage, 0x0101);
|
||||||
|
|
||||||
|
/* duplicate_projection(gimage, new_gimage, new_gdisp); */
|
||||||
}
|
}
|
||||||
|
|
|
@ -576,23 +576,6 @@ duplicate (GimpImage *gimage)
|
||||||
new_gimage->yresolution = gimage->yresolution;
|
new_gimage->yresolution = gimage->yresolution;
|
||||||
new_gimage->unit = gimage->unit;
|
new_gimage->unit = gimage->unit;
|
||||||
|
|
||||||
/* Copy-on-write the projection tilemanager so we don't have
|
|
||||||
* to reproject the new gimage - since if we do the duplicate
|
|
||||||
* operation correctly, the projection for the new gimage is
|
|
||||||
* identical to that of the source.
|
|
||||||
*/
|
|
||||||
new_gimage->construct_flag = gimage->construct_flag;
|
|
||||||
new_gimage->proj_type = gimage->proj_type;
|
|
||||||
new_gimage->proj_bytes = gimage->proj_bytes;
|
|
||||||
new_gimage->proj_level = gimage->proj_level;
|
|
||||||
pixel_region_init (&srcPR, gimp_image_projection (gimage), 0, 0,
|
|
||||||
gimage->width, gimage->height, FALSE);
|
|
||||||
pixel_region_init (&destPR, gimp_image_projection (new_gimage), 0, 0,
|
|
||||||
new_gimage->width, new_gimage->height, TRUE);
|
|
||||||
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
|
||||||
gdisplays_finish_draw();
|
|
||||||
copy_region(&srcPR, &destPR);
|
|
||||||
|
|
||||||
/* Copy floating layer */
|
/* Copy floating layer */
|
||||||
floating_layer = gimage_floating_sel (gimage);
|
floating_layer = gimage_floating_sel (gimage);
|
||||||
if (floating_layer)
|
if (floating_layer)
|
||||||
|
@ -726,8 +709,79 @@ duplicate (GimpImage *gimage)
|
||||||
return new_gimage;
|
return new_gimage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef I_LIKE_BOGUS_CRAP
|
||||||
|
static void
|
||||||
|
duplicate_projection (GimpImage *oldgimage, GimpImage *newgimage,
|
||||||
|
GDisplay *newgdisplay)
|
||||||
|
{
|
||||||
|
PixelRegion srcPR, destPR;
|
||||||
|
|
||||||
|
/* Copy-on-write the projection tilemanager so we don't have
|
||||||
|
* to reproject the new gimage - since if we do the duplicate
|
||||||
|
* operation correctly, the projection for the new gimage is
|
||||||
|
* identical to that of the source. (Is this true? View-only
|
||||||
|
* attributes vs. image meta-attributes? -- View-only attributes
|
||||||
|
* *should* strictly be applied post-projection.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
newgimage->construct_flag = oldgimage->construct_flag;
|
||||||
|
|
||||||
|
g_warning("CONSTR:%d %dx%dx%d",newgimage->construct_flag,
|
||||||
|
tile_manager_level_width(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_height(gimp_image_projection (newgimage)),
|
||||||
|
tile_manager_level_bpp(gimp_image_projection (newgimage))
|
||||||
|
);
|
||||||
|
|
||||||
|
gdisplay_expose_area(newgdisplay,
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height);
|
||||||
|
|
||||||
|
if (newgimage->construct_flag)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
|
||||||
|
/* We don't want to copy a half-redrawn projection, so force a flush. */
|
||||||
|
gdisplays_finish_draw();
|
||||||
|
gdisplays_flush_now();
|
||||||
|
|
||||||
|
/*
|
||||||
|
newgimage->proj_type = oldgimage->proj_type;
|
||||||
|
newgimage->proj_bytes = oldgimage->proj_bytes;
|
||||||
|
newgimage->proj_level = oldgimage->proj_level;
|
||||||
|
|
||||||
|
gimage_projection_realloc (new_gimage);*/
|
||||||
|
/*
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage), 0, 0,
|
||||||
|
oldgimage->width, oldgimage->height, FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage), 0, 0,
|
||||||
|
newgimage->width, newgimage->height, TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);*/
|
||||||
|
|
||||||
|
pixel_region_init (&srcPR, gimp_image_projection (oldgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
FALSE);
|
||||||
|
pixel_region_init (&destPR, gimp_image_projection (newgimage),
|
||||||
|
newgdisplay->disp_xoffset, newgdisplay->disp_yoffset,
|
||||||
|
newgdisplay->disp_width, newgdisplay->disp_height,
|
||||||
|
TRUE);
|
||||||
|
copy_region(&srcPR, &destPR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
channel_ops_duplicate (GimpImage *gimage)
|
channel_ops_duplicate (GimpImage *gimage)
|
||||||
{
|
{
|
||||||
gdisplay_new (duplicate (gimage), 0x0101);
|
GDisplay *new_gdisp;
|
||||||
|
GImage *new_gimage;
|
||||||
|
|
||||||
|
new_gimage = duplicate (gimage);
|
||||||
|
|
||||||
|
new_gdisp = gdisplay_new (new_gimage, 0x0101);
|
||||||
|
|
||||||
|
/* duplicate_projection(gimage, new_gimage, new_gdisp); */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue