Closed
Bug 185195
Opened 22 years ago
Closed 21 years ago
cleanup BMP Decoder
Categories
(Core :: Graphics: ImageLib, defect, P3)
Core
Graphics: ImageLib
Tracking
()
RESOLVED
FIXED
mozilla1.6beta
People
(Reporter: Biesinger, Assigned: Biesinger)
Details
Attachments
(1 file, 3 obsolete files)
18.60 KB,
patch
|
tor
:
superreview+
|
Details | Diff | Splinter Review |
Now that there's a member variable mDecoded, mRow is no longer needed and can be
eliminated.
there's probably other stuff too.
Comment 1•22 years ago
|
||
I have no problem with the idea of incrementally decoding but I don't see how to
handle e.g. DWORD padding, or split multi-byte colour data.
Other cleanup: rename mCurLine to mLastLine (or something).
Assignee | ||
Updated•22 years ago
|
Target Milestone: --- → Future
Assignee | ||
Updated•22 years ago
|
Priority: -- → P5
Assignee | ||
Comment 2•21 years ago
|
||
well... I decided to not do what comment 0 suggested - doing that made the code
more unreadable, and only saved 300 bytes codesize, that was not worth it.
however, I found other cleanup I could do, which is contained in this patch
Assignee | ||
Updated•21 years ago
|
Attachment #134138 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Updated•21 years ago
|
Status: NEW → ASSIGNED
OS: Windows 98 → All
Priority: P5 → P3
Hardware: PC → All
Target Milestone: Future → mozilla1.6beta
Comment 3•21 years ago
|
||
Comment on attachment 134138 [details] [diff] [review]
patch
I can't speak for the Close() changes.
>- byte = 0;
>+ mAlpha[cnt] = 0;
> for (bit = 128; bit; bit >>= 1)
>- byte |= *pos++ & bit;
>- mAlpha[cnt] = byte;
>+ mAlpha[cnt] |= *pos++ & bit;
Do the 8 extra memory reads and writes optimize away?
>+ mNumColors = 1 << mBIH.bpp;
> if (mBIH.colors)
> mNumColors = mBIH.colors;
Perhaps mNumColors = mBIH.colors ? mBIH.colors : 1 << mBIH.bpp;
>- else if (aCount && mBIH.compression == BI_BITFIELDS && mPos < (mLOH + 12)) {
>- PRUint32 toCopy = (mLOH + 12) - mPos;
>+ else if (aCount && mBIH.compression == BI_BITFIELDS && mPos < (mLOH + BITFIELD_LENGTH)) {
>+ PRUint32 toCopy = (mLOH + BITFIELD_LENGTH) - mPos;
>- if (mBIH.compression == BI_BITFIELDS && mPos == mLOH+12) {
>+ if (mBIH.compression == BI_BITFIELDS && mPos == mLOH + BITFIELD_LENGTH) {
It occurs to me that only Windows bitmaps support compression, so mLOH is
always WIN_HEADER_LENGTH here...
>+#define BFH_LENGTH 18 // Note: For our purposes, we include bihsize in the BFH
Perhaps sizeof(BMPFILEHEADER) instead?
>+#define WIN_HEADER_LENGTH (BFH_LENGTH + 36)
Perhaps use sizeof(BMPINFOHEADER) instead of 36?
>+#define BITFIELD_LENGTH 12 // Length of the bitfields structure in the bmp file
Perhaps use sizeof(bitFields) instead?
>-// enums for mState
>+/// enums for mState
So, what's behind these comment changes?
Attachment #134138 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Comment 4•21 years ago
|
||
>I can't speak for the Close() changes.
oh, I basically just decided that I don't need to set some variables to null;
and moved other stuff to the destructor.
>Do the 8 extra memory reads and writes optimize away?
No idea :) I can't read assembler... would you prefer it if I wouldn't change that?
>Perhaps sizeof(BMPFILEHEADER) instead?
>Perhaps use sizeof(BMPINFOHEADER) instead of 36?
>Perhaps use sizeof(bitFields) instead?
I believe the compiler is free to insert any padding into these structures that
he wants. so I can't trust sizeof() to give the sum of the member sizes.
>So, what's behind these comment changes?
Doxygen can automatically generate documentation from such comments (see
http://unstable.elemental.com/mozilla/)
I'll make a new patch addressing the other comments
Assignee | ||
Comment 5•21 years ago
|
||
Assignee | ||
Updated•21 years ago
|
Attachment #134138 -
Attachment is obsolete: true
Assignee | ||
Comment 6•21 years ago
|
||
Comment on attachment 134340 [details] [diff] [review]
patch v2
doesn't address your "8 read/write" question. tell me if you want that chagne
undone
Attachment #134340 -
Flags: review?(neil.parkwaycc.co.uk)
Comment 7•21 years ago
|
||
Comment on attachment 134340 [details] [diff] [review]
patch v2
>- rv = mFrame->GetAlphaBytesPerRow(&alpha);
>+ nsresult rv = mFrame->GetAlphaBytesPerRow(&alpha);
> NS_ENSURE_SUCCESS(rv, rv);
> for (cnt = 0; cnt < alpha; cnt++) {
>- byte = 0;
>+ mAlpha[cnt] = 0;
> for (bit = 128; bit; bit >>= 1)
>- byte |= *pos++ & bit;
>- mAlpha[cnt] = byte;
>+ mAlpha[cnt] |= *pos++ & bit;
> }
OK, so I wrote a test program, and my way mAlpha isn't stored in a register,
and your way mAlpha[cnt] isn't stored in a register. I then modified the test
and was able to get everything in registers. It was only then that I spotted
the "aliasing" - mAlpha[0] is in fact *pos, so you clobber the first bit your
way :-( FYI here is the register code:
PRUint8 *src = mAlpha, *dest = mAlpha;
while (alpha) {
byte = 0;
for (bit = 128; bit; bit >>= 1)
byte |= *src++ & bit;
*dest++ = byte;
alpha--;
}
-O1 Registers: al: *src; bl: byte ecx: src dl: bit esi: alpha edi: dest
(-O2 is worse, puts byte in esi! Ideally alpha belongs in ecx.)
Attachment #134340 -
Flags: review?(neil.parkwaycc.co.uk) → review-
Assignee | ||
Comment 8•21 years ago
|
||
ok, I just undid that change
Attachment #134340 -
Attachment is obsolete: true
Assignee | ||
Updated•21 years ago
|
Attachment #136116 -
Flags: review?(neil.parkwaycc.co.uk)
Comment 9•21 years ago
|
||
Comment on attachment 136116 [details] [diff] [review]
patch v3
>+#define BFH_LENGTH 18 // Note: For our purposes, we include bihsize in the BFH
>+
>+#define OS2_BIH_LENGTH 12 // This is the real BIH size (as contained in the bihsize field of BMPFILEHEADER)
>+#define OS2_HEADER_LENGTH (BFH_LENGTH + 8)
>+#define WIN_HEADER_LENGTH (BFH_LENGTH + 36)
I don't like these meaningless additions - why not just say 26 and 54, and
comment that they are the sum of the file header and the appropriate info
header?
Attachment #136116 -
Flags: review?(neil.parkwaycc.co.uk) → review+
Comment 10•21 years ago
|
||
Comment on attachment 136116 [details] [diff] [review]
patch v3
> nsBMPDecoder::nsBMPDecoder()
> {
> mColors = nsnull;
> mRow = nsnull;
> mPos = mNumColors = mRowBytes = 0;
> mCurLine = 1; // Otherwise decoder will never start
> mState = eRLEStateInitial;
> mStateData = 0;
> mAlpha = mAlphaPtr = mDecoded = mDecoding = nsnull;
>+ mLOH = WIN_HEADER_LENGTH;
> }
For extra brownie points, use
: mLOH(WIN_HEADER_LENGTH) etc.
Assignee | ||
Comment 11•21 years ago
|
||
Comment on attachment 136116 [details] [diff] [review]
patch v3
ok, I'll make those changes before checking in
Attachment #136116 -
Flags: superreview?(tor)
Comment 12•21 years ago
|
||
Comment on attachment 136116 [details] [diff] [review]
patch v3
Patch leaks mRow.
Attachment #136116 -
Flags: superreview?(tor) → superreview-
Assignee | ||
Comment 13•21 years ago
|
||
Attachment #136116 -
Attachment is obsolete: true
Assignee | ||
Updated•21 years ago
|
Attachment #139270 -
Flags: superreview?(tor)
Comment 14•21 years ago
|
||
Comment on attachment 139270 [details] [diff] [review]
don't leak mRow
A bit odd you're using C-style allocation for two of the temporary
arrays and C++ for other two, but can be cleaned up later if you
like. sr=tor
Attachment #139270 -
Flags: superreview?(tor) → superreview+
Assignee | ||
Comment 15•21 years ago
|
||
checked in
I use C-style allocations to be able to use calloc.
Status: ASSIGNED → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•