view libinterp/corefcn/display.cc @ 20946:6eff66fb8a02

style fixes for comments * find-dialog.cc, find-dialog.h, display.cc, error.cc, gl-render.cc, graphics.cc, graphics.in.h, max.cc, oct-handle.h, oct-obj.h, oct-stream.cc, oct.h, pr-output.cc, profiler.cc, str2double.cc, symtab.cc, toplev.cc, toplev.h, xgl2ps.c, zfstream.cc, zfstream.h, __glpk__.cc, audiodevinfo.cc, colamd.cc, symbfact.cc, ov-classdef.cc, ov-classdef.h, ov-java.cc, op-int.h, pt-pr-code.cc, pt-walk.h: Use C++-style comments where possible.
author John W. Eaton <jwe@octave.org>
date Fri, 18 Dec 2015 22:39:36 -0500
parents e74e617060cf
children ecb95c6384f2
line wrap: on
line source

/*

Copyright (C) 2009-2015 John W. Eaton

This file is part of Octave.

Octave is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.

Octave is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with Octave; see the file COPYING.  If not, see
<http://www.gnu.org/licenses/>.

*/

#include "display.h"

#if defined (OCTAVE_USE_WINDOWS_API)
#include <windows.h>
#elif defined (HAVE_FRAMEWORK_CARBON)
#include <Carbon/Carbon.h>
#elif defined (HAVE_X_WINDOWS)
#include <X11/Xlib.h>
#endif

display_info *display_info::instance = 0;

void
display_info::init (bool query)
{
  if (!query)
    return;

#if defined (OCTAVE_USE_WINDOWS_API)

  HDC hdc = GetDC (0);

  if (hdc)
    {
      dp = GetDeviceCaps (hdc, BITSPIXEL);

      ht = GetDeviceCaps (hdc, VERTRES);
      wd = GetDeviceCaps (hdc, HORZRES);

      double ht_mm = GetDeviceCaps (hdc, VERTSIZE);
      double wd_mm = GetDeviceCaps (hdc, HORZSIZE);

      rx = wd * 25.4 / wd_mm;
      ry = ht * 25.4 / ht_mm;

      dpy_avail = true;
    }
  else
    err_msg = "no graphical display found";

#elif defined (HAVE_FRAMEWORK_CARBON)

  CGDirectDisplayID display = CGMainDisplayID ();

  if (display)
    {
#if defined (HAVE_CARBON_CGDISPLAYBITSPERPIXEL)

      dp = CGDisplayBitsPerPixel (display);

#else

      // FIXME: This will only work for MacOS > 10.5. For earlier
      // versions this code is not needed (use CGDisplayBitsPerPixel
      // instead).

      CGDisplayModeRef mode = CGDisplayCopyDisplayMode (display);
      CFStringRef pixelEncoding = CGDisplayModeCopyPixelEncoding (mode);

      if (CFStringCompare (pixelEncoding, CFSTR (IO32BitDirectPixels), 0) == 0)
        dp = 32;
      else if (CFStringCompare (pixelEncoding,
                                CFSTR (IO16BitDirectPixels), 0) == 0)
        dp = 16;
      else
        dp = 8;

#endif

      ht = CGDisplayPixelsHigh (display);
      wd = CGDisplayPixelsWide (display);

      CGSize sz_mm = CGDisplayScreenSize (display);

      // For MacOS >= 10.6, CGSize is a struct keeping 2 CGFloat
      // values, but the CGFloat typedef is not present on older
      // systems, so use double instead.

      double ht_mm = sz_mm.height;
      double wd_mm = sz_mm.width;

      rx = wd * 25.4 / wd_mm;
      ry = ht * 25.4 / ht_mm;

      dpy_avail = true;
    }
  else
    err_msg = "no graphical display found";

#elif defined (HAVE_X_WINDOWS)

  const char *display_name = std::getenv ("DISPLAY");

  if (display_name && *display_name)
    {
      Display *display = XOpenDisplay (display_name);

      if (display)
        {
          Screen *screen = DefaultScreenOfDisplay (display);

          if (screen)
            {
              dp = DefaultDepthOfScreen (screen);

              ht = HeightOfScreen (screen);
              wd = WidthOfScreen (screen);

              int screen_number = XScreenNumberOfScreen (screen);

              double ht_mm = DisplayHeightMM (display, screen_number);
              double wd_mm = DisplayWidthMM (display, screen_number);

              rx = wd * 25.4 / wd_mm;
              ry = ht * 25.4 / ht_mm;
            }
          else
            err_msg = "X11 display has no default screen";

          XCloseDisplay (display);

          dpy_avail = true;
        }
      else
        err_msg = "unable to open X11 DISPLAY";
    }
  else
    err_msg = "X11 DISPLAY environment variable not set";

#else

  err_msg = "no graphical display found";

#endif

}

bool
display_info::instance_ok (bool query)
{
  bool retval = true;

  if (! instance)
    {
      instance = new display_info (query);

      if (instance)
        singleton_cleanup_list::add (cleanup_instance);
    }

  if (! instance)
    {
      error ("unable to create display_info object!");

      retval = false;
    }

  return retval;
}