News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

parameter array address value

Started by RD, April 30, 2009, 08:56:25 PM

Previous topic - Next topic

RD

hi,Want to change the screen brightness,i find this api: SetDeviceGammaRamp GetDeviceGammaRamp . return failure,Please help me,thanks!



BOOL WINAPI SetDeviceGammaRamp(
    HDC hDC,
    LPVOID lpRamp
);
Parameters
hDC
Specifies the device context of the direct color display board in question.

lpRamp
Pointer to a buffer containing the gamma ramp to be set. The gamma ramp is specified in three arrays of 256 WORD elements each, which contain the mapping between RGB values in the frame buffer and digital-analog-converter (DAC ) values. The sequence of the arrays is red, green, blue. The RGB values must be stored in the most significant bits of each WORD to increase DAC independence.

Return Value
If this function succeeds, the return value is TRUE.



.data
Gamma struct
   Red1  word 255 dup(0)
   Green1  word 255 dup(0)
   Blue1  word 255 dup(0)
Gamma ends
g1 Gamma 2 dup(<>)
hdc dd 0
.code
start:
invoke GetDesktopWindow
invoke GetDC,eax
mov hdc,eax
invoke SetDeviceGammaRamp,hdc,offset g1         ;array address error ?
.if !eax
   Error "info"
.endif

MichaelW

Hi RD, welcome to the forum.

On my system SetDeviceGammaRamp returned false, but if I initialize the gamma ramp buffer by calling GetDeviceGammaRamp first, and pass the initialized structure to SetDeviceGammaRamp, then both functions return true. So it looks like the buffer needs to be initialized to something other than all zeros.

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc

    Gamma struct
      Red1    word 255 dup(0)
      Green1  word 255 dup(0)
      Blue1   word 255 dup(0)
    Gamma ends

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
      g1  Gamma 2 dup(<>)
      hdc dd 0
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    invoke GetDesktopWindow
    invoke GetDC, eax
    mov hdc, eax
    invoke GetDeviceGammaRamp, hdc, ADDR g1
    print ustr$(eax),13,10
    invoke SetDeviceGammaRamp, hdc, ADDR g1
    print ustr$(eax),13,10,13,10

    inkey "Press any key to exit..."
    exit

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start

eschew obfuscation

RD

hi MichaelW,You are right,I initialize the gamma ramp buffer, test is successful,thank you very much for the help!

jj2007

Michael's code works fine, but I have a question: The documentation says 256 words. Why then 255 dup ? ::)
Both versions work, and hdc, although located directly after the second Gamma, is not being overwritten by GetDeviceGammaRamp. Bug in documentation?

EDIT: No bug in documentation, but bug in code: Only one ramp is needed, with 256 word elements.

(by the way: The old Win32.hlp file still says byte elements)

.nolist
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
   
    NumWords = 255+1 ; !!

    Gamma struct
      Red1    word NumWords dup(0)
      Green1  word NumWords dup(0)
      Blue1   word NumWords dup(0)
    Gamma ends

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
      g1  Gamma <>
      ; g2  Gamma <>  <------------- NOT NEEDED
      hdc dd 0
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    invoke GetDesktopWindow
    invoke GetDC, eax
    mov hdc, eax
    invoke GetDeviceGammaRamp, hdc, ADDR g1
    print ustr$(eax),13,10
    invoke SetDeviceGammaRamp, hdc, ADDR g1
    print ustr$(eax),13,10,13,10
    print "G1=", 9
    print hex$(offset g1), 13, 10
    ; print "G2=", 9
    ; print hex$(offset g2), 13, 10
    print "hdc=", 9
    print hex$(offset hdc), 13, 10

    inkey "Press any key to exit..."
    exit

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start

MichaelW

This appears to work correctly on my system.

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc

    GAMMARAMP struct
      red    WORD 256 dup(?)
      green  WORD 256 dup(?)
      blue   WORD 256 dup(?)
    GAMMARAMP ends

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
      gr1  GAMMARAMP <>
      gr2  GAMMARAMP <>
      hdc  dd        0
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    invoke GetDC, 0
    mov hdc, eax

    invoke GetDeviceGammaRamp, hdc, ADDR gr1
    print ustr$(eax),13,10,13,10

    lea esi, gr1
    xor ebx, ebx
    .WHILE ebx < 256
      movzx eax, [esi+ebx*2].GAMMARAMP.red
      print ustr$(eax),9
      movzx eax, [esi+ebx*2].GAMMARAMP.green
      print ustr$(eax),9
      movzx eax, [esi+ebx*2].GAMMARAMP.blue
      print ustr$(eax),13,10
      inc ebx
    .ENDW
    print chr$(13,10)

    invoke Sleep, 5000

    lea edi, gr2
    xor ebx, ebx
    .WHILE ebx < 256
      mov ax, [esi+ebx*2].GAMMARAMP.red
      shr ax, 1
      mov [edi+ebx*2].GAMMARAMP.red, ax
      mov ax, [esi+ebx*2].GAMMARAMP.green
      shr ax, 1
      mov [edi+ebx*2].GAMMARAMP.green, ax
      mov ax, [esi+ebx*2].GAMMARAMP.blue
      shr ax, 1
      mov [edi+ebx*2].GAMMARAMP.blue, ax
      inc ebx
    .ENDW

    invoke SetDeviceGammaRamp, hdc, ADDR gr2
    print ustr$(eax),13,10

    invoke Sleep, 5000

    invoke SetDeviceGammaRamp, hdc, ADDR gr1
    print ustr$(eax),13,10,13,10

    inkey "Press any key to exit..."
    exit

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start

eschew obfuscation