Closed
Bug 3195
Opened 26 years ago
Closed 24 years ago
Load progressive PNG images -> incomplete rendering
Categories
(Core Graveyard :: GFX, defect, P2)
Tracking
(Not tracked)
VERIFIED
FIXED
M17
People
(Reporter: dbaron, Assigned: pnunn)
References
()
Details
(Whiteboard: [nsbeta2-]PLEASE reconsider for nsbeta2+.)
Attachments
(5 files)
3.18 KB,
patch
|
Details | Diff | Splinter Review | |
3.19 KB,
patch
|
Details | Diff | Splinter Review | |
3.09 KB,
patch
|
Details | Diff | Splinter Review | |
2.87 KB,
patch
|
Details | Diff | Splinter Review | |
2.59 KB,
patch
|
Details | Diff | Splinter Review |
The large snake image a few pages down in the above URL has strange progressive display. (You have to scroll down while it's still loading). The progressive display works fine on the right 20% or so of the image, but for the rest of the image you only seem to be showing the lines you already have rather than filling in the other areas.
Updated•26 years ago
|
QA Contact: 4110 → 2792
Comment 1•26 years ago
|
||
[QA Assigning to self.]
Comment 2•25 years ago
|
||
This is due to imagelib modifying one of libpng's buffers (scale.cpp, il_emit_row(), is_interleaved_alpha section). Imagelib needs to allocate its own buffers for an RGB row and an alpha row, copying from the libpng (RGBA) row buffer appropriately. Now that imagelib 2.0 is checked in and almost working, we should be able to fix this relatively quickly.
I think this has more to do with the progressive display passes not rescaling. Not the dimensions of each pass. -pn
Reporter | ||
Comment 4•25 years ago
|
||
The images at http://www.fas.harvard.edu/~dbaron/css/fonts/sizes/nn45linux are also a little messed up. The text comes out a bit rough. There are some pixels that are wrong every other row (looks like leftover from interlacing). It's easily visible on the text.
Updated•25 years ago
|
QA Contact: 2792 → 1698
Comment 5•25 years ago
|
||
This is two separate bugs. The first, which applies only to transparent, interlaced images, is due to the buffer problem I identified on 24 April; I've fixed this in my code (temporary fix; final fix awaits other alpha-transparency fixes). The second bug, reported by dbaron, results in the even rows (if top = row 1 = odd) of an interlaced image, either transparent or opaque, being shifted to the left by one pixel in the final display. I don't know what causes this, but I suspect it's partly due to the fact that all PNG passes *except* the final one have "holes" in the row data, and there is no per-pass mask being applied. (Of course, one would then expect that the *odd* rows would be screwed up...) This seems to be a fundamental limitation of the current imagelib implementation, i.e., that masks correspond to transparency only. Fixing that requires structural changes to il_emit_row() in scale.cpp.
Comment 6•25 years ago
|
||
adding self to cc list
Updated•25 years ago
|
Target Milestone: M9 → M11
Comment 7•25 years ago
|
||
m11
Updated•25 years ago
|
Status: NEW → ASSIGNED
Comment 8•25 years ago
|
||
I did some further investigation of the second bug, using the transparency mask for both transparency and masking of partial interlace passes and calling ImgDCBFlushImage() for every row. Either ImgDCBFlushImage() isn't flushing, or else something upstream isn't treating the mask correctly. My best guess at the moment is that the image mask is not being used to selectively lay down new pixels but rather to selectively replace old ones with the background. The two are subtly different--critically so for PNG--though their behavior happens to be identical in the case of GIF. If my guess is correct, it's going to cause big problems for interlaced, NON-transparent PNGs. Masking is required for these images in order to avoid replacing valid, previous-pass pixels with garbage from later, sparse passes (e.g., in pass 6, only every other pixel is valid; what's in between is undefined). But Mozilla should never resolve the mask "transparency" in such images by replacing it with background pixels--the mask in this case is ephemeral and becomes totally opaque by the final interlace pass. Eli, I don't know who's responsible for gfx/src, but I believe this all takes place in nsImageRenderer.cpp (ImageRendererImpl::UpdatePixmap()) and through that in the platform-specific nsImage[FE]::ImageUpdated() methods. Could you please cc somebody relevant who can discuss masks with me? Thanks, Greg
Comment 9•25 years ago
|
||
[not sure who optimal person was, so pinged Greg by e-mail to suggest a few folks.]
Comment 10•25 years ago
|
||
Pam checked in the other half of my pngcom revisions/fixes on 9 September, and that fixes the first bug (i.e., the one where interlaced passes on transparent images get squished/"echoed" to the left). No progress yet on the second one. Greg
Comment 11•25 years ago
|
||
*** Bug 8127 has been marked as a duplicate of this bug. ***
Comment 12•25 years ago
|
||
*** Bug 16820 has been marked as a duplicate of this bug. ***
Comment 13•25 years ago
|
||
[note to self: upon verification, please be sure to double-check that all of the various interlaced PNGs that have been marked as duplicates do in fact display correctly.]
Updated•25 years ago
|
Target Milestone: M11 → M12
Comment 14•25 years ago
|
||
m12. let me know if there are more changes ready for this in in the next couple of days and we can see about getting them into m11
Comment 15•25 years ago
|
||
Nothing is going to happen here for M11. Geoff, what's the deal with getting PNG support up to scratch? Do you need any help from this end?
Comment 16•25 years ago
|
||
I'm Greg, and yes, I could use some help with the concept of masks as practiced by gfx/src (see 09/03/99 entry above). At Eli's suggestion, I sent an offline e-mail to Patrick Beard asking for insights, but I never got any response. Recap of basic problem: using the transparency mask for both transparency and interlacing purposes results in holes in the opaque parts of the image--i.e., the background shows through. This SHOULD NEVER HAPPEN since previous passes have paved over the entire area with opaque pixels, and I've flushed all pending data. Ergo, something funny is happening with the handling of masks, and I'm pretty sure it has to do with old assumptions based on GIF transparency and interlacing. But I haven't had time to dig through the code under gfx for many weeks. (For that matter, it's been two months since I even had a halfway-working build.) Greg
Comment 17•25 years ago
|
||
*** Bug 18474 has been marked as a duplicate of this bug. ***
Updated•25 years ago
|
Summary: problems with progressive display of interlaced PNG → Progressive load of PNG images leave incomplete rendering
Comment 18•25 years ago
|
||
[updated to bug description from 18645 which is IMHO clearer.]
Comment 19•25 years ago
|
||
BTW, if this bug contains two separate issues (rather than just the incomplete rendering on progressively loaded PNG images), could they be split into two separate bugs, please? [I can take a stab, but this is more white-box.]
Comment 20•25 years ago
|
||
*** Bug 18645 has been marked as a duplicate of this bug. ***
Comment 21•25 years ago
|
||
elig@netscape.com wrote: > BTW, if this bug contains two separate issues (rather than just the incomplete > rendering on progressively loaded PNG images), could they be split into two > separate bugs, please? Well, one is fixed, so I would argue that 3195 now contains only one (open) issue. :-) There are also a lot of links (including mental ones) to 3195 that would break if the open part got moved. Is it really that important? If so, I'd suggest moving the (fixed) transparency/interlacing bug somewhere else. But that seems a little silly to me... Greg
Comment 22•25 years ago
|
||
Hrmf...as long as the summary accurately describes the current bug report, it's all fine with me. (Please amend it if it's inaccurate!) Thanks!
Comment 23•25 years ago
|
||
The summary is correct for the outstanding bug--the transparency-related one only showed up for the intermediate passes. I haven't heard doodly from anyone who might know about how masks are used (in the philosophical sense) in Mozilla, but if it would help, I think I could dig out a patch I did that combines transparency-masking plus interlace-masking in the same mask. This results in final images that look OK except that they have holes in them (every other line, every other pixel--i.e., 25% holes). This is the case that should never happen if the masking code did what (I believe) it should--that is, all of the holes were opaque in previous interlace passes. But now that I think about it some more, it looks like Mozilla is saving that final, combined mask for subsequent rendering tasks, when one really wants only part of the mask to be saved. This relates to Pam's comment (somewhere, once upon a time) about needing two different types of masks--one for PNG/GIF transparency and one for PNG interlacing. I think she's right about that. Greg
Updated•25 years ago
|
Target Milestone: M12 → M14
Comment 24•25 years ago
|
||
m14. let me know if there are more changes ready for this in in the next couple of days and we can see about getting them into m12
Comment 25•25 years ago
|
||
*** Bug 22729 has been marked as a duplicate of this bug. ***
Comment 26•25 years ago
|
||
*** Bug 24046 has been marked as a duplicate of this bug. ***
Comment 27•25 years ago
|
||
Adding self to cc list
Comment 28•25 years ago
|
||
Per e-mail from Greg, he has relinquished PNG component ownership; thus, reassigning assigned bugs to ImageLib owner.
Assignee: newt → pnunn
Status: ASSIGNED → NEW
Comment 29•25 years ago
|
||
*** Bug 25221 has been marked as a duplicate of this bug. ***
Assignee | ||
Comment 30•25 years ago
|
||
*** Bug 29428 has been marked as a duplicate of this bug. ***
Comment 31•25 years ago
|
||
*** Bug 31795 has been marked as a duplicate of this bug. ***
Comment 32•24 years ago
|
||
*** Bug 33324 has been marked as a duplicate of this bug. ***
Comment 33•24 years ago
|
||
Altered subject to add 'transparent' keyword.
Summary: Progressive load of PNG images leave incomplete rendering → Load progressive or transparent PNG images -> incomplete rendering
Comment 34•24 years ago
|
||
Why has "transparent" been added back to the summary? All transparency-related bugs were reported fixed earlier in this report. If you want to report a regression please file a New P2-major bug to reflect the seriousness of degraded graphics support in a graphical browser.
Comment 35•24 years ago
|
||
Doh, didn't read past the first two pages...
Summary: Load progressive or transparent PNG images -> incomplete rendering → Load progressive PNG images -> incomplete rendering
Comment 36•24 years ago
|
||
*** Bug 34750 has been marked as a duplicate of this bug. ***
Comment 37•24 years ago
|
||
*** Bug 35943 has been marked as a duplicate of this bug. ***
Comment 38•24 years ago
|
||
I'll attach a patch to correctly render interlaced PNG files. The problem is that PNG interlacing needs to selectively mask writes to pixels within a scanline because in addition to horizontal strips, vertical strips are used during decoding. Images appear corrupted on every other line because the 6th and final pass (horizontal) covers every other line; the lines that aren't covered on the 6th pass are incorrect because previous in previous vertical passes all the pixels in each line are written when only certain pixels should be. The bug doesn't have anything to do with transparency. My patch allocates a memory buffer for the entire image if the PNG is interlaced. This is somewhat wasteful of memory, but the intermediate results must be stored somewhere and I certainly don't want to touch il_emit_row. I don't know if it would even be possible. If it is, there would be major work involved. I suppose il_emit row could be called up to 100 times per row, but that would be silly. Progressive decoding requires read access to previous scanlines that have not been transformed in any way. I used the png_progressive_combine_row function to do the actual combining. This function was mentioned in the row_callback, but not called. I think the comment was copied from somewhere else. I don't know ImgDCBHaveRow "pass" parameter should be. What happens with that value? Does it understand PNG pass numbers? If it doesn't will that cause problems? Perhaps 0 should be used? I continute to pass the pass value for now. I followed the pattern in the existing code and freed the buffer in png_il_abort, I don't know if it can/should be freed at an earlier point. I just mention it because we don't want a potentially large buffer (it is height times larger than the existing row buffer) hanging around for no reason once the image is decoded.
Comment 39•24 years ago
|
||
Comment 40•24 years ago
|
||
Comment 41•24 years ago
|
||
Putting on [nsbeta2-] radar. Not critical to beta2. Putting on nsbeta3 for a fix for PR2.
Keywords: nsbeta3
Whiteboard: [nsbeta2-]
Comment 42•24 years ago
|
||
Chris Hill - is seems this patch has been let slip through the net. Could you possibly have a look at it to see if it still applies correctly, and then we'll try and get it in? Gerv
Comment 43•24 years ago
|
||
The files that the patch modifies (ipng.cpp, ipng.h) are still at the same revision levels (1.22, 1.6) so it should apply correctly. It would be great to get this patch applied.
Comment 44•24 years ago
|
||
Chris - in the end, that's up to pnunn@netscape.com - and seeing as they are about to feature freeze, he's probably a bit busy. And this bug is marked nsbeta3, so it will happen eventually. I just wanted to check that dev. wasn't going on and leaving this patch behind. If he's not about to do anything to either of the PNG files, I suppose it can wait. The patch won't rot. Still, it would be nice... <wistful sigh> Gerv
Comment 45•24 years ago
|
||
Sorry, Pam - your real name isn't associated with your Bugzilla ID. That should read: "...she's a bit busy...". Thanks to tor for the tip-off. ;-) Gerv
Comment 46•24 years ago
|
||
I sent mail to Pam last week. She was involved with another beta critical issue, but said she would test the patch when she could. I had hoped that this patch would be applied sooner, and I still hope it will happen soon. This is a really bad PNG bug. I'm still waiting for my first mozilla patch to be applied, even though I have submitted several. I'll feel better when some of the fixes I have in my local copy are available for everyone. I got so fed up with this bug (and a few others) I decided to download the source for the first time and fix it myself.
Comment 47•24 years ago
|
||
*** Bug 39701 has been marked as a duplicate of this bug. ***
Comment 48•24 years ago
|
||
*** Bug 39701 has been marked as a duplicate of this bug. ***
Comment 49•24 years ago
|
||
Comment 50•24 years ago
|
||
I've remerged this patch since it doesn't apply cleanly anymore. Pam, what's you status? Have you had a change to look at this?
Assignee | ||
Comment 51•24 years ago
|
||
Chris: Nope. I've not had time to look at it. I have some other bugs that affect all images, not just one format... Will get to as soon as I can. -P
Comment 52•24 years ago
|
||
*SPAM* - adding mostfreq keyword to bugs with loads of DUPEs. Please aid this effort by adding this keyword to any bugs with more than 15 DUPEs. Gerv
Keywords: mostfreq
Assignee | ||
Comment 53•24 years ago
|
||
Chris H: Thanks for the patch and the *remerged* patch. (CB) This looks great. I'll start begging the PDT team to tag this an nsbeta2+, so I can check it in. ...and sorry about the delay. Its been a zoo here. -pn and... Gervase: no problem on the "he's abit busy". In cyberspace, no one knows you're a goddess. ;) I don't take offense if none is intended. -pn
Whiteboard: [nsbeta2-] → [nsbeta2-]PLEASE reconsider for nsbeta2+.
Assignee | ||
Comment 54•24 years ago
|
||
PDT: I've replaced 'nsBeta2-' with 'nsBeta2' in the hopes this change will bring this bug back to your attention. -pnunn
Whiteboard: [nsbeta2-]PLEASE reconsider for nsbeta2+. → [nsbeta2]PLEASE reconsider for nsbeta2+.
Comment 55•24 years ago
|
||
Looking at my patch again, it looks like one line got mixed up with some stuff I was trying with bug 19283. - if(png_ptr->color_type || PNG_COLOR_MASK_ALPHA ) + if(png_ptr->color_type & PNG_COLOR_MASK_ALPHA ) This line shouldn't be in the patch, it doesn't have anything to do with interlacing (and it is incorrect because palette based images can use 8-bit alpha). There is a big discussion in 19283 about this. I'm glad this patch is closer to getting checked in, I don't want to break anything. Once this bug and 19283 (aka 36694) are fixed (there is a patch waiting for that as well), PNG support in mozilla will be in much better shape.
Assignee | ||
Comment 56•24 years ago
|
||
Not to worry, CH. -P
Assignee | ||
Comment 57•24 years ago
|
||
Assignee | ||
Comment 58•24 years ago
|
||
Assignee | ||
Comment 59•24 years ago
|
||
Looks like I lost some of my comments when I attached the last patch. I made a few modifications. Mainly I removed code needed when we were doing 8bit mask development and some, but not all, platforms could handle it. I've got necessary approvals and will check in the 'final final' patch as soon as the tree gets past the smoketest blockers. thanks much Chris! I'll be clearing out some time to test out the binary transparency stuff. Onward! -P
Comment 60•24 years ago
|
||
Putting on [nsbeta2-] radar. Though mozilla folks may check it in.
Whiteboard: [nsbeta2]PLEASE reconsider for nsbeta2+. → [nsbeta2-]PLEASE reconsider for nsbeta2+.
Comment 61•24 years ago
|
||
I've had to remerge this patch again. I think that the patch had ^Ms in it. If I can get approval from the fearsome twosome I'll check it in.
Assignee: pnunn → blizzard
Status: ASSIGNED → NEW
Assignee | ||
Comment 62•24 years ago
|
||
Thanks, CB. I'll check in and baby sit tinderbox through its cycles. -P
Assignee: blizzard → pnunn
Assignee | ||
Comment 63•24 years ago
|
||
Patch from Chris Hill checked in. tah-dah. -pn
Status: NEW → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
Updated•16 years ago
|
Product: Core → Core Graveyard
You need to log in
before you can comment on or make changes to this bug.
Description
•