Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member

If you feel bored by crunching through business data, you could create some nice images in ABAP. For example, a fractal. Below is a simple program for calculating a Mandelbrot set. Just add a screen 0100 with a single custom controller, named CUSTOM_CONTAINER. Note that GUI status is not set, so buttons will not be active. You should add them yourself if you need.

REPORT  ZTEST_FRAC.

TYPES:
   BEGIN OF lty_data,
     data(2556) TYPE x,
   END OF lty_data.

TYPES:
   BEGIN OF lty_cpx,
     x TYPE f,
     y TYPE f,
   END OF lty_cpx.

DATA custom_container TYPE REF TO cl_gui_custom_container.
DATA picture TYPE REF TO cl_gui_picture.
DATA bitmap TYPE xstring.
DATA bitmap_url TYPE char255.
DATA lt_data TYPE TABLE OF lty_data.

DATA:
   BEGIN OF bmp_info,
     bfType(2) TYPE x VALUE '424D', " BM
     bfSize(4) TYPE x VALUE '36100E00', " 921654=640*480*3+54 bytes
     bfReserved1(2) TYPE x VALUE '0000',
     bfReserved2(2) TYPE x VALUE '0000',
     bfOffBits(4) TYPE x VALUE '36000000', " 54=14+40 bytes
     biSize(4) TYPE x VALUE '28000000', " 40 bytes
     biWidth(4) TYPE x VALUE '80020000', " 640 pixels
     biHeight(4) TYPE x VALUE 'E0010000', " 480 pixels
     biPlanes(2) TYPE x VALUE '0100', " 1
     biBitCount(2) TYPE x VALUE '2000', " 32 bits
     biCompression(4) TYPE x VALUE '00000000',
     biSizeImage(4) TYPE x VALUE '00100E00', " 921600=640*480*3 bytes
     biXPelsPerMeter(4) TYPE x VALUE '00000000',
     biYPelsPerMeter(4) TYPE x VALUE '00000000',
     biClrUsed(4) TYPE x VALUE '000000',
     biClrImportant(4) TYPE x VALUE '000000',
   END OF bmp_info.

DATA:
   BEGIN OF bmp_color,
     r TYPE x VALUE '00',
     g TYPE x VALUE '00',
     b TYPE x VALUE '00',
     a TYPE x VALUE '00',
   END OF bmp_color.

DATA c1 TYPE lty_cpx.
DATA c2 TYPE lty_cpx.
DATA max_l TYPE f.
DATA max_n TYPE i.
DATA c0 TYPE lty_cpx.
DATA z TYPE lty_cpx.
DATA z_temp TYPE lty_cpx.
DATA n TYPE i.
DATA l TYPE f.
DATA dx TYPE i.
DATA dy TYPE i.

DATA lt_points TYPE TABLE OF i.

c1-x = '-0.9'. c1-y = '0.2'. " bottom-left point
c2-x = '-0.84'. c2-y = '0.26'. " top-right point
max_l = 2 * 2. " square of maximum distance, i.e. "infinity"
max_n = 256. " maximum number of iterations
dx = 640. " pixel width (note: bitmap has it hardcoded)
dy = 480. " pixel height (note: bitmap has it hardcoded)

* Calculate Mandelbrot set
DO dy TIMES.
   c0-y = c1-y + sy-index * ( c2-y - c1-y ) / dy.
   DO dx TIMES.
     c0-x = c1-x + sy-index * ( c2-x - c1-x ) / dx.
     z = c0.
     l = 0.
     n = 0.
     WHILE l < max_l AND n < max_n.
       z_temp-x = z-x * z-x - z-y * z-y + c0-x.
       z_temp-y = 2 * z-x * z-y + c0-y.
       z = z_temp.
       l = z-x * z-x + z-y * z-y.
       ADD 1 TO n.
     ENDWHILE.
     IF n >= max_n.
       n = 0.
     ENDIF.
     APPEND n TO lt_points.
   ENDDO.
ENDDO.

* Fill BMP header
CONCATENATE
     bmp_info-bfType
     bmp_info-bfSize
     bmp_info-bfReserved1
     bmp_info-bfReserved2
     bmp_info-bfOffBits
     bmp_info-biSize
     bmp_info-biWidth
     bmp_info-biHeight
     bmp_info-biPlanes
     bmp_info-biBitCount
     bmp_info-biCompression
     bmp_info-biSizeImage
     bmp_info-biXPelsPerMeter
     bmp_info-biYPelsPerMeter
     bmp_info-biClrUsed
     bmp_info-biClrImportant
   INTO bitmap IN BYTE MODE.

* Fill BMP pixel array
LOOP AT lt_points INTO n.

   bmp_color-b = n.

   CONCATENATE bitmap
       bmp_color-b
       bmp_color-g
       bmp_color-r
       bmp_color-a
     INTO bitmap IN BYTE MODE.

ENDLOOP.

* Prepare and output bitmap in SAP GUI
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
   EXPORTING
     BUFFER                = bitmap
   TABLES
     BINARY_TAB            = lt_data.

CALL FUNCTION 'DP_CREATE_URL'
      EXPORTING
         type                 = 'IMAGE'
         subtype              = 'X-UNKNOWN'
      TABLES
         data                 = lt_data
      CHANGING
         url                  = bitmap_url.

CREATE OBJECT custom_container
   EXPORTING
     container_name = 'CUSTOM_CONTAINER'.

CREATE OBJECT picture
   EXPORTING parent = custom_container.

picture->load_picture_from_url( exporting url = bitmap_url ).

CALL SCREEN 0100.

3 Comments