L_PutBitmapRowColCompressed

#include "l_bitmap.h"

L_LTKRN_API L_SSIZE_T L_PutBitmapRowColCompressed(pBitmap, pWorkBuffer, pRunBuffer, nRow, nCol, uWidth)

pBITMAPHANDLE pBitmap;

/* pointer to the bitmap handle */

L_UCHAR* pWorkBuffer;

/* pointer to a work buffer */

L_UINT16* pRunBuffer;

/* pointer to the source buffer */

L_INT nRow;

/* number of the row to update */

L_INT nCol;

/* column offset within the row to update */

L_UINT uWidth;

/* number of pixels to update */

Puts a row (or part of a row) of 1-bit compressed data from a buffer to a bitmap that is maintained in its compressed format.

Parameter

Description

pBitmap

Pointer to the bitmap handle referencing the bitmap to be updated.

pWorkBuffer

NULL or a pointer to an optional work buffer. Allocating the work buffer speeds processing if you call this function more than once, because if you do not allocate a work buffer, the function allocates and frees a temporary buffer each time it is called. The size of this buffer should be the same as the bitmap handle's BytesPerLine field.

pRunBuffer

Pointer to the input buffer, which contains 1-bit compressed image data.

nRow

The number of the row to update. The first row is 0, and the last row is 1 less than the bitmap height.

nCol

The column offset within the row to update. The first column offset is 0, and the last column offset is 1 less than the bitmap width.

uWidth

The number of pixels to retrieve.

Returns

> 0

The number of pixels processed.

< 1

An error occurred. Refer to Return Codes.

Comments

This function is useful for working with 1-bit images that are loaded in their compressed formats for faster loading and display. For more information, refer to Speeding Up 1-Bit Documents.

Required DLLs and Libraries

LTKRN

For a listing of the exact DLLs and Libraries needed, based on the toolkit version, refer to Files To Be Included With Your Application.

Platforms

Win32, x64, Mobile.

See Also

Functions:

L_ExpandRow, L_CompressRow, L_GetBitmapRowColCompressed, L_GetBitmapRowCompressed, L_PutBitmapRowCompressed

Topics:

Speeding Up 1-Bit Documents

Example

This example demonstrates the low-level functions for accessing 1-bit compressed bitmap data. It demonstrates the ability to get and put partial rows, and the ability to process partial rows in buffer-to-buffer processing. The result of the function is an inverted rectangle in the middle of the image.

 L_INT PutBitmapRowColCompressedExample(L_TCHAR*      pszFilename,
                                                       HWND          hWnd,
                                                       pBITMAPHANDLE pLeadBitmap)
{
   L_INT nRet;
   L_INT     XOffset;      /* Column offset of the rectangle to process */
   L_INT     XSize;        /* Pixel width of the rectangle to process */
   L_INT     YOffset;      /* Row offset of the rectangle to process */
   L_INT     YSize;        /* Pixel height of the rectangle to process */
   L_UCHAR*  pBuffer;      /* Buffer to hold the expanded row */
   L_UINT16* pRunBuffer;   /* Buffer to hold the compressed row */
   L_UCHAR*  pWorkBuffer;  /* Work buffer */
   HGLOBAL   hBuffer;      /* Handle to the pBuffer */
   HGLOBAL   hRunBuffer;   /* Handle to the pRunBuffer */
   HGLOBAL   hWorkBuffer;  /* Handle to the pWorkBuffer */
   L_INT     i, n;         /* Counters */

   /* Load the bitmap, at 1 bit per pixel */
   if(pLeadBitmap->Flags.Allocated)
      L_FreeBitmap(pLeadBitmap);
   nRet = L_LoadFile( pszFilename, pLeadBitmap, sizeof(BITMAPHANDLE),1,0,
                     LOADFILE_COMPRESSED | LOADFILE_ALLOCATE | LOADFILE_STORE,
                     NULL, NULL, NULL, NULL);
   if(nRet != SUCCESS)
      return nRet;
   /* This example does not work with rotated view perspectives */
   if ( (pLeadBitmap->ViewPerspective != TOP_LEFT) || (pLeadBitmap->ViewPerspective != BOTTOM_LEFT) )
   {
      nRet = L_ChangeBitmapViewPerspective ( NULL, pLeadBitmap, sizeof(BITMAPHANDLE), TOP_LEFT );
      if(nRet != SUCCESS)
      {
         L_FreeBitmap(pLeadBitmap);
         return nRet;
      }
   }
   /* Specify a rectangle in the middle right part of the displayed image */
   XOffset = pLeadBitmap->Width / 3;
   XSize = pLeadBitmap->Width * 2 / 3;
   YOffset = pLeadBitmap->Height / 3;
   YSize = pLeadBitmap->Height / 3;
   /* Adjust the YOffset if the view perspective is bottom left */
   if (pLeadBitmap->ViewPerspective == BOTTOM_LEFT)
   {
      YOffset = pLeadBitmap->Height - YOffset - YSize;
   }
   /* Allocate the buffers */
   hBuffer = GlobalAlloc(GMEM_MOVEABLE, ( XSize + 7) / 8);
   pBuffer = (L_UCHAR*)GlobalLock( hBuffer );
   hRunBuffer = GlobalAlloc(GMEM_MOVEABLE, (XSize + 3) * 2);
   pRunBuffer = (L_UINT16*)GlobalLock( hRunBuffer );
   hWorkBuffer = GlobalAlloc(GMEM_MOVEABLE, pLeadBitmap->BytesPerLine);
   pWorkBuffer = (L_UCHAR* )GlobalLock( hWorkBuffer );
   /* Invert the colors of pixels in the left half of the rectangle. */
   /* Notice that we get the whole rectangle, but process only half of it. */
   L_AccessBitmap(pLeadBitmap);
   for(i=YOffset; i < (YOffset + YSize); i++)
   {
      nRet = (L_INT)L_GetBitmapRowColCompressed(pLeadBitmap, pWorkBuffer,
                                          pRunBuffer, i, XOffset, XSize);
      if(nRet < 1)
      {
         L_FreeBitmap(pLeadBitmap);
         return nRet;
      }
      nRet = L_ExpandRow(pRunBuffer, pBuffer, 0, XSize/2);
      if(nRet != SUCCESS)
      {
         L_FreeBitmap(pLeadBitmap);
         return nRet;
      }
      for(n=0; n < (XSize /16); n++)
         pBuffer[n] = pBuffer[n] ^ 0xFF;
      nRet = L_CompressRow(pRunBuffer, pBuffer, 0, XSize/2);
      if(nRet < 1 )
      {
         L_FreeBitmap(pLeadBitmap);
         return nRet;
      }
      nRet =(L_INT)L_PutBitmapRowColCompressed(pLeadBitmap, pWorkBuffer, pRunBuffer, i, 
                                                XOffset, XSize/ 2);
      if(nRet < 1)
      {
         L_FreeBitmap(pLeadBitmap);
         return nRet;
      }
   }
   L_ReleaseBitmap(pLeadBitmap);
   /* Free memory that we no longer need */
   GlobalFree(hBuffer);
   GlobalFree(hRunBuffer);
   GlobalFree(hWorkBuffer);
   /* Update the paint palette to force a repaint */
   SendMessage (hWnd, WM_QUERYNEWPALETTE, 0, 0L);
   return SUCCESS;
}