mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-06-05 11:24:17 +03:00
312 lines
8.4 KiB
C++
Executable File
312 lines
8.4 KiB
C++
Executable File
// Copyright (c) 1995-1999 Matra Datavision
|
|
// Copyright (c) 1999-2012 OPEN CASCADE SAS
|
|
//
|
|
// The content of this file is subject to the Open CASCADE Technology Public
|
|
// License Version 6.5 (the "License"). You may not use the content of this file
|
|
// except in compliance with the License. Please obtain a copy of the License
|
|
// at http://www.opencascade.org and read it completely before using this file.
|
|
//
|
|
// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
|
|
// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
|
|
//
|
|
// The Original Code and all software distributed under the License is
|
|
// distributed on an "AS IS" basis, without warranty of any kind, and the
|
|
// Initial Developer hereby disclaims all such warranties, including without
|
|
// limitation, any warranties of merchantability, fitness for a particular
|
|
// purpose or non-infringement. Please see the License for the specific terms
|
|
// and conditions governing the rights and limitations under the License.
|
|
|
|
// Modified 27/12/98 : FMN ; PERF: OPTIMISATION LOADER (LOPTIM)
|
|
|
|
#include <ImageUtility_X11Dump.ixx>
|
|
|
|
#include <Standard.hxx>
|
|
#include <Image_PseudoColorImage.hxx>
|
|
#include <Image_ColorImage.hxx>
|
|
#include <Aspect_ColorMap.hxx>
|
|
#include <X11/Xutil.h>
|
|
#include <Aspect_ColorMapEntry.hxx>
|
|
#include <Image_PixelRowOfDIndexedImage.hxx>
|
|
#include <Image_PixelRowOfDColorImage.hxx>
|
|
|
|
|
|
|
|
|
|
ImageUtility_X11Dump::ImageUtility_X11Dump(
|
|
const TCollection_AsciiString& DisplayName ,
|
|
const Handle(Image_Image)& aImage )
|
|
|
|
{ myImage = aImage ;
|
|
|
|
myDisplay = XOpenDisplay( DisplayName.ToCString() ) ;
|
|
|
|
XVisualInfo VInfo, *PVinfo ;
|
|
int Nitems ;
|
|
XSetWindowAttributes WinAttr ;
|
|
|
|
Visual *theVisual = DefaultVisual( myDisplay, DefaultScreen( myDisplay ) );
|
|
|
|
VInfo.visualid = theVisual->visualid ;
|
|
|
|
PVinfo = XGetVisualInfo( myDisplay, VisualIDMask, &VInfo, &Nitems ) ;
|
|
|
|
if ( aImage->Type() == Image_TOI_PseudoColorImage ) {
|
|
if ( PVinfo->depth != 8 || PVinfo->c_class != PseudoColor ) {
|
|
VInfo.depth = 8 ;
|
|
VInfo.c_class = PseudoColor ;
|
|
PVinfo = XGetVisualInfo( myDisplay,
|
|
VisualDepthMask|VisualClassMask,
|
|
&VInfo, &Nitems ) ;
|
|
}
|
|
}
|
|
else {
|
|
if ( PVinfo->depth != 24 || PVinfo->c_class != TrueColor ) {
|
|
VInfo.depth = 24 ;
|
|
VInfo.c_class = TrueColor ;
|
|
PVinfo = XGetVisualInfo( myDisplay,
|
|
VisualDepthMask|VisualClassMask,
|
|
&VInfo, &Nitems ) ;
|
|
}
|
|
}
|
|
|
|
WinAttr.background_pixel = 0 ;
|
|
WinAttr.border_pixel = 0 ;
|
|
|
|
WinAttr.colormap = XCreateColormap( myDisplay,
|
|
RootWindow( myDisplay,
|
|
DefaultScreen( myDisplay ) ),
|
|
PVinfo->visual,
|
|
(PVinfo->c_class==TrueColor)?
|
|
AllocNone:AllocAll ) ;
|
|
|
|
|
|
myWindow = XCreateWindow( myDisplay,
|
|
RootWindow( myDisplay, DefaultScreen( myDisplay ) ),
|
|
0, 0,
|
|
( unsigned int ) aImage->Width(),
|
|
( unsigned int ) aImage->Height(),
|
|
0,
|
|
PVinfo->depth,
|
|
InputOutput,
|
|
PVinfo->visual,
|
|
CWBackPixel | CWBorderPixel | CWColormap, &WinAttr ) ;
|
|
|
|
myXImage = XCreateImage( myDisplay,
|
|
PVinfo->visual,
|
|
PVinfo->depth,
|
|
ZPixmap,
|
|
0,
|
|
NULL,
|
|
( unsigned int ) aImage->Width(),
|
|
( unsigned int ) aImage->Height(),
|
|
BitmapPad( myDisplay ),
|
|
0 ) ;
|
|
|
|
myGC = XCreateGC( myDisplay, myWindow, 0, NULL ) ;
|
|
|
|
XSetPlaneMask( myDisplay, myGC, AllPlanes ) ;
|
|
XSetFunction( myDisplay, myGC, GXcopy ) ;
|
|
|
|
UpdateX11Colormap() ;
|
|
UpdateX11XImage() ;
|
|
|
|
XMapWindow( myDisplay, myWindow ) ;
|
|
|
|
XFlush( myDisplay ) ;
|
|
|
|
}
|
|
|
|
ImageUtility_X11Dump::ImageUtility_X11Dump(
|
|
const ImageUtility_X11Dump& anOtherX11Dump ,
|
|
const Handle(Image_Image)& aImage )
|
|
|
|
{ myImage = aImage ;
|
|
|
|
myDisplay = anOtherX11Dump.X11Display() ;
|
|
|
|
myWindow = anOtherX11Dump.X11Window() ;
|
|
|
|
XWindowAttributes WinAttr ;
|
|
|
|
XGetWindowAttributes( myDisplay, myWindow, &WinAttr ) ;
|
|
|
|
myXImage = XCreateImage( myDisplay,
|
|
WinAttr.visual,
|
|
WinAttr.depth,
|
|
ZPixmap,
|
|
0,
|
|
NULL,
|
|
( unsigned int ) aImage->Width(),
|
|
( unsigned int ) aImage->Height(),
|
|
BitmapPad( myDisplay ),
|
|
0 ) ;
|
|
|
|
myGC = anOtherX11Dump.X11GC() ;
|
|
|
|
UpdateX11XImage() ;
|
|
|
|
XFlush( myDisplay ) ;
|
|
}
|
|
|
|
ImageUtility_X11GC ImageUtility_X11Dump::X11GC() const
|
|
{ return myGC ; }
|
|
|
|
ImageUtility_X11Window ImageUtility_X11Dump::X11Window() const
|
|
{ return myWindow ; }
|
|
|
|
ImageUtility_X11Display ImageUtility_X11Dump::X11Display() const
|
|
{ return myDisplay ; }
|
|
|
|
ImageUtility_X11XImage ImageUtility_X11Dump::X11XImage() const
|
|
{ return myXImage ; }
|
|
|
|
void ImageUtility_X11Dump::UpdateX11Colormap() const
|
|
|
|
{
|
|
if ( myImage->Type() != Image_TOI_PseudoColorImage ) return ;
|
|
|
|
Handle(Image_PseudoColorImage) aPImage =
|
|
Handle(Image_PseudoColorImage)::DownCast( myImage ) ;
|
|
Handle(Aspect_ColorMap) TheColorMap = aPImage->ColorMap() ;
|
|
Aspect_ColorMapEntry aEntry ;
|
|
XColor aColor ;
|
|
Standard_Integer i ;
|
|
XWindowAttributes WinAttr ;
|
|
|
|
XGetWindowAttributes( myDisplay, myWindow, &WinAttr ) ;
|
|
|
|
for ( i = 0 ; i < TheColorMap->Size() ; i++ ) {
|
|
aEntry = TheColorMap->Entry( i+1 ) ;
|
|
|
|
aColor.pixel = aEntry.Index() % WinAttr.visual->map_entries ;
|
|
aColor.red = (unsigned short)(aEntry.Color().Red() * 0xffff + 0.5 );
|
|
aColor.green = (unsigned short)(aEntry.Color().Green() * 0xffff + 0.5 );
|
|
aColor.blue = (unsigned short)(aEntry.Color().Blue() * 0xffff + 0.5 );
|
|
aColor.flags = DoRed | DoGreen | DoBlue ;
|
|
|
|
XStoreColor( myDisplay, WinAttr.colormap, &aColor ) ;
|
|
}
|
|
}
|
|
|
|
static unsigned int get_range( unsigned long col_mask )
|
|
|
|
{
|
|
while ( !(col_mask & 1) ) col_mask >>= 1 ;
|
|
|
|
return( col_mask ) ;
|
|
}
|
|
|
|
static unsigned int get_shift( unsigned long col_mask , unsigned long rgb_bit )
|
|
|
|
{ long shift ;
|
|
|
|
if ( ( col_mask >> rgb_bit ) == 0 ) {
|
|
shift = 0 ;
|
|
}
|
|
else if ( ( col_mask >> ( 2 * rgb_bit ) ) == 0 ) {
|
|
shift = rgb_bit ;
|
|
}
|
|
else {
|
|
shift = 2 * rgb_bit ;
|
|
}
|
|
|
|
return( shift ) ;
|
|
}
|
|
|
|
|
|
void ImageUtility_X11Dump::UpdateX11XImage()
|
|
|
|
{ Standard_Integer x,y, width, height, X, Y, bits_per_line;
|
|
|
|
width = myImage->Width() ;
|
|
height = myImage->Height() ;
|
|
|
|
X = myImage->LowerX() ;
|
|
Y = myImage->LowerY() ;
|
|
|
|
if ( myXImage->data == NULL ||
|
|
myXImage->width != width ||
|
|
myXImage->height != height ) {
|
|
if ( myXImage->data != NULL ) {
|
|
Standard_Address ToBeFree = ( Standard_Address ) myXImage->data ;
|
|
Standard::Free( ToBeFree);
|
|
myXImage->data = NULL ;
|
|
}
|
|
|
|
myXImage->width = width ;
|
|
myXImage->height = height ;
|
|
bits_per_line = width * myXImage->bits_per_pixel ;
|
|
if ( bits_per_line % myXImage->bitmap_pad ) {
|
|
bits_per_line += myXImage->bitmap_pad ;
|
|
}
|
|
|
|
myXImage->bytes_per_line = bits_per_line / 8 ;
|
|
|
|
myXImage->data = ( char * )
|
|
Standard::Allocate(myXImage->bytes_per_line*myXImage->height);
|
|
}
|
|
|
|
if ( myImage->Type() == Image_TOI_PseudoColorImage ) {
|
|
char *pl, *p ;
|
|
Handle(Image_PseudoColorImage) aPImage =
|
|
Handle(Image_PseudoColorImage)::DownCast( myImage ) ;
|
|
Image_PixelRowOfDIndexedImage aRow( 0, myImage->Width()-1 ) ;
|
|
|
|
for ( y = 0 , pl = myXImage->data ;
|
|
y < height ;
|
|
y++, pl += myXImage->bytes_per_line ) {
|
|
aPImage->Row( X, Y+y, aRow ) ;
|
|
for ( x = 0 , p = pl ; x < width ; x++, p++ ) {
|
|
*p = ( char ) ( aRow(x).Value() & 0xff ) ;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
unsigned int *pl, *p ;
|
|
Handle(Image_ColorImage) aCImage =
|
|
Handle(Image_ColorImage)::DownCast( myImage ) ;
|
|
Image_PixelRowOfDColorImage aRow( 0, myImage->Width()-1 ) ;
|
|
|
|
XWindowAttributes WinAttr ;
|
|
Standard_Real r,g,b ;
|
|
unsigned int lr,lg,lb, rgb_range, r_shift, g_shift, b_shift ;
|
|
|
|
XGetWindowAttributes( myDisplay, myWindow, &WinAttr ) ;
|
|
|
|
rgb_range = get_range( WinAttr.visual->red_mask ) ;
|
|
r_shift = get_shift( WinAttr.visual->red_mask,
|
|
WinAttr.visual->bits_per_rgb ) ;
|
|
g_shift = get_shift( WinAttr.visual->green_mask,
|
|
WinAttr.visual->bits_per_rgb ) ;
|
|
b_shift = get_shift( WinAttr.visual->blue_mask,
|
|
WinAttr.visual->bits_per_rgb ) ;
|
|
|
|
for ( y = 0 , pl = ( unsigned int *) myXImage->data ;
|
|
y < height ;
|
|
y++, pl += ( myXImage->bytes_per_line/sizeof( unsigned int ) ) ) {
|
|
aCImage->Row( X, Y+y, aRow ) ;
|
|
for ( x = 0 , p = pl ; x < width ; x++, p++ ) {
|
|
aRow(x).Value().Values( r,g,b , Quantity_TOC_RGB ) ;
|
|
lr = ( unsigned int ) ( r * ( rgb_range ) +0.5) ;
|
|
lg = ( unsigned int ) ( g * ( rgb_range ) +0.5) ;
|
|
lb = ( unsigned int ) ( b * ( rgb_range ) +0.5) ;
|
|
*p = (lr<<r_shift) | (lg<<g_shift) | (lb<<b_shift) ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void ImageUtility_X11Dump::DisplayX11XImage() const
|
|
|
|
{ XPutImage( myDisplay,
|
|
myWindow,
|
|
myGC,
|
|
myXImage,
|
|
0,0,
|
|
0,0,
|
|
myXImage->width,myXImage->height ) ;
|
|
|
|
}
|
|
|