SURFOBJ
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dhsurf | DHSURF | 8/4 | +0 | +0 | サーフェスがデバイス管理である場合、そのサーフェスへのハンドルです。それ以外の場合、このメンバーは 0 です。 | ||||||||||||||||||||||
| hsurf | HSURF | 8/4 | +8 | +4 | サーフェスへのハンドルです。 | ||||||||||||||||||||||
| dhpdev | DHPDEV | 8/4 | +16 | +8 | 指定されたサーフェスに関連付けられているデバイスの PDEV を識別します。 | ||||||||||||||||||||||
| hdev | HDEV | 8/4 | +24 | +12 | このデバイスに関連付けられている PDEV に対する GDI の論理ハンドルです。 | ||||||||||||||||||||||
| sizlBitmap | SIZE | 8 | +32 | +16 | サーフェスの幅と高さをピクセル単位で格納する SIZEL 構造体を指定します。SIZEL 構造体は SIZE 構造体と同一です。 | ||||||||||||||||||||||
| cjBits | DWORD | 4 | +40 | +24 | pvBits が指すバッファーのサイズを指定します。 | ||||||||||||||||||||||
| pvBits | void* | 8/4 | +48 | +28 | サーフェスが標準形式のビットマップである場合、これはサーフェスのピクセルへのポインターです。BMF_JPEG または BMF_PNG の画像の場合、これは JPEG 形式または PNG 形式の画像データを格納するバッファーへのポインターです。それ以外の場合、このメンバーは NULL です。 | ||||||||||||||||||||||
| pvScan0 | void* | 8/4 | +56 | +32 | ビットマップの最初のスキャンラインへのポインターです。iBitmapFormat が BMF_JPEG または BMF_PNG の場合、このメンバーは NULL です。 | ||||||||||||||||||||||
| lDelta | INT | 4 | +64 | +36 | ビットマップ内でスキャンライン 1 行分下に移動するために必要なバイト数を指定します。iBitmapFormat が BMF_JPEG または BMF_PNG の場合、このメンバーは NULL です。 | ||||||||||||||||||||||
| iUniq | DWORD | 4 | +68 | +40 | 指定されたサーフェスの現在の状態を指定します。サーフェスが変更されるたびに、この値は増加します。これにより、ドライバーはソースサーフェスをキャッシュできます。 キャッシュすべきでないサーフェスの場合、iUniq は 0 に設定されます。この値は fjBitmap の BMF_DONTCACHE フラグと組み合わせて使用されます。 | ||||||||||||||||||||||
| iBitmapFormat | DWORD | 4 | +72 | +44 | このサーフェスに最も近い標準形式を指定します。iType メンバーがビットマップ (STYPE_BITMAP) を指定している場合、このメンバーはその形式を指定します。NT ベースのオペレーティングシステムは定義済みの形式のセットをサポートしますが、アプリケーションは SetDIBitsToDevice を使用してデバイス固有の形式を送信することもできます。サポートされる定義済みの形式には次のものがあります。
| ||||||||||||||||||||||
| iType | WORD | 2 | +76 | +48 | サーフェスの種類で、次のいずれかです。
| ||||||||||||||||||||||
| fjBitmap | WORD | 2 | +78 | +50 | サーフェスが STYPE_BITMAP 型で、標準の非圧縮形式のビットマップである場合、次のフラグを設定できます。それ以外の場合、このメンバーは無視してください。
|
公式ドキュメント
SURFOBJ 構造体は、サーフェスのユーザーオブジェクトです。デバイスドライバーは通常、サーフェスオブジェクトが GDI ビットマップまたはデバイス管理サーフェスを表す場合にのみ、サーフェスオブジェクトのメソッドを呼び出します。
解説(Remarks)
ドライバーが特定のサーフェスに関する情報を必要とする場合、ドライバーは SURFOBJ にアクセスする必要があります。この構造体により、サーフェスのプロパティに素早くアクセスできます。
SURFOBJ 構造体が GDI ビットマップを表す場合、ドライバーはそのビットマップの形式を判別し、ビットマップのビットを特定できなければなりません。
SURFOBJ 構造体がデバイスサーフェスを表す場合、ドライバーはそのサーフェスのデバイスハンドルを特定できなければなりません。
JPEG および PNG 圧縮画像のサポートの詳細については、DEVINFO を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// SIZE (x64 8 / x86 8 バイト)
typedef struct SIZE {
INT cx;
INT cy;
} SIZE;
// SURFOBJ (x64 80 / x86 52 バイト)
typedef struct SURFOBJ {
DHSURF dhsurf;
HSURF hsurf;
DHPDEV dhpdev;
HDEV hdev;
SIZE sizlBitmap;
DWORD cjBits;
void* pvBits;
void* pvScan0;
INT lDelta;
DWORD iUniq;
DWORD iBitmapFormat;
WORD iType;
WORD fjBitmap;
} SURFOBJ;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SIZE
{
public int cx;
public int cy;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SURFOBJ
{
public IntPtr dhsurf;
public IntPtr hsurf;
public IntPtr dhpdev;
public IntPtr hdev;
public SIZE sizlBitmap;
public uint cjBits;
public IntPtr pvBits;
public IntPtr pvScan0;
public int lDelta;
public uint iUniq;
public uint iBitmapFormat;
public ushort iType;
public ushort fjBitmap;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SIZE
Public cx As Integer
Public cy As Integer
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SURFOBJ
Public dhsurf As IntPtr
Public hsurf As IntPtr
Public dhpdev As IntPtr
Public hdev As IntPtr
Public sizlBitmap As SIZE
Public cjBits As UInteger
Public pvBits As IntPtr
Public pvScan0 As IntPtr
Public lDelta As Integer
Public iUniq As UInteger
Public iBitmapFormat As UInteger
Public iType As UShort
Public fjBitmap As UShort
End Structureimport ctypes
from ctypes import wintypes
class SIZE(ctypes.Structure):
_fields_ = [
("cx", ctypes.c_int),
("cy", ctypes.c_int),
]
class SURFOBJ(ctypes.Structure):
_fields_ = [
("dhsurf", ctypes.c_void_p),
("hsurf", ctypes.c_void_p),
("dhpdev", ctypes.c_void_p),
("hdev", ctypes.c_void_p),
("sizlBitmap", SIZE),
("cjBits", wintypes.DWORD),
("pvBits", ctypes.c_void_p),
("pvScan0", ctypes.c_void_p),
("lDelta", ctypes.c_int),
("iUniq", wintypes.DWORD),
("iBitmapFormat", wintypes.DWORD),
("iType", ctypes.c_ushort),
("fjBitmap", ctypes.c_ushort),
]#[repr(C)]
pub struct SIZE {
pub cx: i32,
pub cy: i32,
}
#[repr(C)]
pub struct SURFOBJ {
pub dhsurf: *mut core::ffi::c_void,
pub hsurf: *mut core::ffi::c_void,
pub dhpdev: *mut core::ffi::c_void,
pub hdev: *mut core::ffi::c_void,
pub sizlBitmap: SIZE,
pub cjBits: u32,
pub pvBits: *mut core::ffi::c_void,
pub pvScan0: *mut core::ffi::c_void,
pub lDelta: i32,
pub iUniq: u32,
pub iBitmapFormat: u32,
pub iType: u16,
pub fjBitmap: u16,
}import "golang.org/x/sys/windows"
type SIZE struct {
cx int32
cy int32
}
type SURFOBJ struct {
dhsurf uintptr
hsurf uintptr
dhpdev uintptr
hdev uintptr
sizlBitmap SIZE
cjBits uint32
pvBits uintptr
pvScan0 uintptr
lDelta int32
iUniq uint32
iBitmapFormat uint32
iType uint16
fjBitmap uint16
}type
SIZE = record
cx: Integer;
cy: Integer;
end;
SURFOBJ = record
dhsurf: Pointer;
hsurf: Pointer;
dhpdev: Pointer;
hdev: Pointer;
sizlBitmap: SIZE;
cjBits: DWORD;
pvBits: Pointer;
pvScan0: Pointer;
lDelta: Integer;
iUniq: DWORD;
iBitmapFormat: DWORD;
iType: Word;
fjBitmap: Word;
end;const SIZE = extern struct {
cx: i32,
cy: i32,
};
const SURFOBJ = extern struct {
dhsurf: ?*anyopaque,
hsurf: ?*anyopaque,
dhpdev: ?*anyopaque,
hdev: ?*anyopaque,
sizlBitmap: SIZE,
cjBits: u32,
pvBits: ?*anyopaque,
pvScan0: ?*anyopaque,
lDelta: i32,
iUniq: u32,
iBitmapFormat: u32,
iType: u16,
fjBitmap: u16,
};type
SIZE {.bycopy.} = object
cx: int32
cy: int32
SURFOBJ {.bycopy.} = object
dhsurf: pointer
hsurf: pointer
dhpdev: pointer
hdev: pointer
sizlBitmap: SIZE
cjBits: uint32
pvBits: pointer
pvScan0: pointer
lDelta: int32
iUniq: uint32
iBitmapFormat: uint32
iType: uint16
fjBitmap: uint16struct SIZE
{
int cx;
int cy;
}
struct SURFOBJ
{
void* dhsurf;
void* hsurf;
void* dhpdev;
void* hdev;
SIZE sizlBitmap;
uint cjBits;
void* pvBits;
void* pvScan0;
int lDelta;
uint iUniq;
uint iBitmapFormat;
ushort iType;
ushort fjBitmap;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SURFOBJ サイズ: 52 バイト(x86)
dim st, 13 ; 4byte整数×13(構造体サイズ 52 / 4 切り上げ)
; dhsurf : DHSURF (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; hsurf : HSURF (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; dhpdev : DHPDEV (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; hdev : HDEV (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; sizlBitmap : SIZE (+16, 8byte) varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; cjBits : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; pvBits : void* (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; pvScan0 : void* (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; lDelta : INT (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; iUniq : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; iBitmapFormat : DWORD (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; iType : WORD (+48, 2byte) wpoke st,48,値 / 値 = wpeek(st,48)
; fjBitmap : WORD (+50, 2byte) wpoke st,50,値 / 値 = wpeek(st,50)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SURFOBJ サイズ: 80 バイト(x64)
dim st, 20 ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; dhsurf : DHSURF (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; hsurf : HSURF (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; dhpdev : DHPDEV (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; hdev : HDEV (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; sizlBitmap : SIZE (+32, 8byte) varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; cjBits : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; pvBits : void* (+48, 8byte) qpoke st,48,値 / qpeek(st,48) ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; pvScan0 : void* (+56, 8byte) qpoke st,56,値 / qpeek(st,56) ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; lDelta : INT (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; iUniq : DWORD (+68, 4byte) st.17 = 値 / 値 = st.17 (lpoke/lpeek も可)
; iBitmapFormat : DWORD (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; iType : WORD (+76, 2byte) wpoke st,76,値 / 値 = wpeek(st,76)
; fjBitmap : WORD (+78, 2byte) wpoke st,78,値 / 値 = wpeek(st,78)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global SIZE
#field int cx
#field int cy
#endstruct
#defstruct global SURFOBJ
#field intptr dhsurf
#field intptr hsurf
#field intptr dhpdev
#field intptr hdev
#field SIZE sizlBitmap
#field int cjBits
#field intptr pvBits
#field intptr pvScan0
#field int lDelta
#field int iUniq
#field int iBitmapFormat
#field short iType
#field short fjBitmap
#endstruct
stdim st, SURFOBJ ; NSTRUCT 変数を確保
st->cjBits = 100
mes "cjBits=" + st->cjBits