Tipos de Superfície

Os tipos surface podem ser exibidos no contexto de como eles são tratados. Os seguintes tipos existem:

  • Superfícies gerenciadas pelo mecanismo

  • Superfícies gerenciadas pelo dispositivo (bitmaps de formato padrão)

  • Superfícies gerenciadas pelo dispositivo (bitmaps não padrão)

Superfícies gerenciadas pelo mecanismo

Uma superfície gerenciada pelo mecanismo:

  • É criado e gerenciado pela GDI.

  • É criado como um DIB (bitmap independente do dispositivo) em um dos formatos DIB padrão: de cima para baixo, no qual a origem está no canto superior esquerdo ou de baixo para cima, em que a origem está no canto inferior esquerdo.

  • É do tipo STYPE_BITMAP.

  • Não tem um identificador de dispositivo correspondente para uma superfície.

Um bitmap de formato padrão é um bitmap de plano único e empacotado (em que os dados de cada pixel são armazenados de maneira contígua). Cada linha de verificação do bitmap é alinhada em um limite de quatro bytes.

Bitmaps criados na função EngCreateBitmap estão no formato DIB. Um bitmap deve estar no formato DIB para que o mecanismo o gerencie.

Superfícies gerenciadas pelo dispositivo (Bitmaps de formato padrão)

Uma superfície gerenciada pelo dispositivo:

  • É criado por uma chamada para a função DrvCreateDeviceBitmap do driver de dispositivo.

  • Tem um identificador de dispositivo associado a uma superfície (DHSURF; para obter mais informações, consulte SURFOBJ).

  • Pode ser opaco ou nãopaque.

Uma superfície gerenciada por dispositivo opaco é aquela para a qual a GDI não tem nenhuma informação sobre o formato bitmap nem uma referência aos bits no bitmap. Por esses motivos, o driver deve dar suporte, no mínimo, às funções DrvBitBlt, DrvTextOut e DrvStrokePath . O tipo de tal superfície é STYPE_DEVBITMAP.

Uma superfície gerenciada por dispositivo nãopaque é aquela para a qual a GDI tem informações sobre o formato bitmap e sabe o local dos bits dentro do bitmap. Por isso, o driver não precisa implementar nenhuma operação de desenho, adiando todas elas para a GDI. O tipo de tal superfície é SYTPE_BITMAP.

Para que um driver converta um bitmap opaco gerenciado pelo dispositivo em um que seja nonopaque, ele deve chamar a função EngModifySurface . Com essa chamada, o driver está informando a GDI sobre o formato de bitmap e o local do bitmap na memória.

Quando um driver tem uma superfície DIB gerenciada pelo dispositivo, o driver pode chamar de volta para a GDI para que o GDI seja desenhado na superfície. Um driver que está gerenciando suas próprias superfícies, mas está usando um DIB, ainda pode encaminhar chamadas de volta para GDI encapsulando um DIB (que é criado com a função EngCreateBitmap ) em torno de sua superfície. As etapas a seguir descrevem como o driver pode desenhar GDI em uma superfície DIB gerenciada pelo dispositivo:

  1. O driver chama EngCreateBitmap para criar uma superfície gerenciada pelo mecanismo DIB.

  2. O driver chama a função EngCreateDeviceBitmap para criar uma superfície de DDB (bitmap dependente do dispositivo), que é uma superfície DIB gerenciada pelo dispositivo.

  3. O driver salva internamente os dados DIB gerenciados pelo mecanismo nos dados do DDB gerenciados pelo dispositivo.

  4. A GDI sempre chama o driver para interagir com a superfície por meio dos dados do DDB gerenciados pelo dispositivo.

  5. Quando o driver recebe uma chamada da GDI e não consegue lidar com a chamada (por exemplo, o driver não pode lidar com recortes complexos), o driver recupera os dados DIB armazenados nos dados do DDB e passa os dados DIB para a GDI para renderizar.

Superfícies gerenciadas pelo dispositivo (bitmaps não padrão)

Um driver pode habilitar uma superfície não DIB gerenciada pelo dispositivo chamando a função EngCreateDeviceSurface para que o GDI crie a superfície e retorne um identificador para ela. A GDI depende do driver para acessar, controlar o desenho e ler de uma superfície gerenciada pelo dispositivo.

Um DDB (bitmap dependente do dispositivo), que às vezes é chamado de bitmap de formato de dispositivo, é outro tipo de superfície não DIB, gerenciada pelo dispositivo. O DDB tem suporte para permitir que determinados drivers, como o driver VGA, implementem transferências de bloco bitmap para tela mais rápidas. O DDB também permite que os drivers sejam desenhados para bitmaps bancários ou não DIB na memória de exibição fora da tela. Se um DDB for necessário, o driver poderá dar suporte à função DrvCreateDeviceBitmap e chamar a função EngCreateDeviceBitmap para que o mecanismo retorne um identificador para o bitmap.