Results 1 to 11 of 11

Thread: [RESOLVED] Terminology Confusion - BitMap, Picture, Image

  1. #1

    Thread Starter
    Fanatic Member
    Join Date
    Feb 2017
    Posts
    857

    Resolved [RESOLVED] Terminology Confusion - BitMap, Picture, Image

    These three terms seem to be used interchangeably.
    However, is there a difference?

    My usage:
    Image: A reference (i.e. name) for a graphic, which can reside either in memory or on disk.
    BitMap - The actual header and pixel values that reside in memory that defines the graphic (image).
    Picture: The graphic (image) that appears in a form or picturebox


    Is this correct or are there actual definition for the above?

  2. #2
    PowerPoster
    Join Date
    Feb 2006
    Posts
    24,482

    Re: Terminology Confusion - BitMap, Picture, Image

    "Image" is a loose and floppy term. This is used to name the Image Control as well as the Image property of a PictureBox Control.

    "Picture" is also loose. This is used as a short name for the StdPicture object class as well as the Picture property of an Image Control, PictureBox Control, and many other Controls.

    "Bitmap" can be just as loose and floppy. In general it refers to raster graphic images. However when you are talking about GDI operations there is a "GDI object" called a BITMAP. There are also ICONs and several kinds of Metafile graphic formats.

    There are also GDI+ Bitmap and Image classes.

    So there is no single definition, it all depends on the context.

  3. #3
    VB-aholic & Lovin' It LaVolpe's Avatar
    Join Date
    Oct 2007
    Location
    Beside Waldo
    Posts
    19,541

    Re: Terminology Confusion - BitMap, Picture, Image

    And to piggyback a bit. The picture property of a VB control has a Type property. That property can be Bitmap which includes Bitmap, JPG & GIF loaded into a picture object.
    Insomnia is just a byproduct of, "It can't be done"

    Classics Enthusiast? Here's my 1969 Mustang Mach I Fastback. Her sister '67 Coupe has been adopted

    Newbie? Novice? Bored? Spend a few minutes browsing the FAQ section of the forum.
    Read the HitchHiker's Guide to Getting Help on the Forums.
    Here is the list of TAGs you can use to format your posts
    Here are VB6 Help Files online


    {Alpha Image Control} {Memory Leak FAQ} {Unicode Open/Save Dialog} {Resource Image Viewer/Extractor}
    {VB and DPI Tutorial} {Manifest Creator} {UserControl Button Template} {stdPicture Render Usage}

  4. #4

    Thread Starter
    Fanatic Member
    Join Date
    Feb 2017
    Posts
    857

    Re: Terminology Confusion - BitMap, Picture, Image

    La Volpe:
    Thanks for your input.
    Was hoping to pin this down a bit -- obviously NOT.

  5. #5
    VB-aholic & Lovin' It LaVolpe's Avatar
    Join Date
    Oct 2007
    Location
    Beside Waldo
    Posts
    19,541

    Re: [RESOLVED] Terminology Confusion - BitMap, Picture, Image

    Think most will agree, graphically speaking:

    Picture = Image
    Bitmap is a picture/image, but not all pictures/images are bitmaps

    When talking about properties, then there are some notable differences
    Insomnia is just a byproduct of, "It can't be done"

    Classics Enthusiast? Here's my 1969 Mustang Mach I Fastback. Her sister '67 Coupe has been adopted

    Newbie? Novice? Bored? Spend a few minutes browsing the FAQ section of the forum.
    Read the HitchHiker's Guide to Getting Help on the Forums.
    Here is the list of TAGs you can use to format your posts
    Here are VB6 Help Files online


    {Alpha Image Control} {Memory Leak FAQ} {Unicode Open/Save Dialog} {Resource Image Viewer/Extractor}
    {VB and DPI Tutorial} {Manifest Creator} {UserControl Button Template} {stdPicture Render Usage}

  6. #6
    Frenzied Member
    Join Date
    Dec 2012
    Posts
    1,468

    Re: [RESOLVED] Terminology Confusion - BitMap, Picture, Image

    I agree with both dilettante & LaVolpe. It has always been my understanding that a BitMap is exactly that; a bit by bit memory map of the graphic display that can be transferred directly from regular memory to graphic memory. Other images may be in a different format, but have to be converted to BitMap before they can be displayed. Consequently, a BitMap file is always larger than any other file format, as there is no compression.

    J.A. Coutts

  7. #7
    VB-aholic & Lovin' It LaVolpe's Avatar
    Join Date
    Oct 2007
    Location
    Beside Waldo
    Posts
    19,541

    Re: [RESOLVED] Terminology Confusion - BitMap, Picture, Image

    Consequently, a BitMap file is always larger than any other file format, as there is no compression.
    Technically, the file can be compressed, a bit, in some cases: run length compression. But that's the file. When created in memory, it's uncompressed
    Insomnia is just a byproduct of, "It can't be done"

    Classics Enthusiast? Here's my 1969 Mustang Mach I Fastback. Her sister '67 Coupe has been adopted

    Newbie? Novice? Bored? Spend a few minutes browsing the FAQ section of the forum.
    Read the HitchHiker's Guide to Getting Help on the Forums.
    Here is the list of TAGs you can use to format your posts
    Here are VB6 Help Files online


    {Alpha Image Control} {Memory Leak FAQ} {Unicode Open/Save Dialog} {Resource Image Viewer/Extractor}
    {VB and DPI Tutorial} {Manifest Creator} {UserControl Button Template} {stdPicture Render Usage}

  8. #8
    Fanatic Member
    Join Date
    Aug 2013
    Posts
    806

    Re: [RESOLVED] Terminology Confusion - BitMap, Picture, Image

    Just to make it even more convoluted, there are also important non-image uses of bitmap, e.g. various low-level APIs like RtlInitializeBitMap. That is one of many APIs built around RTL_BITMAP structs, and they are a totally separate beast from the "picture" version of bitmaps.
    Check out PhotoDemon, a pro-grade photo editor written completely in VB6. (Full source available at GitHub.)

  9. #9
    PowerPoster
    Join Date
    Jun 2013
    Posts
    7,207

    Re: [RESOLVED] Terminology Confusion - BitMap, Picture, Image

    Quote Originally Posted by vb6forever View Post
    These three terms seem to be used interchangeably.
    However, is there a difference?

    My usage:
    Image: A reference (i.e. name) for a graphic, which can reside either in memory or on disk.
    BitMap - The actual header and pixel values that reside in memory that defines the graphic (image).
    Picture: The graphic (image) that appears in a form or picturebox

    Is this correct or are there actual definition for the above?
    Your triple above is actually quite nice, when we want to express "what's going on" more generally...

    1) Image: (as in "Image-Format") = Meta-Information + ImageData, describing the Source of either Bitmap-based, or Vector-based Image-Content
    2) Bitmap: a plain memory-allocation (containing Pixel-Data in a certain format), usually retrieved as the result of interpreting (decoding) the above Data, using its Meta-Information
    3) (Std)Picture: just another (different) "Container of Meta-Information" (along with the decoded ImageData), the Meta-Info now being more specific towards a Rendering-Destination

    So in 1) we have Information which relates to "Transport and Storage" (the Image-related Data usually compressed).
    Whilst 2) is a terminology, which usually describes only an intermediate result (retrieved by a decoding-step which was using Meta-Info in 1))
    And this intermediate result (the decoded Raw-Data) is of not much use (for a Rendering-Engine), when it does not come with additional Meta-Info.

    Therefore you will find different "InMemory-Container-Formats" (e.g. in Object-Containers like e.g. StdPicture or Cairo-Surfaces or DirectX-Surfaces or OpenGL-Textures etc.).
    In case of GDI and C/C++ you have these Rendering-related-MetaContainers described in Structs(UDTs) in the appropriate *.h files (with a hBmp or hDIB being the Root-Pointer).

    And that is in my book, what makes up 3) ... (in case of VB6, the wellknown OleObject-Properties like Form.Picture or Form.Image of type StdPicture)

    So, the whole thing is best understood, when you tink about it as "a process":
    - you choose an Image-Format which is best for your use-case (1) - along with appropriate "Decoding-Libs" that can produce an intermediate 2))
    - you then choose a Rendering-Engine which is best for your use-case (3) (most rendering-engines have methods, to go directly from 1 to 3, 2 being "hidden" inside 3)

    A given Rendering-Engine usually supports certain decoders already (as e.g. VBs Ole-Engine does with the LoadPicture-Function).
    LoadPicture directly produces a Container-Object, which can be passed to a Rendering-Method (e.g. PaintPicture) - but being an
    Object (of type StdPicture), it offers also its own Rendering-Method (StdPicture.Render).

    So the meaning of the terms "Bitmap" or "Image" or "Picture" entirely depends (as others have stated already) on the context
    (which part or "phase" of the "process" you are currently talking about, and what rendering-engines one is using).

    The process (as said) involves:
    - parsing/decoding/decompressing from Source-Meta-Containers (Files or ByteArrays)
    - buffering/storing/caching of intermediate results in Destination-Meta-Containers for later rendering
    - the rendering of the (usually raw-) Pixel- or Vector-data inside these containers on screen with a certain engine which understands the Dest-Container-Format

    HTH

    Olaf

  10. #10
    PowerPoster Elroy's Avatar
    Join Date
    Jun 2014
    Location
    Near Nashville TN
    Posts
    9,817

    Re: [RESOLVED] Terminology Confusion - BitMap, Picture, Image

    This is not something I deal with everyday, but I have had sections of it clear in my mind at various times in the past for the sake of getting various projects done. However, I do find the OP to be an interesting question. One way to answer it is to answer it in the context of a VB6 PictureBox (or VB6 Form).

    Many moons ago, I developed a document that, rather closely, did exactly this. Therefore, I'll take a bit of time and post that document here. Here it is (formatted in BBCode as best as I can):

    Some notes on how the PictureBox controls and VB6 Forms work:

    Preface Notes:
    • pic1 is used to refer to a VB PictureBox.
    • For our purposes, DDBs are always screen DDBs. We don’t get into other devices.

    AutoRedraw: This determines whether the graphics in the PictureBox are “Persistent Graphics” or “Temporary Graphics.” If AutoRedraw=False (Temporary Graphics), then all desired drawing (Circle, Cls, Line, Point, Print, and PSet) will not automatically refresh when they are covered by another window (or when the window is minimized). The PictureBox’s “Paint” event will fire anytime a redraw is needed, so you could place all drawing in this event to “emulate” a persistent graphic. For instance, the following will draw a visible circle in a PictureBox.

    Code:
    
    pic1.AutoRedraw = False
    pic1.ScaleMode = vbPixels
    pic1.Circle (40, 40), 30
    A minimize, hide, or covering by another form (same application or not) will effectively erase the circle. The paint event will fire when needed, but there is no record of the drawing maintained by the PictureBox. If AutoRedraw=False, there is only one DC associated with the PictureBox or Form, and it is the Display DC which does not store drawing.

    However, if AutoRedraw=True, things are very different. In this case, the PictureBox or Form with have a second DC. It is a Memory DC. In this case, the exposed “Paint” event never fires (however the internal one does). When needed, portions of the bitmap from the Memory DC are copied back into the Display DC during the internal “Paint” event.

    If AutoRedraw=False:
    • GetDC(pic1) = pic1.hDC = the Display DC of the PictureBox or Form.
    • GetCurrentObject(GetDC(pic1.hWnd), OBJ_BITMAP) = GetCurrentObject(pic1.hDC, OBJ_BITMAP) = the bitmap of the Display DC of the PictureBox or Form.
    • In this case, pic1.Image is useless. The pic1.Image.Handle has a value but it is not equal to anything. It actually will return a bitmap of pic1.Picture, but it’s not the same handle value as pic1.Picture.Handle. Any drawing will not be included on either the pic1.Picture or pic1.Image.
    • In this case, all drawing takes place on the Display DC of the PictureBox or Form.

    If AutoRedraw=True:
    • GetDC(pic1) ≠ pic1.hDC
    • GetDC(pic1) = the Display DC of the PictureBox or Form.
    • pic1.hDC = the Memory DC associated with the PictureBox or Form.
    • GetCurrentObject(pic1.hdc, OBJ_BITMAP) = pic1.Image.Handle = the bitmap of the Memory DC associated with the PictureBox or Form. Handle is the default property of Image. It has other properties, but it is always a bitmap. The width and height properties work just fine (returning HiMetric units).
    • GetCurrentObject(GetDC(pic1.hWnd), OBJ_BITMAP) = the bitmap of the Display DC of the PictureBox or Form.
    • Any picture that is loaded in using pic1.Picture will also be immediately copied into pic1.Image.
    • In this case, all drawing takes place on the Memory DC and is stored in the Memory DC’s bitmap, which can be accessed via the pic1.Image. Anytime drawing takes place, it is immediately copied onto the Display DC. Also, the internal “Paint” event re-copies the pic1.Image to the Display DC when needed.
    • One disadvantage of AutoRedraw=True is that any drawing (lines, etc.) will be cropped at the edges of the pic1.Image (Memory DC’s bitmap). However, this is not necessarily the size of the Display DC’s bitmap (pic1.ScaleWidth & pic1.ScaleHeight) (see following).
    • The actual size of pic1.Image (Memory DC’s bitmap) and the relationship between pic1.Image and pic1.Picture are somewhat complex:
      • Initially, pic1.Image is the size of pic1.ScaleWidth and pic1.ScaleHeight (assuming ScaleMode = vbPixels). If pic1.Picture is larger than pic1.ScaleSizes then the the picture is cropped into pic1.Image.
      • If pic1 is made larger at runtime (pic1.ScaleSizes), the pic1.Image is also made larger. If pic1.Picture was originally larger than pic1.ScaleSizes, then the expanded areas of pic1.Image are painted from pic1.Picture. Note that the previously shown areas (before resizing) are not repainted. This allows any prior drawing (lines, etc.) to persist on pic1.Image.
      • If the pic1 is made smaller at runtime (pic1.ScaleSizes), the pic1.Image is not made smaller. However, anytime pic1.Picture is reloaded with a picture (or if pic1.Picture = LoadPicture()), pic1.Image is scaled back to the size of pic1.ScaleWidth and pic1.ScaleHeight. This can cause some interesting effects. For instance, if all scalemodes are set to vbPixels, pic1 has no borders, there is a large (100 x 100) picture in pic1.Picture, and the initial pic1.Width = 20 and pic1.Height = 20, and we do the following at runtime:

      Code:
      
      pic1.Width = 40: pic1.Height = 40
      pic1.Width = 20: pic1.Height = 20
      pic1.Line (0, 0)-(60, 60)
      pic1.Width = 60: pic1.Height = 60
      what we will see is a diagonal line extending (0, 0)-(40, 40). This is because the pic1.Image was 40 x 40 when the drawing was done, even though the pic1.ScaleSizes were smaller than this. The actual pic1.Picture will fill the pic1.Image all the way out to 60 x 60. If we wish to crop pic1.Image back to 20 x 20, we could do something like the following:
      Code:
      
      pic1.Width = 20: pic1.Height = 20
      pic1.Picture = pic1.Image
      however, the original pic1.Picture would be lost in this process. Also, the pic1.Picture would be 60 x 60 (the size of the pic1.Image before executing pic1.Picture = pic1.Image) and it would be a DDB bitmap. If we did:
      Code:
      
      pic1.Width = 20: pic1.Height = 20
      pic1.Picture = pic1.Image
      pic1.Picture = pic1.Image
      then both the pic1.Picture and the pic1.Image would be 20 x 20. The pic1.Picture = pic1.Image would put the 60 x 60 image in the pic1.Picture and it would also recreate the pic1.Image to the size of the pic1. The second pic1.Picture = pic1.Image would put the rescaled pic1.Image into the pic1.Picture, which would be 20 x 20. It would take more than one PictureBox to preserve the original picture. Also, to say again, this must be a borderless PictureBox for this to work correctly.
      • If you wish to save drawing, it can be done with API, but it is easier done by executing the following code:

      Code:
      
      SavePicture(pic1.Image, filename)
      You could also execute:
      Code:
      
      pic1.Picture = pic1.Image
      SavePicture(pic1.Picture, filename)
      • As a final note about AutoRedraw=True, the VB help says that pic1.Image can not be used in the PaintPicture method, but it can.
    • The bitmap in the pic1.Image.Handle is a DDB based on the screen (video card).

    In both of the above cases, the pic1.Picture object will be the original picture that was loaded into the pic1, unless pic1.Picture = pic1.Image is executed. It is important to note that pic1.Picture.Handle ≠ GetCurrentObject(pic1.hDC, OBJ_BITMAP). This has two reasons, first the PictureBox can preserve its ability to write bitmaps, icons, metafiles, or enhanced metafiles. The second is that it allows a way to clear any drawing (lines, text, etc.), and restore the pic1 back to its original state. The pic1.Picture is a StdPicture object and has nothing to do with DCs.

    If a graphic was loaded from a file to the Picture property of an object, either at design time or at run time, and it’s a bitmap, icon, metafile, or enhanced metafile, it's saved using the same format as the original file. If it is a GIF or JPEG file, it is saved as a bitmap file. Graphics in an Image property are always saved as bitmap (.bmp) files regardless of their original format.

    If AutoRedraw=True and then it is set to false, an implicit pic1.Picture = pic1.Image is executed.

    The following are the graphic methods of a PictureBox or Form:

    • Cls : Clears all previous graphics.
    • Circle
    • Line
    • PaintPicture : This one is quite powerful and can be used for copying, cropping, primitive stretching. However, it is still a graphic method, and does not alter the pic1.Picture property. Combined with some of the above AutoRedraw discussions, the results can be somewhat complex.
    • Point, PSet
    • Print
    • Font : This is used in conjunction with the Print method.
    • TextHeight, TextWidth : Strictly speaking, these are also part of the graphic methods.

    Using a PictureBox with a DC: If AutoRedraw = True, the pic1.hDC can be used as any other DC. However, the StdPicture object in the pic1.Picture can also be used with a DC. The pic1.Picture.Handle (if it is a bitmap) can be selected into a DC selected by the user, and further manipulated if so desired. You can not select a bitmap into more than one DC at a time, but the pic1.Picture.Handle is not currently selected into a DC.

    Different Forms a Bitmap Type Image Can Take In Memory:

    Bitmap that are DIBs:
    • These are device independent bitmaps (DIBs). A bitmap handle can refer to either a DIB or a DDB. Both DIBs and DDBs can be selected into memory DCs. DIBs can only be selected into memory DCs.
    • This is a rather standard form that is an object of the Windows OS.
    • When written to a .bmp file, all bitmaps are DIBs. There is no such thing as a DDB file.
    • The primary difference between a DIB in memory and a DIB (.bmp) file is that the memory DIB will not include the 14 byte header. The following is the file header:
    Offset# Size Purpose
    0000h 2 bytes magic number to identify the BMP file: &h42 &h4D (BM). OS/2 uses others.
    0002h 4 bytes the size of BMP file in bytes.
    0006h 2 bytes reserved; actual value depends on the application that creates the image.
    0008h 2 bytes reserved; actual value depends on the application that creates the image.
    000Ah 4 bytes offset, starting address of the byte where the bitmap data can be found.
    • Color depth can be 1, 4, 8, 16, 24, or 32 bits per pixel.
    • The color palette is not used when the bitmap is 16-bit or higher.
    • The palette occurs in the BMP file directly after the BMP header and the DIB header. Therefore, its offset is the size of the BMP header plus the size of the DIB header.
    • A memory DIB includes the following sections:
      • Bitmap information header (BitmapInfoHeader). This might also be a BitmapV4Header or BitmapV5Header. These are expanded versions of the BitmapInfoHeader.
      • A color palette. A DIB always uses the RGB color model. If the pixels have all color information (color depth 16-bit or higher) then there is not color palette.
      • The bitmap data. Pixels are stored "upside-down" with respect to normal image raster scan order, starting in the lower left corner, going from left to right, and then row by row from the bottom to the top of the image. Uncompressed Windows bitmaps can also be stored from the top row to the bottom, if the image height value is negative. In all cases, each row of pixels is extended to a 4-byte boundary, filling with an unspecified value (not necessarily 0) so that the next row will start on a multiple-of-four byte location in memory or in the file.

      • Not all devices support DIBs, so we must be careful which DCs a DIB is selected into. We can call GetDeviceCaps, specifying RC_DI_BITMAP as the RASTERCAPS flag to find out.
      • DIBs can always be selected into display DCs or memory DCs that are compatible with the display.

    Bitmaps that are DDBs:
    • Bitmaps can be device dependent bitmaps (DDBs). A bitmap handle can refer to either a DIB or a DDB.
    • A DDB is identical to a DIB except that it is described only by the BitmapInfo (called BITMAP by Microsoft) structure. This is sort of a cut-down version of the BitmapInfoHeader that was discussed in the DIB section above. A DDB never has a palette, even if it needs one. It uses the device’s palette.
    • Both DIBs and DDBs can be selected into memory DCs. DDBs can be selected into memory DCs or a DC for which they are compatible (such as a display DC).
    • A DDB is often called a compatible bitmap and it usually has better GDI performance than a DIB. For example, to create a bitmap for video memory, it is best to use a compatible bitmap with the same color format as the primary display. Once in video memory, rendering to the bitmap and displaying it to the screen are significantly faster than from system memory or directly from a DIB.
    • To transfer a bitmap between devices with different color organization, use GetDIBits to convert the compatible bitmap to a DIB and call SetDIBits or StretchDIBits to display the DIB to the second device. A DDB must not be selected into a device context when converted to a DIB.
    • DDBs should only be selected into DCs with which they are compatible. This could be a specific device DC or a memory DC compatible with the device.

    Notes on Creating and Deleting DIBs and DDBs:
    • CreateBitmap creates a DDB.
    • CreateBitmapIndirect creates a DDB.
    • CreateDIBitmap creates a DIB.
    • CreateCompatibleBitmap will create either a DIB or DDB depending on what is selected into the DC being used.
    • LoadBitmap (old) creates a DDB for the display.
    • LoadImage (using IMAGE_BITMAP) can create either a DDB or a DIB depending on whether LR_CREATEDIBSECTION is specified.
    • It is very important to delete all bitmaps that are created. Alternatively, if they were created as part of a DC, they should be placed back into the DC before the DC is deleted.

    StdPicture:
    • These can be bitmaps, icons, cursors, WMFs, or EMFs. However, only bitmaps will be discussed herein.
    • These are wrappers for bitmaps.
    • The bitmap can be a DDB or a DIB. Typically it is a DIB, but not always.
    • This is what the pic1.Picture object is. The actual pic1.Picture.Handle property is a handle to the bitmap itself (or icon, etc.). Using a StdPicture is the only way a new image can be placed into a PictureBox.
    • The StdPicture of a PictureBox does not have an associated DC.
    • The bitmap of these StdPicture objects are typically not selected into DCs, but they could be temporarily to edit/modify the bitmap contained within them.
    • The pic1.hDC and pic1.Image have nothing to do with a StdPicture.
    • Another nice thing about the StdPicture is that VB will clean them up (deleting the bitmap) when the StdPicture variable goes out of scope. Be sure to use “Dim pic as StdPicture” code to declare these StdPicture objects. (You can create StdPicture objects that do not “own” their bitmaps [where the bitmap does not get deleted with the StdPicture object], but these may not be compatible with VB.)

    Bitmap in Byte Array:
    • This would be similar to a DIB (including all header information) but it would be contained in a byte array maintained by VB. Typically, the file header would also be included, which is not included in a DIB bitmap in memory.
    • One advantage is that there would be no need to delete the bitmap because Windows would not be maintaining it.
    • Another advantage is that it could be more directly written and read with VB to a .bmp file.
    • The largest disadvantage is that it probably means a lot of copying and moving before it is very useful.
    • Another disadvantage is that none of the GDI functions can be used with it.

    Bitmap Data Bytes in Byte Array:
    • The actual bytes of the bitmap data could be stored in a VB byte array. However, if this is done, all information about its width, height, color depth, palette, etc. is lost. If this is done, the user must independently keep track of these things.
    • Having things in a byte array is useful for non-orthogonal rotation of bitmaps. It is also useful for doing pixel type resizing of integer multiple amounts (with aspect ratio preserved).

    Enjoy, and feel free to critique,
    Elroy

    p.s. There's more to it but that does a pretty good job of answering the OP question in terms of a PictureBox. And admittedly, even though I wrote it, I need to re-read it in detail myself. Again, these just aren't things I deal with everyday.
    Any software I post in these forums written by me is provided "AS IS" without warranty of any kind, expressed or implied, and permission is hereby granted, free of charge and without restriction, to any person obtaining a copy. To all, peace and happiness.

  11. #11

    Thread Starter
    Fanatic Member
    Join Date
    Feb 2017
    Posts
    857

    Re: [RESOLVED] Terminology Confusion - BitMap, Picture, Image

    Thanks to everyone for ALL their additional comments / inputs.

    Elroy:
    I would be great if you could get the powers-to-be this forum to take your last comments
    and make a sticky out of it for future reference.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width