#include <gtk/gtk.h>
#include <mil.h>
#include <gdk/gdkx.h>
#include <X11/Xlib.h>
#include <cairo-xlib.h>
#include "mdispgtkview.h"
#include "MdispGtk.h"
#include "childframe.h"
#define IMAGE_FILE M_IMAGE_PATH MIL_TEXT("BaboonRGB.mim")
int XGrabServer(Display *dpy) { return 1;}
int XUngrabServer(Display *dpy) { return 1;}
MIL_INT MFTYPE MouseFct(MIL_INT , MIL_ID EventID, void* UserDataPtr)
{
MdispGtkView* pCurrentView = (MdispGtkView *)UserDataPtr;
if(pCurrentView)
{
MOUSEPOSITION MousePosition;
MdispGetHookInfo(EventID, M_MOUSE_POSITION_X, &MousePosition.m_DisplayPositionX);
MdispGetHookInfo(EventID, M_MOUSE_POSITION_Y, &MousePosition.m_DisplayPositionY);
MdispGetHookInfo(EventID, M_MOUSE_POSITION_BUFFER_X, &MousePosition.m_BufferPositionX);
MdispGetHookInfo(EventID, M_MOUSE_POSITION_BUFFER_Y, &MousePosition.m_BufferPositionY);
pCurrentView->SetMousePosition(MousePosition);
pCurrentView->UpdateStatusBarWithMousePosition();
}
return 0;
}
MIL_INT MFTYPE GraphicListModifiedHookFct(MIL_INT HookType, MIL_ID EventID, void* UserDataPtr)
{
MdispGtkView *pCurrentView = (MdispGtkView *)UserDataPtr;
if(pCurrentView)
{
MIL_INT State = M_NULL;
MgraGetHookInfo(EventID, M_INTERACTIVE_GRAPHIC_STATE, &State);
if((State != M_STATE_WAITING_FOR_CREATION) && (State != M_STATE_BEING_CREATED))
{
pCurrentView->ResetPrimitiveCreation();
}
}
return 0;
}
MdispGtkView::MdispGtkView(ChildFrame* cf)
{
m_cf = cf;
m_Modified = false;
m_window = cf->DrawingArea();
m_MilOverlayImage = M_NULL;
m_MilDisplay = M_NULL;
m_MilGraphContext = M_NULL;
m_MilGraphList = M_NULL;
static int viewNumber = 0;
m_filename = g_strdup_printf("Image%d.mim",++viewNumber);
m_isWindowed = true;
m_isExclusive = false;
m_isOverlayEnabled = false;
m_isOverlayInitialized = false;
m_isScaleDisplayEnabled = false;
m_isX11AnnotationsEnabled = false;
m_isGraphicsAnnotationsEnabled = false;
m_currentViewMode = M_TRANSPARENT;
m_currentShiftValue = M_NULL;
m_isInAsynchronousMode = false;
m_currentCompressionType = M_NULL;
m_currentAsynchronousFrameRate = M_INFINITE;
m_currentQFactor = M_DEFAULT;
m_currentRestrictCursor = M_ENABLE;
m_PrimitiveInCreation = M_NULL;
m_FrameTimeOutTag = g_timeout_add(100,MdispGtkView::timerEvent,this);
m_imageSizeX = DEFAULTSIZEX;
m_imageSizeY = DEFAULTSIZEY;
m_currentZoomFactorX = 1.0;
m_currentZoomFactorY = 1.0;
UpdateContentSize();
}
MdispGtkView::~MdispGtkView()
{
if (m_MilImage)
{
RemoveFromDisplay();
MbufFree(m_MilImage);
}
g_source_remove(m_FrameTimeOutTag);
}
MdispGtkApp* MdispGtkView::dispGtkApp()
{
void *UserData = g_object_get_data(G_OBJECT(m_window),"App");
return (MdispGtkApp *) UserData;
}
void MdispGtkView::GrabStart()
{
if(((MdispGtkApp*)dispGtkApp())->m_isGrabStarted)
((MdispGtkApp*)dispGtkApp())->m_pGrabView->GrabStop();
MdigGrabContinuous(((MdispGtkApp*)dispGtkApp())->m_MilDigitizer, m_MilImage);
((MdispGtkApp*)dispGtkApp())->m_isGrabStarted = true;
((MdispGtkApp*)dispGtkApp())->m_pGrabView = this;
m_Modified = true;
}
void MdispGtkView::GrabStop()
{
MdigHalt(((MdispGtkApp*)dispGtkApp())->m_MilDigitizer);
((MdispGtkApp*)dispGtkApp())->m_isGrabStarted = false;
}
void MdispGtkView::Overlay(bool on)
{
if (on && !m_isOverlayEnabled)
{
MdispControl(m_MilDisplay, M_OVERLAY, M_ENABLE);
if(!m_isOverlayInitialized)
InitializeOverlay();
m_isOverlayEnabled = true;
}
else if (!on && m_isOverlayEnabled)
{
MdispControl(m_MilDisplay, M_OVERLAY, M_DISABLE);
m_isOverlayInitialized = false;
m_isOverlayEnabled = false;
}
}
void MdispGtkView::Initialize()
{
MdispAlloc(((MdispGtkApp*)dispGtkApp())->m_MilSystem, M_DEFAULT, "M_DEFAULT", M_DEFAULT, &m_MilDisplay);
if(m_MilDisplay)
{
MIL_INT DisplayType = MdispInquire(m_MilDisplay, M_DISPLAY_TYPE, M_NULL);
if((DisplayType&(M_WINDOWED|M_EXCLUSIVE)) !=M_WINDOWED)
m_isWindowed = false;
if(DisplayType&(M_EXCLUSIVE))
m_isExclusive = true;
ChangeViewMode(M_DEFAULT);
if(IsNetworkedSystem())
{
MdispInquire(m_MilDisplay, M_COMPRESSION_TYPE, &m_currentCompressionType);
m_isInAsynchronousMode = (MdispInquire(m_MilDisplay, M_ASYNC_UPDATE, M_NULL) == M_ENABLE);
MdispInquire(m_MilDisplay, M_UPDATE_RATE_MAX, &m_currentAsynchronousFrameRate);
MdispInquire(m_MilDisplay, M_Q_FACTOR, &m_currentQFactor);
}
if(m_isExclusive)
{
MdispInquire(m_MilDisplay, M_RESTRICT_CURSOR, &m_currentRestrictCursor);
}
MdispSelectWindow(m_MilDisplay, m_MilImage, m_isWindowed?GDK_WINDOW_XID(m_window->window):0);
MdispControl(m_MilDisplay, M_MOUSE_USE, M_ENABLE);
MdispControl(m_MilDisplay, M_MOUSE_CURSOR_CHANGE, M_ENABLE);
MdispHookFunction(m_MilDisplay, M_MOUSE_MOVE, MouseFct, (void*)this);
}
}
void MdispGtkView::RemoveFromDisplay()
{
if ((((MdispGtkApp*)dispGtkApp())->m_pGrabView == this) &&
((MdispGtkApp*)dispGtkApp())->m_isGrabStarted)
{
MdigHalt(((MdispGtkApp*)dispGtkApp())->m_MilDigitizer);
((MdispGtkApp*)dispGtkApp())->m_isGrabStarted = false;
}
if (m_MilImage && m_MilDisplay)
{
MdispDeselect(m_MilDisplay,m_MilImage);
MdispHookFunction(m_MilDisplay, M_MOUSE_MOVE+M_UNHOOK, MouseFct, (void*)this);
if(m_MilGraphList)
{
MgraFree(m_MilGraphList);
m_MilGraphList = M_NULL;
}
if(m_MilGraphContext)
{
MgraFree(m_MilGraphContext);
m_MilGraphContext = M_NULL;
}
MdispFree(m_MilDisplay);
m_MilDisplay = M_NULL;
}
}
bool MdispGtkView::newDoc()
{
if(((MdispGtkApp*)dispGtkApp())->m_numberOfDigitizer)
{
m_bufferAttributes=M_IMAGE+M_DISP+M_GRAB+M_PROC;
m_imageSizeX = ((MdispGtkApp*)dispGtkApp())->m_digitizerSizeX;
m_imageSizeY = ((MdispGtkApp*)dispGtkApp())->m_digitizerSizeY;
m_NbBands = ((MdispGtkApp*)dispGtkApp())->m_digitizerNbBands;
MbufAllocColor(((MdispGtkApp*)dispGtkApp())->m_MilSystem,
m_NbBands,
m_imageSizeX,
m_imageSizeY,
8+M_UNSIGNED,
m_bufferAttributes,
&m_MilImage);
MbufClear(m_MilImage,M_COLOR_BLACK);
}
else
{
MbufImport(IMAGE_FILE,M_DEFAULT,M_RESTORE,((MdispGtkApp*)dispGtkApp())->m_MilSystem,&m_MilImage);
if (m_MilImage)
{
m_imageSizeX = MbufInquire(m_MilImage, M_SIZE_X, M_NULL);
m_imageSizeY = MbufInquire(m_MilImage, M_SIZE_Y, M_NULL);
m_NbBands = MbufInquire(m_MilImage, M_SIZE_BAND, M_NULL);
}
}
UpdateContentSize();
if(!m_MilImage)
return false;
Initialize();
return true;
}
bool MdispGtkView::load(const char *filename)
{
MbufImport(filename,M_DEFAULT,M_RESTORE,((MdispGtkApp*)dispGtkApp())->m_MilSystem,&m_MilImage);
if (m_MilImage)
{
Initialize();
m_imageSizeX = MbufInquire(m_MilImage,M_SIZE_X,M_NULL);
m_imageSizeY = MbufInquire(m_MilImage,M_SIZE_Y,M_NULL);
m_filename = g_strdup(g_path_get_basename(filename));
UpdateContentSize();
return true;
}
else
{
return false;
}
}
bool MdispGtkView::save(const char *filename)
{
gboolean SaveStatus;
gchar * TempPath;
long FileFormat = M_MIL;
gchar *tmp;
TempPath = g_ascii_strup(filename,-1);
if (g_str_has_suffix(TempPath,".MIM"))
FileFormat = M_MIL;
else if (g_str_has_suffix(TempPath,".TIF"))
FileFormat = M_TIFF;
else if (g_str_has_suffix(TempPath,".BMP"))
FileFormat = M_BMP;
else if (g_str_has_suffix(TempPath,".JPG"))
FileFormat = M_JPEG_LOSSY;
else if (g_str_has_suffix(TempPath,".JP2"))
FileFormat = M_JPEG2000_LOSSLESS;
else if (g_str_has_suffix(TempPath,".RAW"))
FileFormat = M_RAW;
else if (g_str_has_suffix(TempPath,".PNG"))
FileFormat = M_PNG;
if((((MdispGtkApp*)dispGtkApp())->m_pGrabView == this) &&
(((MdispGtkApp*)dispGtkApp())->m_isGrabStarted == true))
MdigHalt(((MdispGtkApp*)dispGtkApp())->m_MilDigitizer);
tmp = g_strdup(filename);
MbufExport(tmp, FileFormat,m_MilImage);
g_free(tmp);
SaveStatus = (MappGetError(M_DEFAULT, M_CURRENT,M_NULL) == M_NULL_ERROR);
if (!((((MdispGtkApp*)dispGtkApp())->m_pGrabView == this) &&
(((MdispGtkApp*)dispGtkApp())->m_isGrabStarted == true)))
m_Modified = false;
if((((MdispGtkApp*)dispGtkApp())->m_pGrabView == this) &&
(((MdispGtkApp*)dispGtkApp())->m_isGrabStarted == true))
MdigGrabContinuous(((MdispGtkApp*)dispGtkApp())->m_MilDigitizer, m_MilImage);
return SaveStatus;
}
void MdispGtkView::ChangeViewMode(long ViewMode,long ShiftValue)
{
if(m_MilDisplay)
{
MdispControl(m_MilDisplay, M_VIEW_MODE, ViewMode);
if(ViewMode == M_BIT_SHIFT)
MdispControl(m_MilDisplay, M_VIEW_BIT_SHIFT, ShiftValue);
if(MdispInquire(m_MilDisplay, M_VIEW_MODE,M_NULL)==ViewMode)
{
m_currentViewMode = ViewMode;
m_currentShiftValue = ShiftValue;
}
}
}
void MdispGtkView::ChangeCompressionType(MIL_INT CompressionType)
{
if(m_MilDisplay)
{
MdispControl(m_MilDisplay, M_COMPRESSION_TYPE, CompressionType);
if(MdispInquire(m_MilDisplay, M_COMPRESSION_TYPE, M_NULL) == CompressionType)
{
m_currentCompressionType = CompressionType;
}
}
}
void MdispGtkView::ChangeAsynchronousMode(bool Enabled, MIL_INT FrameRate)
{
if(Enabled && (FrameRate != m_currentAsynchronousFrameRate))
{
if(m_MilDisplay)
{
MdispControl(m_MilDisplay, M_UPDATE_RATE_MAX, FrameRate);
if(MdispInquire(m_MilDisplay, M_UPDATE_RATE_MAX, M_NULL) == FrameRate)
{
m_currentAsynchronousFrameRate = FrameRate;
}
}
}
if((Enabled && !m_isInAsynchronousMode) ||
(!Enabled && m_isInAsynchronousMode))
{
if(m_MilDisplay)
{
MdispControl(m_MilDisplay, M_ASYNC_UPDATE, (Enabled ? M_ENABLE : M_DISABLE));
if(MdispInquire(m_MilDisplay, M_ASYNC_UPDATE, M_NULL) == (Enabled ? M_ENABLE : M_DISABLE))
{
m_isInAsynchronousMode = Enabled;
}
}
}
}
void MdispGtkView::ChangeQFactor(MIL_INT QFactor)
{
if(m_MilDisplay)
{
MdispControl(m_MilDisplay, M_Q_FACTOR, QFactor);
if(MdispInquire(m_MilDisplay, M_Q_FACTOR, M_NULL) == QFactor)
{
m_currentQFactor = QFactor;
}
}
}
bool MdispGtkView::IsNetworkedSystem()
{
bool NetworkedSystem = false;
MIL_ID SystemId = ((MdispGtkApp*)dispGtkApp())->m_MilSystem;
if(SystemId)
NetworkedSystem = (MsysInquire(SystemId, M_LOCATION, M_NULL) == M_REMOTE);
return NetworkedSystem;
}
void MdispGtkView::ZoomIn()
{
if(m_MilDisplay)
{
MIL_DOUBLE ZoomX = 1.0, ZoomY = 1.0;
MdispInquire(m_MilDisplay, M_ZOOM_FACTOR_X, &ZoomX);
MdispInquire(m_MilDisplay, M_ZOOM_FACTOR_Y, &ZoomY);
if((ZoomX <= 8.0) && (ZoomY<=8.0))
{
ZoomX*=2.0;
ZoomY*=2.0;
}
Zoom(ZoomX, ZoomY);
}
}
void MdispGtkView::ZoomOut()
{
if(m_MilDisplay)
{
MIL_DOUBLE ZoomX = 1.0, ZoomY = 1.0;
MdispInquire(m_MilDisplay, M_ZOOM_FACTOR_X, &ZoomX);
MdispInquire(m_MilDisplay, M_ZOOM_FACTOR_Y, &ZoomY);
if((ZoomX >= 0.125) && (ZoomY>=0.125))
{
ZoomX/=2.0;
ZoomY/=2.0;
}
Zoom(ZoomX, ZoomY);
}
}
void MdispGtkView::NoZoom()
{
if(m_MilDisplay)
{
Zoom(1.0, 1.0);
MdispPan(m_MilDisplay, M_NULL, M_NULL);
}
}
void MdispGtkView::Zoom( MIL_DOUBLE ZoomFactorToApplyX, MIL_DOUBLE ZoomFactorToApplyY)
{
MdispZoom(m_MilDisplay, ZoomFactorToApplyX, ZoomFactorToApplyY);
m_currentZoomFactorX = ZoomFactorToApplyX;
m_currentZoomFactorY = ZoomFactorToApplyY;
}
void MdispGtkView::ScaleDisplay( bool on )
{
if(m_MilDisplay)
{
if(!on)
{
if(m_window->window)
{
gdk_window_clear_area_e(GDK_WINDOW(m_window->window), 0, 0, m_window->allocation.width, m_window->allocation.height);
}
}
MdispControl(m_MilDisplay, M_SCALE_DISPLAY, on ? M_ENABLE : M_DISABLE);
m_isScaleDisplayEnabled = on;
}
}
void MdispGtkView::OnGraRectangle()
{
if(m_MilDisplay)
{
if(m_isGraphicsAnnotationsEnabled)
{
MgraColor(m_MilGraphContext, M_COLOR_WHITE);
MgraInteractive(m_MilGraphContext, m_MilGraphList, M_GRAPHIC_TYPE_RECT, M_DEFAULT, M_DEFAULT);
m_PrimitiveInCreation = M_GRAPHIC_TYPE_RECT;
}
}
}
void MdispGtkView::OnGraCircle()
{
if(m_MilDisplay)
{
if(m_isGraphicsAnnotationsEnabled)
{
MgraColor(m_MilGraphContext, M_COLOR_YELLOW);
MgraInteractive(m_MilGraphContext, m_MilGraphList, M_GRAPHIC_TYPE_ARC, M_DEFAULT, M_DEFAULT);
m_PrimitiveInCreation = M_GRAPHIC_TYPE_ARC;
}
}
}
void MdispGtkView::OnGraPolygon()
{
if(m_MilDisplay)
{
if(m_isGraphicsAnnotationsEnabled)
{
MgraColor(m_MilGraphContext, M_COLOR_MAGENTA);
MgraInteractive(m_MilGraphContext, m_MilGraphList, M_GRAPHIC_TYPE_POLYGON, M_DEFAULT, M_DEFAULT);
m_PrimitiveInCreation = M_GRAPHIC_TYPE_POLYGON;
}
}
}
void MdispGtkView::OnGraChooseColor()
{
if(m_MilDisplay && m_MilGraphList)
{
GdkColor gColor;
GtkWidget* dialog = gtk_color_selection_dialog_new("Select a color");
gint result = gtk_dialog_run (GTK_DIALOG (dialog));
if(result == GTK_RESPONSE_OK)
{
GtkWidget *Selection = gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dialog));
gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(Selection), &gColor);
MIL_INT NewColor = M_RGB888(gColor.red>>8, gColor.green>>8, gColor.blue>>8);
MgraControlList(m_MilGraphList, M_ALL_SELECTED, M_DEFAULT, M_COLOR, (MIL_INT)NewColor);
MgraControlList(m_MilGraphList, M_ALL, M_DEFAULT, M_GRAPHIC_SELECTED, M_FALSE);
}
gtk_widget_destroy (dialog);
}
}
void MdispGtkView::OnGraFill()
{
if(m_MilDisplay && m_MilGraphList)
{
MgraControlList(m_MilGraphList, M_ALL_SELECTED, M_DEFAULT, M_FILLED, M_TRUE);
MgraControlList(m_MilGraphList, M_ALL, M_DEFAULT, M_GRAPHIC_SELECTED, M_FALSE);
}
}
void MdispGtkView::X11Annotations( bool on )
{
m_isX11AnnotationsEnabled = on;
if(on)
{
MdispControl(m_MilDisplay,M_WINDOW_ANNOTATIONS,M_PTR_TO_DOUBLE(GDK_WINDOW_XDISPLAY(m_window->window)));
}
else
{
MdispControl(m_MilDisplay,M_WINDOW_ANNOTATIONS,M_NULL);
}
if(on)
{
gtk_widget_queue_draw_area(m_window,0,0,1,1);
}
else if(m_window->window)
{
XEvent ev;
ev.type = Expose;
ev.xexpose.window = GDK_WINDOW_XID(m_window->window);
ev.xexpose.x = 0;
ev.xexpose.y = 0;
ev.xexpose.width = m_window->allocation.width;
ev.xexpose.height = m_window->allocation.height;
XSendEvent(GDK_WINDOW_XDISPLAY(m_window->window),GDK_WINDOW_XID(m_window->window), true, ExposureMask, &ev);
}
}
void MdispGtkView::GraphicsAnnotations( bool on )
{
if(m_MilDisplay)
{
m_isGraphicsAnnotationsEnabled = on;
if(m_isGraphicsAnnotationsEnabled)
{
if(!m_MilGraphContext && !m_MilGraphList)
{
MIL_INT BufSizeX = 0, BufSizeY = 0;
MIL_INT Offset = 15;
MgraAlloc(((MdispGtkApp*)dispGtkApp())->m_MilSystem, &m_MilGraphContext);
MgraAllocList(((MdispGtkApp*)dispGtkApp())->m_MilSystem, M_DEFAULT, &m_MilGraphList);
MdispControl(m_MilDisplay, M_ASSOCIATED_GRAPHIC_LIST_ID, m_MilGraphList);
MdispControl(m_MilDisplay, M_UPDATE_GRAPHIC_LIST, M_DISABLE);
MbufInquire(m_MilImage, M_SIZE_X, &BufSizeX);
MbufInquire(m_MilImage, M_SIZE_Y, &BufSizeY);
MgraClear(m_MilGraphContext, m_MilGraphList);
MgraColor(m_MilGraphContext, M_COLOR_LIGHT_BLUE);
MgraRect(m_MilGraphContext, m_MilGraphList, Offset, Offset, BufSizeX - Offset, BufSizeY - Offset);
MgraColor(m_MilGraphContext, M_COLOR_GREEN);
MgraControl(m_MilGraphContext, M_BACKGROUND_MODE, M_TRANSPARENT);
MgraControl(m_MilGraphContext, M_TEXT_ALIGN_HORIZONTAL, M_CENTER);
MgraControl(m_MilGraphContext, M_TEXT_ALIGN_VERTICAL, M_CENTER);
MgraControl(m_MilGraphContext, M_FONT_SIZE, 24);
MgraFont(m_MilGraphContext, MIL_FONT_NAME(M_FONT_DEFAULT_TTF));
MgraText(m_MilGraphContext, m_MilGraphList, BufSizeX/2, Offset, MIL_TEXT("Interactive Graphic Annotations"));
MdispControl(m_MilDisplay, M_UPDATE_GRAPHIC_LIST, M_ENABLE);
MdispControl(m_MilDisplay, M_GRAPHIC_LIST_INTERACTIVE, M_ENABLE);
MgraHookFunction(m_MilGraphList, M_INTERACTIVE_GRAPHIC_STATE_MODIFIED, GraphicListModifiedHookFct, (void*)this);
}
}
else
{
MgraHookFunction(m_MilGraphList, M_INTERACTIVE_GRAPHIC_STATE_MODIFIED+M_UNHOOK, GraphicListModifiedHookFct, (void*)this);
MdispControl(m_MilDisplay, M_ASSOCIATED_GRAPHIC_LIST_ID, M_NULL);
if(m_MilGraphList)
{
MgraFree(m_MilGraphList);
m_MilGraphList = M_NULL;
}
if(m_MilGraphContext)
{
MgraFree(m_MilGraphContext);
m_MilGraphContext = M_NULL;
}
}
}
}
void MdispGtkView::InitializeOverlay()
{
MIL_TEXT_CHAR chText[80];
if ((!m_isOverlayInitialized) && (m_MilDisplay))
{
if (m_MilImage && m_MilDisplay )
{
MdispControl(m_MilDisplay, M_OVERLAY, M_ENABLE);
MdispInquire(m_MilDisplay, M_OVERLAY_ID, &m_MilOverlayImage);
MdispControl(m_MilDisplay, M_OVERLAY_CLEAR, M_DEFAULT);
MdispControl(m_MilDisplay, M_OVERLAY_SHOW, M_DISABLE);
long imageWidth = MbufInquire(m_MilOverlayImage,M_SIZE_X,M_NULL);
long imageHeight = MbufInquire(m_MilOverlayImage,M_SIZE_Y,M_NULL);
MgraControl(M_DEFAULT, M_BACKGROUND_MODE, M_TRANSPARENT);
MgraColor(M_DEFAULT, M_COLOR_WHITE);
MgraText(M_DEFAULT, m_MilOverlayImage, imageWidth/9, imageHeight/5, " -------------------- ");
MgraText(M_DEFAULT, m_MilOverlayImage, imageWidth/9, imageHeight/5+25, " - MIL Overlay Text - ");
MgraText(M_DEFAULT, m_MilOverlayImage, imageWidth/9, imageHeight/5+50, " -------------------- ");
MgraColor(M_DEFAULT, M_COLOR_GREEN);
MgraText(M_DEFAULT, m_MilOverlayImage, imageWidth*11/18, imageHeight/5, " -------------------- ");
MgraText(M_DEFAULT, m_MilOverlayImage, imageWidth*11/18, imageHeight/5+25, " - MIL Overlay Text - ");
MgraText(M_DEFAULT, m_MilOverlayImage, imageWidth*11/18, imageHeight/5+50, " -------------------- ");
MappControl(M_DEFAULT, M_ERROR_HOOKS, M_DISABLE);
MbufControl(m_MilOverlayImage, M_XPIXMAP_ALLOC, M_COMPENSATION_ENABLE);
MappControl(M_DEFAULT, M_ERROR_HOOKS, M_ENABLE);
Pixmap XPixmap = (Pixmap)MbufInquire(m_MilOverlayImage, M_XPIXMAP_HANDLE, M_NULL);
GdkPixmap *gdkpixmap = NULL;
if(XPixmap != None)
gdkpixmap = gdk_pixmap_foreign_new(XPixmap);
if(gdkpixmap)
{
GdkPoint Hor[2];
GdkPoint Ver[2];
GdkColor color[3];
GdkFont *font = NULL;
font = gdk_font_load ("-misc-*-*-r-*-*-*-140-*-*-*-*-*-1");
int i;
GdkGC *gc = gdk_gc_new(gdkpixmap);
gdk_color_parse("blue",&color[0]);
gdk_color_parse("red",&color[1]);
gdk_color_parse("yellow",&color[2]);
for(i=0;i<3;i++)
gdk_color_alloc(gdk_colormap_get_system(), &color[i]);
gdk_gc_set_foreground(gc, &color[0]);
Hor[0].x = 0;
Hor[0].y = imageHeight/2;
Hor[1].x = imageWidth;
Hor[1].y = imageHeight/2;
gdk_draw_lines(gdkpixmap,gc,Hor,2);
Ver[0].x = imageWidth/2;
Ver[0].y = 0;
Ver[1].x = imageWidth/2;
Ver[1].y = imageHeight;
gdk_draw_lines(gdkpixmap,gc,Ver,2);
MosStrcpy(chText, 80, "X Overlay Text ");
gdk_gc_set_foreground(gc, &color[1]);
gdk_draw_string(gdkpixmap,
font,
gc,
imageWidth*3/18,
imageHeight*4/6,
chText);
gdk_gc_set_foreground(gc, &color[2]);
gdk_draw_string(gdkpixmap,
font,
gc,
imageWidth*12/18,
imageHeight*4/6,
chText);
gdk_display_flush(gdk_display_get_default());
g_object_unref(gc);
MbufControl(m_MilOverlayImage, M_XPIXMAP_FREE, M_DEFAULT);
MbufControl(m_MilOverlayImage, M_MODIFIED, M_DEFAULT);
}
MdispControl(m_MilDisplay, M_OVERLAY_SHOW, M_ENABLE);
m_isOverlayInitialized = true;
}
}
}
gboolean MdispGtkView::timerEvent(gpointer user_data)
{
MdispGtkView* pCurrentView = (MdispGtkView *) user_data;
if(pCurrentView && pCurrentView->m_MilDisplay)
{
MIL_DOUBLE CurrentFrameRate = M_NULL;
MdispInquire(pCurrentView->m_MilDisplay, M_UPDATE_RATE, &CurrentFrameRate);
g_signal_emit(G_OBJECT(pCurrentView->m_cf->Window()), pCurrentView->m_cf->frameRateChangedSignal(), 0, CurrentFrameRate);
MIL_DOUBLE ZoomX =1.0, ZoomY = 1.0;
MdispInquire(pCurrentView->m_MilDisplay, M_ZOOM_FACTOR_X, &ZoomX);
MdispInquire(pCurrentView->m_MilDisplay, M_ZOOM_FACTOR_Y, &ZoomY);
g_signal_emit(G_OBJECT(pCurrentView->m_cf->Window()), pCurrentView->m_cf->zoomFactorChangedSignal(), 0,
ZoomX,
ZoomY);
g_signal_emit(G_OBJECT(pCurrentView->m_cf->Window()), pCurrentView->m_cf->mousePositionChangedSignal(), 0,
pCurrentView->m_LastMousePosition.m_DisplayPositionX,
pCurrentView->m_LastMousePosition.m_DisplayPositionY,
pCurrentView->m_LastMousePosition.m_BufferPositionX,
pCurrentView->m_LastMousePosition.m_BufferPositionY);
}
return true;
}
void MdispGtkView::RestrictCursor(bool on)
{
if(m_MilDisplay)
{
MdispControl(m_MilDisplay, M_RESTRICT_CURSOR,on?M_ENABLE:M_DISABLE);
MdispInquire(m_MilDisplay, M_RESTRICT_CURSOR, &m_currentRestrictCursor);
}
}
void MdispGtkView::UpdateContentSize()
{
int sizeX, sizeY;
if(m_MilDisplay)
{
MdispInquire(m_MilDisplay, M_ZOOM_FACTOR_X, &m_currentZoomFactorX);
MdispInquire(m_MilDisplay, M_ZOOM_FACTOR_Y, &m_currentZoomFactorY);
}
sizeX = int( m_imageSizeX * m_currentZoomFactorX );
sizeY = int( m_imageSizeY * m_currentZoomFactorY );
if(m_cf)
m_cf->UpdateContentSize(sizeX, sizeY);
}
void MdispGtkView::UpdateStatusBarWithMousePosition()
{
}
void MdispGtkView::Paint()
{
if(!m_MilDisplay)
{
cairo_t *cr;
cr = gdk_cairo_create(m_window->window);
cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (cr, 12.0);
cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
cairo_move_to (cr, (m_imageSizeX/2),10.0);
cairo_show_text (cr, "Display Allocation failed");
cairo_destroy(cr);
}
else if(m_isWindowed)
{
if(m_isX11AnnotationsEnabled)
{
cairo_t *cr;
cr = gdk_cairo_create(m_window->window);
cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (cr, 12.0);
cairo_set_source_rgb (cr, 1.0, 0.0, 1.0);
cairo_move_to (cr, (m_isScaleDisplayEnabled)?(m_window->allocation.width/2):(m_imageSizeX/2),10.0);
cairo_show_text (cr, "Window Annotation");
cairo_destroy(cr);
}
}
else{
cairo_t *cr;
cr = gdk_cairo_create(m_window->window);
cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (cr, 12.0);
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
cairo_move_to (cr, (m_imageSizeX/2),10.0);
cairo_show_text (cr, "Image displayed on external screen");
cairo_destroy(cr);
}
}