/// <summary>
 /// Load a residual layer bitmap into clearcode encoder.
 /// </summary>
 /// <param name = "subcodecBitmap"> specifies a subcodec layer image </param>
 /// <param name = "pos"> specifies position of subcodec layer image, relative to residual layer image </param>
 /// <param name = "sbcID"> specifies subcodec ID to encoding subcodec layer image </param>
 public void LoadSubcodecBitmap(Bitmap subcodecBitmap, RDPGFX_POINT16 pos, CLEARCODEC_SUBCODEC_ID sbcID)
 {
     if (subcodecBitmap != null)
     {
         ClearCodec_RECT16 scRect = new ClearCodec_RECT16();
         scRect.left   = pos.x;
         scRect.top    = pos.y;
         scRect.right  = (ushort)(pos.x + subcodecBitmap.Width);
         scRect.bottom = (ushort)(pos.x + subcodecBitmap.Height);
         BMP_INFO bmp_info = new BMP_INFO();
         bmp_info.bmp  = subcodecBitmap;
         bmp_info.scID = sbcID;
         this.subcodecDict.Add(scRect, bmp_info);
     }
 }
        /// <summary>
        /// Encode a subcodec bitmap area into byte stream
        /// </summary>
        /// <param name="subcodeBmp">The bitmap to be encoded in subcodec layer.</param>
        /// <param name="subcodecRect">The subcodec area relative to bitmap left-top edge.</param>
        /// <param name="subcodecID">The subcodec ID to be chosen.</param>
        /// <param name="subcodec">The subcodec layer encode result.</param>
        public static bool EncodeSubcodec(Bitmap subcodecBmp, ClearCodec_RECT16 subcodecRect, CLEARCODEC_SUBCODEC_ID subcodecID, 
            ref CLEARCODEC_SUBCODEC subcodec)
        {
            if (subcodecBmp == null) return false;

            subcodec.xStart = subcodecRect.left;
            subcodec.yStart = subcodecRect.top;
            subcodec.width = (ushort)(subcodecRect.right - subcodecRect.left);
            subcodec.height = (ushort)(subcodecRect.bottom - subcodecRect.top);
            // save subcodecID
            subcodec.bitmapData.subCodecId = subcodecID;
            // get encoded data based on subcodecID
            if (subcodecID == CLEARCODEC_SUBCODEC_ID.SUBCODEC_RLEX)
            {
                // RLEX encoded bitmap data
                if( !RlexEncode(subcodecBmp, ref subcodec.bitmapData.bmpRlex)) return false;

            }
            else
            {
                // raw encoded bitmap data
                if (!RawEncode(subcodecBmp, ref subcodec.bitmapData.bmpPixels)) return false;
            }

            return true;
        }
 /// <summary>
 /// Load a residual layer bitmap into clearcode encoder.   
 /// </summary>
 /// <param name = "subcodecBitmap"> specifies a subcodec layer image </param>
 /// <param name = "pos"> specifies position of subcodec layer image, relative to residual layer image </param>
 /// <param name = "sbcID"> specifies subcodec ID to encoding subcodec layer image </param>
 public void LoadSubcodecBitmap(Bitmap subcodecBitmap, RDPGFX_POINT16 pos, CLEARCODEC_SUBCODEC_ID sbcID)
 {
     if (subcodecBitmap != null)
     {
         ClearCodec_RECT16 scRect = new ClearCodec_RECT16();
         scRect.left = pos.x;
         scRect.top = pos.y;
         scRect.right = (ushort)(pos.x + subcodecBitmap.Width);
         scRect.bottom = (ushort)(pos.x + subcodecBitmap.Height);
         BMP_INFO bmp_info = new BMP_INFO();
         bmp_info.bmp = subcodecBitmap;
         bmp_info.scID = sbcID;
         this.subcodecDict.Add(scRect, bmp_info);
     }
 }
        /// <summary>
        /// Encode a subcodec bitmap area into byte stream
        /// </summary>
        /// <param name="subcodeBmp">The bitmap to be encoded in subcodec layer.</param>
        /// <param name="subcodecRect">The subcodec area relative to bitmap left-top edge.</param>
        /// <param name="subcodecID">The subcodec ID to be chosen.</param>
        /// <param name="subcodec">The subcodec layer encode result.</param>
        public static bool EncodeSubcodec(Bitmap subcodecBmp, ClearCodec_RECT16 subcodecRect, CLEARCODEC_SUBCODEC_ID subcodecID,
                                          ref CLEARCODEC_SUBCODEC subcodec)
        {
            if (subcodecBmp == null)
            {
                return(false);
            }

            subcodec.xStart = subcodecRect.left;
            subcodec.yStart = subcodecRect.top;
            subcodec.width  = (ushort)(subcodecRect.right - subcodecRect.left);
            subcodec.height = (ushort)(subcodecRect.bottom - subcodecRect.top);
            // save subcodecID
            subcodec.bitmapData.subCodecId = subcodecID;
            // get encoded data based on subcodecID
            if (subcodecID == CLEARCODEC_SUBCODEC_ID.SUBCODEC_RLEX)
            {
                // RLEX encoded bitmap data
                if (!RlexEncode(subcodecBmp, ref subcodec.bitmapData.bmpRlex))
                {
                    return(false);
                }
            }
            else
            {
                // raw encoded bitmap data
                if (!RawEncode(subcodecBmp, ref subcodec.bitmapData.bmpPixels))
                {
                    return(false);
                }
            }

            return(true);
        }