Closed Bug 77210 Opened 23 years ago Closed 23 years ago

Images don't show up in documents printed via Xprint

Categories

(Core Graveyard :: Printing: Xprint, defect)

All
Linux
defect
Not set
critical

Tracking

(Not tracked)

VERIFIED FIXED
mozilla0.9.1

People

(Reporter: roland.mainz, Assigned: roland.mainz)

References

Details

Attachments

(9 files)

Per Pavlov's request in bug 76993 - opening a seperate bug for this.

Xprint does not print any images - and I do not have any idea _why_...

Assigning this to pavlov as I hope he may be able to find this bug faster than
me...
[adopted&updated copy from bug 72087]
Build instructions:
- Download&unpack mozilla source
- Compile tree:
% configure --with-xprint
% make

Usage:
- Start Xprt server (as "root" or normal user)
% Xprt -audit 4 :6 &
- tell mozilla where to find Xprt server(s - XPSERVERLIST can contain multiple
servers seperated via blanks)
% export XPSERVERLIST=":6"
- Run Mozilla
% ./mozilla

Running the Xprt server and setting the XPSERVERLIST should be done globally per
machine or network. Be sure to use "xhost" to grant other machines (xhost
+machine) the access to Xprt on demand...

More details on demand...
Usage (part 2):
- "print command" should contain the printer name
- print-to-file works but requires to give both filename _and_ valid printer
name as Xprint prints to this printer (e.g. uses the same DDX+config for this
printer) and redirects output back to the application (which copies the stuff
into the given file...)
* set left/top/right/bottom borders to "0.0" to avoid that the header/footer
stuff get's a chanche to add his monster-size text
** wrong arguments are _fatal_... Xprint module returns error - but calling code
doesn't care and continues as if nothing has happened... ;-((

Required Solaris 2.7 patches (both are in the recommended patch cluster; 2.8
does not need patches - but the recommended patch cluster is... uhm...
recommeded... :-):
- Xsun/Xprt patch:
http://sunsolve.sun.com/pub-cgi/patchRedir.pl?type=readme&item=108376
- Xprint extension patch:
http://sunsolve.sun.com/pub-cgi/patchRedir.pl?type=readme&item=107650
Target Milestone: --- → mozilla1.0
Pavlov... why not milestone 0.9.1 or milestone 0.9.2 ?
It seems that nsRenderingContext::DrawImage(*) methods nor
nsXPrintContext::DrawImage(*) methods are ever called...

I'll attach build logs with some nice warnings...
pavlov: It seems that nsRenderingContextXp::GetDrawingSurface() doesn't return a
drawingsurface causes this problem..
...but nsRenderingContextPS::GetDrawingSurface() doesn't do that, too.

The big question for me is then: How can PostScript module print images ?
Ohhh.... ohhhh... the fix is sooo simple (and doesn't need nsDrawingSurface
stuff :-)... .-)))
I am going to include fix for this in todays patches for bug 78548...
Target Milestone: mozilla1.0 → mozilla0.9.1
don't retarget my bugs.  if you post a patch i'll review it, but don't change 
the target milestone of bugs that you don't own.
Target Milestone: mozilla0.9.1 → mozilla1.0
Overtaking.
Patches in bug 78548 will address most image-related issues in Xprint.

Pavlov... wanna play QA for this bug, please ?
Assignee: pavlov → Roland.Mainz
Depends on: 78548
QA Contact: Roland.Mainz → pavlov
Target Milestone: mozilla1.0 → mozilla0.9.1
Status: NEW → ASSIGNED
Accepting bug...
no, i don't want to play qa for this.
QA Contact: pavlov → Roland.Mainz
Setting QA=katakai@japan.sun.com

Filing patch in a few mins...
QA Contact: Roland.Mainz → katakai
Filed patch.

Known issues:
- Xprt-side image scaling with XpSetImageResolution() does not work for some
reason. This is _BAD_ - as the workaround (scaling on Mozilla's side) makes
images in print job four times larger than required and increases printing time
a lot. Scaling via XpSetImageResolution() can be enabled via setting the
MOZILLA_XPRINT_EXPERIMENTAL_ENABLE_XPRT_SCALING env var. Question to Jay Hobson:
Is there a bug in Xprt or is this a bug in my code ?
- Images with transparent parts (nsIImage objects with 1bit "alpha" bitmaps)
print the transparent parts as "black"... uhm... is this my fault or Xprt's
fault ?
- Images with 8bit alpha bitmaps are not implemented yet (uhm... AFAIK not used
by Mozilla yet)
- Error checking is lame... ;-(

This patch contains partial (or full :-) fixes for...
- bug 80562 "Xprint does not support any other visuals than Xprt's default
visual"
- big 57820 "Xprint does not scale images to suit the higher printer resolution"
- bug 54092 "Xprint uses one bitmap in place of all bitmaps on page "

Need r=, sr= and checkin ASAP, please!! Tree for 0.9.1 freezes tomorrow
(23.05.2001)...
Blocks: 54092, 57820, 80562
nsDeviceContextXP.cpp:

  Perhaps you could move the initialization of members in the
  constructor into member initializers?

  Why comment out the body of |SetDrawingSurface| when you could just
  remove it?

  In |GetDrawingSurface|, you should probably set aDrawingSurface to
  null and then return NS_ERROR_NOT_AVAILABLE or something.  Or is it OK
  to return null and NS_OK?  You should definitely *not* return NS_OK
  without initializing the out param.

  But actually, shouldn't you be implementing GetDrawingSurface
  according to the comments in nsIDeviceContext.h?  Or does printing
  really not need a drawing surface?  (If that's the case, perhaps the
  comment in nsIDeviceContext.h should reflect that?)

nsXPrintContext.cpp:

  You should just initialize |xattributes_mask| to the correct value,
  rather than initializing to 0 and then using |= to assign the correct
  value.  It's confusing the way it is.

  In |SetupWindow|, you're mixing C-like code where you declare all the
  variables at the beginning of the function with more typical C++ code
  where you declare the variables before use.  It would probably be good
  to stick to one or the other.  In SetupWindow it *looks* like all the
  variables are declared at the top but you're adding one that isn't.

  Does the initialization of XSetWindowAttributes to |{0}| really
  zero-initialize the whole thing?  There are a lot of fields that
  you aren't setting.

  In GetScaledXImage, you use malloc and XInitImage when you should
  probably use XCreateImage (which does both for you).

  Maybe DrawImageXImageScaled and DrawImageBits shouldn't be virtual and
  should be private?  Do you really expect anything to inherit from
  nsXPrintContext without major modifications?

  In your use of the env. var.
  MOZILLA_XPRINT_EXPERIMENTAL_ENABLE_XPRT_SCALING it looks like all the
  code you wrote isn't the default and you need the environment variable
  to make it work.  Shouldn't it be the other way around?  And could you
  pick a shorter name for the environment variable?

+  Bool res = XpSetImageResolution(mPDisplay, mPContext, imageResolution,
&prev_res);
+
+  if( res == True )

  Could you just use |if (XpSetImageResolution(...))| (if only to avoid
  the explicit comparison to True).

  Have both branches after |if( res == True)| been tested?  Or is only
  one the usual case?

  Could |DrawImageXImageScaled| have a nicer name?  (DrawXImageScaled?
  DrawImageScaled?)

+  XImage *srcImg        = (XImage *)nsnull;
+  XImage *srcAlphaImg   = (XImage *)nsnull;
+  XImage *subImg        = (XImage *)nsnull;
+  XImage *subAlphaImg   = (XImage *)nsnull;
+  XImage *dstImg        = (XImage *)nsnull;
+  XImage *dstAlphaImg   = (XImage *)nsnull;

  No need for the casts.  Limit your use of casts to when you really
  need them, since casts tend to be one of the first places to look when
  code is buggy.

+  srcImg = (XImage *)malloc(sizeof(XImage));
+  memset(srcImg, 0, sizeof(XImage));
   ...

  Shouldn't you just use XCreateImage here?  (Then you don't need
  XInitImage, which is to be used for an XImage on the stack, I think.)

  In DrawImageXImageScaled, I think you leak dstImg and dstAlphaImg.

  I think you also leak the memory returned from XSubImage in the case
  where you use XSubImage to reallocate srcImg (and the same thing for
  subAlphaImg).  Can't you fix this by making the condition for nulling
  the |data| member be that subXImage is non-null, and removing the
  requirement that it be null outside the call to XDestroyImage?

  What's the difference between XYPixmap and ZPixmap?


General questions / comments (don't need to fix these now):
  Why does nsIDeviceContextXp inherit from an implementation?  Interfaces
  should not have an implementation attached.

  I think 8-bit alpha is used by PNG images in Mozilla.
> nsDeviceContextXP.cpp:
> 
>   Perhaps you could move the initialization of members in the
>   constructor into member initializers?

In theory yes. But sometimes this way is confusing for people who simply look
into the constructor and think that this is the only place where vars are
initalized...

>   Why comment out the body of |SetDrawingSurface| when you could just
>   remove it?

A reminder for me to check when&how |SetDrawingSurface| is used - and why that
code isn't required anymore...

>   In |GetDrawingSurface|, you should probably set aDrawingSurface to
>   null and then return NS_ERROR_NOT_AVAILABLE or something.  Or is it OK
>   to return null and NS_OK?  You should definitely *not* return NS_OK
>   without initializing the out param.
> 
>   But actually, shouldn't you be implementing GetDrawingSurface
>   according to the comments in nsIDeviceContext.h?  Or does printing
>   really not need a drawing surface?  (If that's the case, perhaps the
>   comment in nsIDeviceContext.h should reflect that?)

I only duplicated the code from PS module here - do _nothing_. if I do anything
here (e.g. aDrawingSurface=nsnull;) layout gets insane... and I do not know yet
_why_ this happens. I need to crawl much deeper into the code and learn how it
works...

> nsXPrintContext.cpp:
> 
>   You should just initialize |xattributes_mask| to the correct value,
>   rather than initializing to 0 and then using |= to assign the correct
>   value.  It's confusing the way it is.

Fixed.

>   In |SetupWindow|, you're mixing C-like code where you declare all the
>   variables at the beginning of the function with more typical C++ code
>   where you declare the variables before use.  It would probably be good
>   to stick to one or the other.  In SetupWindow it *looks* like all the
>   variables are declared at the top but you're adding one that isn't.

I moved the two declarations below the other ones. I usually prefer the C style
- but sometimes it's nice that C++ doesn't force me to do that always...
Fixed.

>   Does the initialization of XSetWindowAttributes to |{0}| really
>   zero-initialize the whole thing?  There are a lot of fields that
>   you aren't setting.

Uhm... good question. my "the annotated ANSI C standard"-book here in the
office... well... AFAIK the SAS/C compiler did "zero" all field this way... but
I never verified this with gcc or Sun Workshop.
I removed that initalisation... xattributes_mask will select the field which
should be used - and both are initalized.
Fixed.

>   In GetScaledXImage, you use malloc and XInitImage when you should
>   probably use XCreateImage (which does both for you).

XCreateImage() requires a |Display *| and some other stuff to work properly -
and it does not (re-)calculate fields after I modify them like XInitImage()
does... see X11R6.6 sources and manual pages... :-)

>   Maybe DrawImageXImageScaled and DrawImageBits shouldn't be virtual and
>   should be private?  Do you really expect anything to inherit from
>   nsXPrintContext without major modifications?

No... and even if that happens he/she may change the code again... :-)
Fixed - both methods are now private and non-virtual...

>   In your use of the env. var.
>   MOZILLA_XPRINT_EXPERIMENTAL_ENABLE_XPRT_SCALING it looks like all the
>   code you wrote isn't the default and you need the environment variable
>   to make it work.  Shouldn't it be the other way around?  And could you
>   pick a shorter name for the environment variable?

I don't know why that code doesn't work - it may be my fault or Xprt's fault.
For now I disabled this code by default until I get a response from Sun. I named
the magic switch "MOZILLA_XPRINT_EXPERIMENTAL_ENABLE_XPRT_SCALING" to avoid any
flames like "that env var is too short" or "the name is misleading" etc. It is
_long_ and describes itself and is going to be removed _very_soon_.

> +  Bool res = XpSetImageResolution(mPDisplay, mPContext, imageResolution,
> &prev_res);
> +
> +  if( res == True )
> 
>   Could you just use |if (XpSetImageResolution(...))| (if only to avoid
>   the explicit comparison to True).

Fixed.

>   Have both branches after |if( res == True)| been tested? 

Yes... both branched have been tested.

> Or is only
> one the usual case?

Per spec: XpSetImageResolution() only works if the DDX (driver) in Xprt supports
scaling of images. The PS and PCL DDX support scaling - but I wouldn't expect
that the XWD DDX supports scaling... =:-)

>   Could |DrawImageXImageScaled| have a nicer name?  (DrawXImageScaled?
>   DrawImageScaled?)

Good question... uhm... it's own a private method... :-)
I renamed it to DrawImageBitsScaled() - I assume that's better... :-)

> +  XImage *srcImg        = (XImage *)nsnull;
> +  XImage *srcAlphaImg   = (XImage *)nsnull;
> +  XImage *subImg        = (XImage *)nsnull;
> +  XImage *subAlphaImg   = (XImage *)nsnull;
> +  XImage *dstImg        = (XImage *)nsnull;
> +  XImage *dstAlphaImg   = (XImage *)nsnull;
> 
>   No need for the casts.  Limit your use of casts to when you really
>   need them, since casts tend to be one of the first places to look when
>   code is buggy.

Ohhh... yes...
Fixed.

> +  srcImg = (XImage *)malloc(sizeof(XImage));
> +  memset(srcImg, 0, sizeof(XImage));
>    ...
> 
>   Shouldn't you just use XCreateImage here?  (Then you don't need
>   XInitImage, which is to be used for an XImage on the stack, I think.)

See above. XCreateImage() requires a |Display *| - and I malloc() them because I
can use XDestroyImage() to get rid of the whole thing incl. all memory/stuff
attached to it...

>   In DrawImageXImageScaled, I think you leak dstImg and dstAlphaImg.

??? Oups... ;-(
Fixed.

>   I think you also leak the memory returned from XSubImage in the case
>   where you use XSubImage to reallocate srcImg (and the same thing for
>   subAlphaImg).  Can't you fix this by making the condition for nulling
>   the |data| member be that subXImage is non-null, and removing the
>   requirement that it be null outside the call to XDestroyImage?

Fixed.

>   What's the difference between XYPixmap and ZPixmap?

http://www.multimania.com/babyloon/xlib.html has a small description and
http://www.linux.ie/pipermail/ilug/2000-September/023608.html for the longer,
detailed one.

> General questions / comments (don't need to fix these now):
>   Why does nsIDeviceContextXp inherit from an implementation?  Interfaces
>   should not have an implementation attached.

Good question. Added to my ToDo list for investigation...

>   I think 8-bit alpha is used by PNG images in Mozilla.

Do you have any example URLs ?
Uhm... after looking twice on that code...
What about creating a XImage from incoming nsIImage, run XSubImage() (and care
about alpha stuff if required) and pass contents of resulting XImage back to
destination...

blizzard.... do you see any problems with that idea ?
Ouch ouch... sorry... last comment was for bug 76820... SORRY... wrong browser
window... ;-(((
> > I think 8-bit alpha is used by PNG images in Mozilla.
> 
> Do you have any example URLs ?

See the bottom of http://www.w3.org/Graphics/PNG/ .
remove:
+  //scaler = 0.5;
typo:
+  /* set image rsolution */
+    /* XpSetImageResolution(), but reset image rsolution to previous value to 
be sure... */
you lost the e in r_e_solution ...

logic question
if( XpSetImageResolution(mPDisplay, mPContext, imageResolution, &prev_res) )
{
Draw(...);
SetImageRes();
} else {
SetImageRes();
Draw(...);
}

other than that, r=timeless
I filed a new patch to match r=timeless.

> logic question
> if( XpSetImageResolution(mPDisplay, mPContext, imageResolution, &prev_res) )
> {
> Draw(...);
> SetImageRes();
> } else {
> SetImageRes();
> Draw(...);
> }

The SetImageRes() in the "else" part is only a
reset-because-I-do-not-know-what-happens-if-the-1st-SetImageRes()-fails.
it may be unneccesay... or not.

To Jay Hobson:
Scaling via XpSetImageResolution() may not work with
nsXPrintContext::DrawImageBits() because it does a PutImage() (in
xlib_draw_rgb_image()) _and_ a XCopyArea() (which leads to the question if
images copied XCopyArea() will be scaled by XpSetImageResolution() or not).
But this does not explain why a plain "XpSetImageResolution(); PutImage(); /* by
xlib_draw_rgb_image() */" fails, too (nsXPrintContext::DrawImageBitsScaled() use
this way except for alpha images...).

(And it would be nice to have a XpSetXYImageResolution() where X/Y can have a
different resolution (and where resolution is a float var)...)
blizzard/pavlov:
can anyone sr= this patch, please ?
let's land this in 0.9.2.  let drivers know if this creates problems. thanks.
Target Milestone: mozilla0.9.1 → mozilla0.9.2
> let's land this in 0.9.2.  let drivers know if this creates problems.

Fired email to drivers@mozilla.org,chofmann@netscape.com,blizzard,mkaply to get
this "in" 0.9.1...
chofmann wrote:
> sounds fine to me if you can get the sr= let us know when that happens.

putting bug back to 0.9.1 radar...
Target Milestone: mozilla0.9.2 → mozilla0.9.1
Whiteboard: 0.9.1 a= request mailed to drivers 05/23. no r or sr yet
XDestroyImage is only supposed to be used on xlib-created images (XGetImage),
since it Xfree's it's data. I think Xfree is #defined to free most places though
so this might not be a problem.
To Asa:
Please correct me... the "status whiteboard" is slightly _wrong_. 
AFAIK the patch here got r=timeless - I only need a sr= from someone...
Whiteboard: 0.9.1 a= request mailed to drivers 05/23. no r or sr yet → 0.9.1 a= request mailed to drivers 05/23. no sr yet
After some testing... it looks I found the issue why scaling via
XpSetImageResolution() didn't work in my first attempt:
-- snip --
{
  double scale = 29.0,
         int_scale; 
  int    prev_res,
         dummy;
  int    dest_x = 100,
         dest_y = 100;

  /* boooooohhhh... we have to pass the scaling factor as integer... _bad_ */
  int_scale = dpi / (int)(((double)dpi/scale)+0.9999); /* round scaling factor
                                                        * to a value which does
                                                        * not get cut by 
                                                        * integer math... */    
  
  printf("scale=%f, using scale=%f (scale>=int_scale)==%d\n", 
         scale, int_scale, (scale >= int_scale));

  puts("start page.");   
  XPU_TRACE(XpStartPage(pdpy, pwin));
  XPU_TRACE(XpuWaitForPrintNotify(pdpy, XPStartPageNotify));
          
  (void)XpSetImageResolution(pdpy, pcontext, (int)((double)dpi/int_scale), 
                             &prev_res);

  /* in theory we have to scale our image on application-side,
   * (factor=scale/int_scale) to get rid of the integer math rounding
   */
  XPutImage(pdpy, pwin, pgc, IconXImage(), 0, 0, 
            dest_x, dest_y, IconXImage()->width, IconXImage()->height);

  (void)XpSetImageResolution(pdpy, pcontext, prev_res, &dummy);

  XDrawRectangle(pdpy, pwin, pgc, 
                 dest_x-2, dest_y-2, 
                 ((double)IconXImage()->width*int_scale)+4, 
                 ((double)IconXImage()->height)*int_scale+4);

  XPU_TRACE(XpEndPage(pdpy));
  puts("end page.");
  XPU_TRACE(XpuWaitForPrintNotify(pdpy, XPEndPageNotify));      
}
-- snip --

x!!@@xx!!xx - who invented this integer math nightmare ?

At least... there is a way around this: Implement scaling via XIE and modify XIE
implementation on Xprt to use a server-side equivalent for
XpSetXYImageResolution(Display*, XPContext *, double x_res, double y_res, double
*prev_int_res, double *prev_y_res); /* yes, I know... passing double/float via
X11 protocol doesn't work well - but passing two CARD32 values (long x1 = 1, x2
= 2; double x=x1/x2;) should do the trick... */

And a Xprintv2 protcol should implemement XpSetXYImageResolution() and
XpSetXYImageScalers() /* XpSetXYImageScales() is a client-side wrapper for
XpSetXYImageResolution() which accepts x,y-scaling factors instead of "image
resolutions" */ ...

Some comments:

  * rename XLIB_RGB_DITHER_XPRINT to NS_XPRINT_DITHER (or something along those
    lines) to keep the XLIB_RGB namespace clean

  * GetScaledXImage() is pretty gross.  Input and output are XImages, even when
    you have access to the raw original data and only use the data field of the
    output image.  Remove the overhead.  You need to scale three things:
    888-rgb, 8-alpha, and 1-alpha data.  The first two are trivial to do by 
    hand and will result in simpler, faster code.  The later will require some
    bit twiddling, but shouldn't be that bad.

  * GetDrawingSurface() should stick null into aSurface in case the caller
    didn't initialize it.

  * DrawImage statics should be PRPackedBool with PR_TRUE/PR_FALSE

  * image scaling is assuming that alpha data is a mask (1-bit)
    (ie: "srcAlphaImg->bits_per_pixel   = 1;")
> * rename XLIB_RGB_DITHER_XPRINT to NS_XPRINT_DITHER (or something along those
>   lines) to keep the XLIB_RGB namespace clean

Will be fixed.

> * GetScaledXImage() is pretty gross.  Input and output are XImages, even when
>   you have access to the raw original data and only use the data field of the
>   output image.  Remove the overhead.  You need to scale three things:
>   888-rgb, 8-alpha, and 1-alpha data.  The first two are trivial to do by 
>   hand and will result in simpler, faster code.  The later will require some
>   bit twiddling, but shouldn't be that bad.

This code should never ever be called in the final version - it is only planned
as a fallback solution until the _real_ scaling code will land (this is bug
57820) - and for cases where the Xprint-scaling code fails (should not happen,
too - but I'd like to be prepared for the theoretical case... :-) ...
I agree with you... the code is slow&braindead - but it is simple&small, too.
I perfer simple code in such cases - all other code will be more code than
neccesary...

> * GetDrawingSurface() should stick null into aSurface in case the caller
>   didn't initialize it.

Valid argument. But PostScript code does the same stupid thing... I try to fix
that - but it may break something else...

> * DrawImage statics should be PRPackedBool with PR_TRUE/PR_FALSE

This static member will be removed when code in bug 57820 lands... the whole
thing with the env var is a temporary solution...

> * image scaling is assuming that alpha data is a mask (1-bit)
>   (ie: "srcAlphaImg->bits_per_pixel   = 1;")

Known bug. Alpha support doesn't work anyway... I try to fix this in bug 57820,
too...
I've attached a new patch top get sr= 
Changes:
- Renamed XLIB_RGB_DITHER_XPRINT to MY_XLIB_RGB_DITHER_XPRINT
- GetDrawingSurface() now sets the results explicitly to nsnull
- static bools are now using PRPackedBool

Additional changes (new):
- I fixed mCurrentColor initalisation in nsRenderingContextXP.cpp, default was
"mCurrentColor = NS_RGB(255, 255, 255);" - now it's "mCurrentColor = NS_RGB(0,
0, 0);" - this bug caused that some pages had back boxes with black text...
(this bug was driving me nuts...)

Not fixed:
- GetScaledXImage() - only a temporary solution for now. I don't think it's
worth to think about a smarter,faster,prettier way of scaling XImages when bug
57820 implements a far better, faster and smarter solution (=scaling on
Xserver/printer side)... :-)
I've attached a new patch which is identical to the previous one except that it
fixes CJK fonts (solution from bug 66082, a minor change to
nsFontMetricsXP.cpp). The fix is so easy - it screams for integration... :-)
The patch from 66082 was unreviewed.  Do not pass go, do not collect $200.
The only difference in the CJK patch, is addition of "len / 2" in certain
places, which could be gleamed by reading "man XTextWidth16" and noticing that
the length parameter for the checked string must be half the length of the
actual buffer since double-byte characters are used.
tor:
OK... point for you... but then
http://bugzilla.mozilla.org/showattachment.cgi?attach_id=36385 will make the
"race", does it (e.g. same patch but without patch for nsFontMetricsXP.cpp) ?

I'll fire-up a new bug for that issue...
timecop:
Wanna r= the fix for nsFontMetricsXP.cpp in patch
http://bugzilla.mozilla.org/showattachment.cgi?attach_id=36421 ?
r=timecop (for the nsFontMetricsXP.cpp).
Looks good there.
Personally I don't like the name MY_XLIB_RGB_DITHER_XPRINT, but that's
a minor matter.

How far away is the code for doing images properly (bug 57820)?
-  void               SetDrawingSurface(nsDrawingSurface  aSurface) { mSurface =
aSurface; }
+  void               SetDrawingSurface(nsDrawingSurface  aSurface);

Is that right?  You aren't passing by reference?

+  srcImg = (XImage *)malloc(sizeof(XImage));
+  memset(srcImg, 0, sizeof(XImage));

You don't check the result of srcImg there and you should be using
nsMemory::Alloc() instead of malloc().

+  if( srcImg != nsnull )
+  {
+    if( subImg == nsnull )
+    {
+      srcImg->data = nsnull; /* we do not own this piece of memory */
+      XDestroyImage(srcImg);
+    }
+    else
+    {
+      XDestroyImage(subImg);
+    }  
+  }      

Don't you want to remove that else {} around teh XDestroyImage?  I suspect that
srcImg is leaked if subImg is not null.

Fix that and you have an sr=blizzard
tor:
> Personally I don't like the name MY_XLIB_RGB_DITHER_XPRINT, but that's
> a minor matter.

Gnnn... I know... I'll replace it with a var or remove it in the future. This
was only a small hack to test code for bug 57820 (turn off dithering to see
possible "pixel blocks" in scaled images)...

> How far away is the code for doing images properly (bug 57820)?

One or two days, excluding weekend. Biggest problem is that I have to patch
xlibrgb.c to get rid of the mad tiling it does (which causes various issues with
X11 stuff - incl. Xprint... ;-( )...
And alpha images are problematic... I wish I could simply create a nsImageXlib()
from incoming nsIImage objects (using those objects directly does not work with
nsImageGTK/nsImageQT objects) and use that for drawing (well, possible... but 
that may cause problems with turning Xprint "on" per default... - reviewers will
love me... =:-) But I would prefer this way as more code get's reused, adds a
better client-side scaling code... but that is not possible for bug 57820
because first the GC-cache (which includes many fixes to nsImageXlib) in
Xlib-toolkit must land - and then I have to port the GC-cache to Xprint...

----

blizzard:
> -  void               SetDrawingSurface(nsDrawingSurface  aSurface) { mSurface
=
> aSurface; }
> +  void               SetDrawingSurface(nsDrawingSurface  aSurface);
> 
> Is that right?  You aren't passing by reference?

-- snip --
mozilla/gfx/src% tgrep SetDrawingSurface | fgrep aSurface | fgrep -v xprint
./ps/nsDeviceContextPS.h :      void                           
SetDrawingSurface(nsDrawingSurface  aSurface) { mSurface = aSurface; }
./motif/nsDeviceContextMotif.h :  void SetDrawingSurface(nsDrawingSurfaceMotif *
aSurface) { mSurface = aSurface; }
./mac/nsDeviceContextMac.h :    void                           
SetDrawingSurface(nsDrawingSurface  aSurface) { mSurface = aSurface; }
-- snip --

Other toolkits do the same... 
I assume that code isn't used anymore...

> +  srcImg = (XImage *)malloc(sizeof(XImage));
> +  memset(srcImg, 0, sizeof(XImage));
> 
> You don't check the result of srcImg there 

Fixed.

> and you should be using
> nsMemory::Alloc() instead of malloc().

I am malloc()'ing that XImage because I feed it to XDestroyImage() later. Using
nsMemory::Alloc() doesn't work here...

> +  if( srcImg != nsnull )
> +  {
> +    if( subImg == nsnull )
> +    {
> +      srcImg->data = nsnull; /* we do not own this piece of memory */
> +      XDestroyImage(srcImg);
> +    }
> +    else
> +    {
> +      XDestroyImage(subImg);
> +    }  
> +  }
> Don't you want to remove that else {} around teh XDestroyImage?  I suspect 
> that srcImg is leaked if subImg is not null.

If (subImg != NULL) then (subImg == srcImg) is TRUE, too - because the original
src was free'ed previously...

> Fix that and you have an sr=blizzard

Thanks, I'll file a new patch...
Filed new patch to match sr=blizzard ...

Asa:
I need a=drivers/a=asa/etc. that mkaply can check it in..., please...
Whiteboard: 0.9.1 a= request mailed to drivers 05/23. no sr yet → 0.9.1 a= request mailed to drivers 05/23.
a= asa@mozilla.org for checkin to 0.9.1
(on behalf of drivers)
mkaply:
Could you please checkin the lastest patch (both "0.9.1"+"main" branch) and mark
the bug as "fixed" after checkin, please ?
Thanks !
Whiteboard: 0.9.1 a= request mailed to drivers 05/23. → a=asa@mozilla.org for checkin to 0.9.1 (on behalf of drivers)
timeless:
Could you please checkin the lastest patch (both "0.9.1"+"main" branch) and mark
the bug as "fixed" after checkin, please ?
Thanks !
Whiteboard: a=asa@mozilla.org for checkin to 0.9.1 (on behalf of drivers) → a=asa@mozilla.org for checkin to 0.9.1 (on behalf of drivers)
ok, mkaply committed to branch and I committed to trunk.
Status: ASSIGNED → RESOLVED
Closed: 23 years ago
Resolution: --- → FIXED
Whiteboard: a=asa@mozilla.org for checkin to 0.9.1 (on behalf of drivers)
I'm now verifying the Xprt bugs, however, I'm not sure how to
verify this bug.

Roland,

could you give the exact instruction how to reproduce
this problem? Is it OK when I can print images?
Verifying this one is easy:
If you see images (correctly scaled) in the print job then everything is OK...
:)
Thanks, mark this as VERIFIED.
Status: RESOLVED → VERIFIED
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: