Trabalhar com Padrões de Hachura em PostScript | C++
Adicionar Padrão de Hachura em Documento PS
O padrão de hachura é um padrão de textura em mosaico, geralmente representado por pequenas imagens simples de duas cores (geralmente preto e branco). O conteúdo principal destas pequenas imagens são várias hachuras.
Para a pintura por hachuras, a plataforma C++ possui uma classe separada, derivada de System.Drawing.Brush, System.Drawing.HatchBrush. A sua diferença em relação a System.Drawing.TextureBrush é que tem estilos predefinidos que definem qual a imagem a utilizar para o mosaico. A plataforma C++ oferece 53 estilos de hachura e todos os 52 estilos podem ser utilizados para preenchimento ou contorno no PsDocument.
Para pintar objetos gráficos com um padrão de hachura na biblioteca Aspose.Page para C++, basta passar System.Drawing.HatchBrush para SetPaint() ou um dos métodos FillText() ou FillAndStrokeText() que aceitam System.Drawing.Brush como parâmetro.
Para contornar os objetos gráficos com um padrão de hachura na biblioteca Aspose.Page para C++, é necessário criar uma nova System.Drawing.Pen com System.Drawing.HacthBrush e passá-la para SetStroke() ou um dos métodos OutlineText() ou FillAndStrokeText() que aceitam System.Drawing.Pen como parâmetro.
No exemplo abaixo, demonstramos, em primeiro lugar, como preencher uma forma com um padrão de hachura, depois todos os estilos de hachura em C++ e, por fim, como preencher e contornar um texto com um padrão de hachura.
Um algoritmo para pintar objetos gráficos com um padrão de hachura num novo documento PS inclui os seguintes passos:
- Crie um fluxo de saída para o ficheiro PS resultante.
- Crie PsSaveOptions.
- Crie PsDocument com o fluxo de saída já criado e as opções de guardar.
- Crie o caminho gráfico ou a fonte necessária, dependendo do objeto que iremos preencher ou contornar.
- Crie um objeto de System.Drawing.HatchBrush com o estilo pretendido.
- Defina o pincel de hachura como a tinta atual no PsDocument.
- Preencha o percurso gráfico com a tinta atual ou preencha com texto. Se utilizarmos um dos métodos para preencher um texto que aceite System.Drawing.Brush como parâmetro, o ponto anterior pode ser ignorado.
- Feche a página.
- Guarde o documento.
Se precisarmos de traçar (contornar) objetos gráficos com um padrão de hachura em vez dos últimos 4 pontos, o seguinte será:
Crie o objeto System.Drawing.Pen com o pincel de hachura.
Defina esta caneta como o traço atual no PsDocument.
Contorne o percurso gráfico com o traço atual ou contorne o texto. Se utilizarmos um dos métodos para contornar o texto que aceita System.Drawing.Pen como parâmetro, o ponto anterior pode ser ignorado.
Feche a página.
Guarde o documento.
1 // The path to the documents directory.
2 System::String dataDir = RunExamples::GetDataDir_WorkingWithHatches();
3
4 //Create output stream for PostScript document
5 {
6 System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"AddHatchPattern_outPS.ps", System::IO::FileMode::Create);
7 // Clearing resources under 'using' statement
8 System::Details::DisposeGuard<1> __dispose_guard_0({ outPsStream});
9 // ------------------------------------------
10
11 try
12 {
13 //Create save options with A4 size
14 System::SharedPtr<PsSaveOptions> options = System::MakeObject<PsSaveOptions>();
15
16 // Create new 1-paged PS Document
17 System::SharedPtr<PsDocument> document = System::MakeObject<PsDocument>(outPsStream, options, false);
18
19 int32_t x0 = 20;
20 int32_t y0 = 100;
21 int32_t squareSide = 32;
22 int32_t width = 500;
23 int32_t sumX = 0;
24
25 //Restore graphics state
26 document->WriteGraphicsSave();
27
28 //Translate to initial point
29 document->Translate(static_cast<float>(x0), static_cast<float>(y0));
30
31 //Create rectngle path for every pattern square
32 System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> path = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
33 path->AddRectangle(System::Drawing::RectangleF(0.0f, 0.0f, static_cast<float>(squareSide), static_cast<float>(squareSide)));
34
35 //Create pen for outlining pattern square
36 System::SharedPtr<System::Drawing::Pen> pen = System::MakeObject<System::Drawing::Pen>(System::Drawing::Color::get_Black(), 2.0f);
37
38 //For every hatch pattern style
39 for (System::Drawing::Drawing2D::HatchStyle hatchStyle = static_cast<System::Drawing::Drawing2D::HatchStyle>(0); hatchStyle <= (System::Drawing::Drawing2D::HatchStyle)52; hatchStyle++)
40 {
41 //Set paint with current hatch brush style
42 document->SetPaint(System::MakeObject<System::Drawing::Drawing2D::HatchBrush>(hatchStyle, System::Drawing::Color::get_Black(), System::Drawing::Color::get_White()));
43
44 //Calculate displacement in order to don't go beyond the page bounds
45 int32_t x = squareSide;
46 int32_t y = 0;
47 if (sumX >= width)
48 {
49 x = -(sumX - squareSide);
50 y += squareSide;
51 }
52 //Translate current graphics state
53 document->Translate(static_cast<float>(x), static_cast<float>(y));
54 //Fill pattern square
55 document->Fill(path);
56 //Set stroke
57 document->SetStroke(pen);
58 //Draw square outline
59 document->Draw(path);
60
61 //Calculate distance from X0
62 if (sumX >= width)
63 {
64 sumX = squareSide;
65 }
66 else
67 {
68 sumX += x;
69 }
70 }
71
72 //Restore graphics state
73 document->WriteGraphicsRestore();
74
75 //Fill text with hatch pattern
76 System::SharedPtr<System::Drawing::Drawing2D::HatchBrush> brush = System::MakeObject<System::Drawing::Drawing2D::HatchBrush>(System::Drawing::Drawing2D::HatchStyle::DiagonalCross, System::Drawing::Color::get_Red(), System::Drawing::Color::get_Yellow());
77 System::SharedPtr<System::Drawing::Font> font = System::MakeObject<System::Drawing::Font>(u"Arial", 96.0f, System::Drawing::FontStyle::Bold);
78 document->FillAndStrokeText(u"ABC", font, 200.0f, 300.0f, brush, pen);
79
80 //Outline text with hatch pattern
81 brush = System::MakeObject<System::Drawing::Drawing2D::HatchBrush>(System::Drawing::Drawing2D::HatchStyle::Percent50, System::Drawing::Color::get_Blue(), System::Drawing::Color::get_White());
82 document->OutlineText(u"ABC", font, 200.0f, 400.0f, System::MakeObject<System::Drawing::Pen>(brush, 5.0f));
83
84
85 //Close current page
86 document->ClosePage();
87
88 //Save the document
89 document->Save();
90 }
91 catch(...)
92 {
93 __dispose_guard_0.SetCurrentException(std::current_exception());
94 }
95 }Veja como trabalhar com um padrão de hachura no documento PS em Java.
O resultado da execução deste código é apresentado como

Pode descarregar exemplos e ficheiros de dados do GitHub.