Tải bản đầy đủ (.doc) (16 trang)

High color & True color

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (82.41 KB, 16 trang )

High color & True color
Lưu Văn Minh
Email:
gày nay,đồ họa độ phân giải cao và độ sâu màu lớn đang phát triển mạnh mẽ và trở
nênquen thuộc. Tuy nhiên trên nền DOS để hiển thị một bức ảnh với số lượng màu
lớn(16 triệu màu) không phải là một việc dễ dàng. Nếu bạn không có các drive
hỗtrợ 16 - 24 - 32 bit màu thì bạn chỉ có thể hiển thị tối đa 256 màu, một con sốquá ít so
với số màu sắc trung thực của một bức ảnh mà hiện nay hầu như toànđược lưu trữ với
chuẩn 24 bit màu. Vậy chúng ta làm thế nào để thiết lập đượcchế độ High Color & True
Color.
Cáccard HiColor và TrueColor dùng RAMDAC chip (chip chuyển đổi
digital/analog)chuyển trị số trong VRAM thành tín hiệu tương tự ra màn hình. HiColor
vàTrueColor thể hiện màu trực tiếp - nghĩa là bạn trực tiếp chỉ định trị Red -Green - Blue
(RGB) cho mỗi pixel, không phải lấy các trị màu này từ một mảngpalette màu giới hạn.
Nói cách khác trị màu cho chúng ta biết trực tiếp cácthành phần RGB.
- Mode15-bit cho phép thể hiện 32k màu, mỗi màu thể hiện như một trị 2-byte:
X R R R R R G G G G G B B B B B
trong đó bitX không được dùng
- Mode16-bit cho phép thể hiện 64k màu, mỗi màu thể hiện như một trị 2-byte:
R R R R R G G G G G G B B B B B
trong modenày G chiếm 6 bit vì người ta cho rằng mắt người nhạy cảm với màu xanh lá
câycó nhiều trong thiên nhiên.
- Mode24-bit cho phép thể hiện 16 triệu màu, mỗi màu thể hiện như một trị 3-byte:
R R R R R R R R G G G G G G G G B B B B B B B B
Mode16-bit được gọi là chế độ High Color và mode 24-bit được gọi làchế độ True Color.
Một vài SuperVGA card có thêm chế độ 32-bitmàu và 64-bit màu, byte thêm gọi là kênh
anpha, lưu trị transparency, trị màutrong suốt khi phủ ảnh lên một ảnh khác.
Bằngphục vụ 10h của ngắt 10h bạn chỉ có thể khởi tạo được các mode màn hình có sốmàu
thấp (VGA BIOS). Nhưng thông qua các hàm phục vụ của VESA BIOS tôi muốngiới thiệu
với các bạn một cách khởi tạo chế độ mà Card Video của bạn cho phép.
Cáchàm mở của VESA được gọi qua phục vụ mở 4Fh (AH = 4Fh) và chỉ số phục vụ


controng AL.
N
Phục vụ con Chức năng của phục vụ
00h Lấy các khả năng của vỉ SuperVGA
01h Lấy thông tin chế độ SVGA
02h Đặt chế độ video SuperVGA
03h Lấy chế độ video hiện hành
04h Lưu trạng thái video SuperVGA
05h Đặt, lấy cửa sổ truy nhập RAM video
Kiểm tra các khảnăng của vỉ Super VGA
Trướckhi chạy trong chế độ nào đó bạn phải gọi hàm con 00h để có các khả năng của
vỉSuperVGA đã cài đặt. Với lời gọi hàm này số hiệu hàm và hàm con đặt trong AH vàAL,
con trỏ Far trỏ đến vùng đệm 256K đặt trong cặp thanh ghi ES:DI.
Cấu trúc đệm hàmcon 00h
Offset Nội dung Size
00h Dấu hiệu VESA (VESA) 4 Byte
04h Bản VESA, số hiệu bản chính 1 Byte
05h Bản VESA, số hiệu bản phụ 1 Byte
06h Con trỏ Far trỏ tới tên nhà sản xuất Pointer (4byte)
0Ah Cờ chỉ khả năng hiện thời không dùng Dword
0Eh Con trỏ Far trỏ tới danh sách các mode
hỗ trợ
Pointer
Đọc chế độ videoxác định
Lờigọi hàm này số hiệu hàm và hàm con đặt trong AH và AL, chế độ thích hợp đặttrong
CX, con trỏ Far trỏ đến vùng đệm đặt trong cặp thanh ghi ES:DI sẽ chứathông tin
Offset Nội dung Size
00h Cờ chế độ 4 Word
02h Cờ chế độ cửa sổ truy nhập đầu tiên 1 Byte
03h Cờ chế độ cửa sổ truy nhập thứ hai 1 Byte

04h Khoảng tăng của hai của sổ (KB) 1 Word
06h Kích thước hai cửa sổ truy nhập (KB) 1 Word
08h Địa chỉ đoạn của cửa sổ thứ nhất 1 Word
0Ah Địa chỉ đoạn của cửa sổ thứ hai 1 Word
0Ch Con trỏ Far đến thủ tục đặt vùng nhìn
thấy trong hai cửa sổ truy nhập
Pointer
10h Số byte cần cho mỗi dòng điểm của
RAM video
1 Word
12h Độ phân giải chiều ngang 1 Word
14h Độ phân giải chiều dọc 1 Word
16h Độ rộng ma trận ký tự 1 Byte
17h Chiều cao ma trận ký tự 1 Byte
18h Số mặt bit 1 Byte
19h Số bit cho mỗi điểm màn hình 1 Byte
1Ah Số khối bộ nhớ 1 Byte
1Bh Kiểu bộ nhớ 1 Byte
1Ch Kích thước các khối bộ nhớ (Kb) 1 Byte
Đặt chế độ
AX = 4F02h
BX = mode
Trả lại
AL = 4Fh: Lỗi khởi tạo không thành công
AL = 00h: Thành công
Đặt cửa sổ truynhập
AX = 4F05h
BH = 0
BL = cửa sổ
DX = trang đặt của sổ

Trả lại
AL = 4Fh: Lỗi
AL = 00h: Thành công
Tìm chế độ cầnkhởi tạo
Chúngta đã có các hàm cần thiết để xây dựng chương trình. Vấn đề đặt ra bây giờ làvới
chế độ nào ta khởi tạo được chế độ với số bit màu mà ta cần.
Ta cóhàm con 01h trả về độ phân giải của màn hình và số bit cho mỗi pixel. Vậy ta cóthể
sử dụng hàm này để tìm mode cần tìm.
Đầutiên ta lấy thông tin về các mode được hỗ trợ bởi Card đồ họa và lưu lại. Khita cần
mode có độ phân giải XxY và n bit cho mỗi pixel ta duyệt lần lượt cácmode đã lưu lại, nếu
giá trị trả về độ phân giải và số bit cho mỗi pixel saulời gọi hàm con 01h trùng với các giá
trị ta cần thì đấy chính là mode cần tìm.
Vẽ một điểm
Ta vẽmột điểm có toạ độ (X, Y) thông qua địa chỉ phân đoạn A000h qua 65535 byte:
địachỉ thực = (X + Y * Độ phân giải chiều ngang) * Số byte mỗi pixel;
Vìgiới hạn trong 65535 byte truy nhập nên ta phải xác định xem điểm đó thuộctrang nào.
trang= địa chỉ thực div FFFFh
ĐặtBL = trang rồi gọi hàm con 05h
sau đó taghi trực tiếp vào bộ nhớ
Sauđây là unit Graph32.pas dùng để khởi tạo đồ họa High Color được viết trên nềnPascal.
Trong unit này chỉ có một thủ tục đồ họa cơ bản đó là vẽ một điểm ramàn hình, nhưng tin
chắc rằng kết hợp với một số kiến thức cơ bản về đồ họa(chẳng hạn như bài viết "Tự làm
lấy đồ họa máy tính" của tácgiả Nguyễn Xuân Huy đã được đăng trên các số trước) bạn có
thể xây dựng đượcmột thư viện đồ họa mạnh, có thể giải quyết được nhiều vấn đề mà unit
Graph củaPascal không làm được.
unit Graph32;
interface
type
NullString = array [0..255] of Char;
ModeList = array [1..3277] of Word;

SVGAInformation = record
Signature: array [1..4] of Char;
Version: Word;
OEMStringPtr: ^NullString;
Capabilities: LongInt;
VideoModePtr: ^ModeList;
TotalMemory: Integer;
OEMSoftwareRev: Integer;
OEMVendorNamePtr: Pointer;
OEMProductNamePtr: Pointer;
OEMProductRevPtr: Pointer;
Reserved: array [1..222] of Byte;
OEMData: array [1..256] of Byte;
end;
SVGAMode = record
ModeAttributes: Word;
WinAAttributes: Byte;
WinBAttributes: Byte;
WinGranularity: Integer;
WinSize: Word;
WinASegment: Word;
WinBSegment: Word;
WinFunctionPtr: procedure;
BytesPerScanLine: Integer;
XResolution: Integer;
YResolution: Integer;
XCharSize: Byte;
YCharSize: Byte;
NumberOfPlanes: Byte;
MemoryModel: Byte;

BankSize: Byte;
NumberOfImagePages: Byte;
Reserved1: Byte;
RedMaskSize: Byte;
RedFieldPosition: Byte;
GreenMaskSize: Byte;
GreenFieldPosition: Byte;
BlueMaskSize: Byte;
BlueFieldPosition: Byte;
RsvdMaskSize: Byte;
RsvdFieldPosition: Byte;
DirectColorModeInfor: Byte;
PhysicalBasePtr: Pointer;
OffScreenMemOffse: Pointer;
OffScreenMemSize: Integer;
Reserved: array [1..206] of Byte;
end;
var
VesaInfor: SVGAInformation;
VesaModeInfor: SVGAMode;
MaxX, MaxY: Word;
BitPerPixel: Byte;
Seg_, Ofs_: Word;
BytePerPixel: Word;
BytePerLine: Integer;
x_: Word;
P, PO: Word;
DP: Byte;
function GetVesaInfor: Boolean;
function GetModeInfor(Mode: Word): Boolean;

function FindMode(x, y: Word; b: Byte): Word;
function InitGraph(x, y: Word; b: Byte): Boolean;
procedure PutPixel(x, y: Word; r, g, b: Byte);
function CloseGraph: Boolean;
implementation
function GetVesaInfor;
var
ReturnCode: Word;
begin
asm
mov ax, Seg VesaInfor;
mov es, ax;
mov di, Offset VesaInfor;
mov ax, 4F00h;
int 10h;
mov ReturnCode, ax;
end;
if ReturnCode = $4f then GetVesaInfor := True
else GetVesaInfor := False;
end;
function GetModeInfor;
var
ReturnCode: Word;
begin
asm
mov ax, Seg VesaModeInfor;
mov es, ax;
mov di, Offset VesaModeInfor;
mov ax, 4F01h;
mov cx, Mode;

int 10h;
mov ReturnCode, ax;
end;
High color & True color
Lưu Văn Minh
(Tiếp theo sốtrước)
Email:
function GetModeInfor;
var
ReturnCode: Word;
begin
asm
mov ax, Seg VesaModeInfor;
mov es, ax;

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×