David PHAM-VAN

Implement Shading objects

... ... @@ -46,6 +46,7 @@ part 'src/font.dart';
part 'src/font_descriptor.dart';
part 'src/font_metrics.dart';
part 'src/formxobject.dart';
part 'src/function.dart';
part 'src/graphic_state.dart';
part 'src/graphics.dart';
part 'src/image.dart';
... ... @@ -60,6 +61,7 @@ part 'src/page_format.dart';
part 'src/page_list.dart';
part 'src/point.dart';
part 'src/rect.dart';
part 'src/shading.dart';
part 'src/signature.dart';
part 'src/stream.dart';
part 'src/ttf_parser.dart';
... ...
/*
* Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// ignore_for_file: omit_local_variable_types
part of pdf;
class PdfFunction extends PdfObjectStream {
PdfFunction(
PdfDocument pdfDocument, {
this.colors,
}) : super(pdfDocument);
final List<PdfColor> colors;
@override
void _prepare() {
for (final PdfColor color in colors) {
buf.putBytes(<int>[
(color.red * 255.0).round() & 0xff,
(color.green * 255.0).round() & 0xff,
(color.blue * 255.0).round() & 0xff,
]);
}
super._prepare();
params['/FunctionType'] = const PdfNum(0);
params['/BitsPerSample'] = const PdfNum(8);
params['/Order'] = const PdfNum(3);
params['/Domain'] = PdfArray.fromNum(const <num>[0, 1]);
params['/Range'] = PdfArray.fromNum(const <num>[0, 1, 0, 1, 0, 1]);
params['/Size'] = PdfNum(colors.length);
}
}
... ...
... ... @@ -94,6 +94,13 @@ class PdfGraphics {
buf.putString('W n\n');
}
/// Apply a shader
void applyShader(PdfShading shader) {
// The shader needs to be registered in the page resources
page.shading[shader.name] = shader;
buf.putString('${shader.name} sh\n');
}
/// This releases any resources used by this Graphics object. You must use
/// this method once finished with it.
///
... ...
... ... @@ -199,5 +199,5 @@ class PdfImage extends PdfXObject {
final PdfImageOrientation orientation;
/// Name of the image
String get name => '/Image$objser';
String get name => '/I$objser';
}
... ...
... ... @@ -59,6 +59,9 @@ class PdfPage extends PdfObject {
/// The fonts associated with this page
final Map<String, PdfFont> fonts = <String, PdfFont>{};
/// The fonts associated with this page
final Map<String, PdfShading> shading = <String, PdfShading>{};
/// The xobjects or other images in the pdf
final Map<String, PdfXObject> xObjects = <String, PdfXObject>{};
... ... @@ -117,11 +120,23 @@ class PdfPage extends PdfObject {
/// This holds any resources for this page
final PdfDict resources = PdfDict();
resources['/ProcSet'] = PdfArray(const <PdfName>[
PdfName('/PDF'),
PdfName('/Text'),
PdfName('/ImageB'),
PdfName('/ImageC'),
]);
// fonts
if (fonts.isNotEmpty) {
resources['/Font'] = PdfDict.fromObjectMap(fonts);
}
// shading
if (shading.isNotEmpty) {
resources['/Shading'] = PdfDict.fromObjectMap(shading);
}
// Now the XObjects
if (xObjects.isNotEmpty) {
resources['/XObject'] = PdfDict.fromObjectMap(xObjects);
... ...
/*
* Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// ignore_for_file: omit_local_variable_types
part of pdf;
enum PdfShadingType { function, axial, radial }
class PdfShading extends PdfObject {
PdfShading(
PdfDocument pdfDocument, {
@required this.shadingType,
@required this.function,
@required this.start,
@required this.end,
}) : assert(shadingType != null),
assert(function != null),
assert(start != null),
assert(end != null),
super(pdfDocument);
/// Name of the Shading object
String get name => '/S$objser';
final PdfShadingType shadingType;
final PdfFunction function;
final PdfPoint start;
final PdfPoint end;
@override
void _prepare() {
super._prepare();
params['/ShadingType'] = PdfNum(shadingType.index + 1);
params['/AntiAlias'] = const PdfBool(true);
params['/ColorSpace'] = const PdfName('/DeviceRGB');
params['/Coords'] =
PdfArray.fromNum(<double>[start.x, start.y, end.x, end.y]);
params['/Domain'] = PdfArray.fromNum(<num>[0, 1]);
params['/Extend'] = PdfArray(const <PdfBool>[PdfBool(true), PdfBool(true)]);
params['/Function'] = function.ref();
}
}
... ...