image/encoders/ico/nsICOEncoder.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #include "mozilla/Attributes.h"
     6 #include "mozilla/ReentrantMonitor.h"
     8 #include "imgIEncoder.h"
    10 #include "nsAutoPtr.h"
    11 #include "nsCOMPtr.h"
    12 #include "ICOFileHeaders.h"
    14 class nsBMPEncoder;
    15 class nsPNGEncoder;
    17 #define NS_ICOENCODER_CID \
    18 { /*92AE3AB2-8968-41B1-8709-B6123BCEAF21 */          \
    19      0x92ae3ab2,                                     \
    20      0x8968,                                         \
    21      0x41b1,                                         \
    22     {0x87, 0x09, 0xb6, 0x12, 0x3b, 0Xce, 0xaf, 0x21} \
    23 }
    25 // Provides ICO encoding functionality. Use InitFromData() to do the
    26 // encoding. See that function definition for encoding options.
    28 class nsICOEncoder MOZ_FINAL : public imgIEncoder
    29 {
    30   typedef mozilla::ReentrantMonitor ReentrantMonitor;
    31 public:
    32   NS_DECL_THREADSAFE_ISUPPORTS
    33   NS_DECL_IMGIENCODER
    34   NS_DECL_NSIINPUTSTREAM
    35   NS_DECL_NSIASYNCINPUTSTREAM
    37   nsICOEncoder();
    38   ~nsICOEncoder();
    40   // Obtains the width of the icon directory entry
    41   uint32_t GetRealWidth() const
    42   {
    43     return mICODirEntry.mWidth == 0 ? 256 : mICODirEntry.mWidth; 
    44   }
    46   // Obtains the height of the icon directory entry
    47   uint32_t GetRealHeight() const
    48   {
    49     return mICODirEntry.mHeight == 0 ? 256 : mICODirEntry.mHeight; 
    50   }
    52 protected:
    53   nsresult ParseOptions(const nsAString& aOptions, uint32_t* bpp, 
    54                         bool *usePNG);
    55   void NotifyListener();
    57   // Initializes the icon file header mICOFileHeader
    58   void InitFileHeader();
    59   // Initializes the icon directory info header mICODirEntry
    60   void InitInfoHeader(uint32_t aBPP, uint8_t aWidth, uint8_t aHeight);
    61   // Encodes the icon file header mICOFileHeader
    62   void EncodeFileHeader();
    63   // Encodes the icon directory info header mICODirEntry
    64   void EncodeInfoHeader();
    65   // Obtains the current offset filled up to for the image buffer
    66   inline int32_t GetCurrentImageBufferOffset()
    67   {
    68     return static_cast<int32_t>(mImageBufferCurr - mImageBufferStart);
    69   }
    71   // Holds either a PNG or a BMP depending on the encoding options specified
    72   // or if no encoding options specified will use the default (PNG)
    73   nsCOMPtr<imgIEncoder> mContainedEncoder;
    75   // These headers will always contain endian independent stuff.
    76   // Don't trust the width and height of mICODirEntry directly,
    77   // instead use the accessors GetRealWidth() and GetRealHeight().
    78   mozilla::image::IconFileHeader mICOFileHeader;
    79   mozilla::image::IconDirEntry mICODirEntry;
    81   // Keeps track of the start of the image buffer
    82   uint8_t* mImageBufferStart;
    83   // Keeps track of the current position in the image buffer
    84   uint8_t* mImageBufferCurr;
    85   // Keeps track of the image buffer size
    86   uint32_t mImageBufferSize;
    87   // Keeps track of the number of bytes in the image buffer which are read
    88   uint32_t mImageBufferReadPoint;
    89   // Stores true if the image is done being encoded  
    90   bool mFinished;
    91   // Stores true if the contained image is a PNG
    92   bool mUsePNG;
    94   nsCOMPtr<nsIInputStreamCallback> mCallback;
    95   nsCOMPtr<nsIEventTarget> mCallbackTarget;
    96   uint32_t mNotifyThreshold;
    97 };

mercurial