1 /*
2 * Copyright (C) 2016 The Android Open Source Project
3 * Copyright (C) 2016 Mopria Alliance, Inc.
4 * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 #include <math.h>
20 #include "lib_printable_area.h"
21 #include "wprint_debug.h"
22 #include "../plugins/media.h"
23
24 #define TAG "printable_area"
25
printable_area_get(wprint_job_params_t * job_params,float top_margin,float left_margin,float right_margin,float bottom_margin)26 void printable_area_get(wprint_job_params_t *job_params, float top_margin, float left_margin,
27 float right_margin, float bottom_margin) {
28 if (job_params == NULL) return;
29
30 job_params->printable_area_width = job_params->printable_area_height = 0.0f;
31 job_params->width = job_params->height = 0.0f;
32 job_params->page_top_margin = job_params->page_bottom_margin = 0.0f;
33 job_params->page_right_margin = job_params->page_left_margin = 0.0f;
34
35 job_params->page_width = 0.0f;
36 job_params->page_height = 0.0f;
37 int i;
38 for (i = 0; i < SUPPORTED_MEDIA_SIZE_COUNT; i++) {
39 if (job_params->media_size == SupportedMediaSizes[i].media_size) {
40 job_params->page_width = SupportedMediaSizes[i].WidthInInches / 1000;
41 job_params->page_height = SupportedMediaSizes[i].HeightInInches / 1000;
42 }
43 }
44 // don't adjust for margins if job is borderless and PCLm. dimensions of image will not
45 // match (will be bigger than) the dimensions of the page size and a corrupt image will render
46 // in genPCLm
47 job_params->printable_area_width = floorf(
48 ((job_params->page_width - (left_margin + right_margin)) *
49 (float) job_params->pixel_units));
50 job_params->printable_area_height = floorf(
51 ((job_params->page_height - (top_margin + bottom_margin)) *
52 (float) job_params->pixel_units));
53
54 job_params->page_top_margin = top_margin;
55 job_params->page_left_margin = left_margin;
56 job_params->page_right_margin = right_margin;
57 job_params->page_bottom_margin = bottom_margin;
58
59 if (!job_params->borderless) {
60 if (job_params->job_top_margin > top_margin) {
61 job_params->print_top_margin = floorf(
62 ((job_params->job_top_margin - top_margin) * (float) job_params->pixel_units));
63 } else {
64 job_params->print_top_margin = floorf(((top_margin) * (float) job_params->pixel_units));
65 }
66 if (job_params->job_left_margin > left_margin) {
67 job_params->print_left_margin = floorf(((job_params->job_left_margin - left_margin) *
68 (float) job_params->pixel_units));
69 } else {
70 job_params->print_left_margin = floorf(
71 ((left_margin) * (float) job_params->pixel_units));
72 }
73 if (job_params->job_right_margin > right_margin) {
74 job_params->print_right_margin = floorf(((job_params->job_right_margin - right_margin) *
75 (float) job_params->pixel_units));
76 } else {
77 job_params->print_right_margin = floorf(
78 ((right_margin) * (float) job_params->pixel_units));
79 }
80 if (job_params->job_bottom_margin > bottom_margin) {
81 job_params->print_bottom_margin = floorf(
82 ((job_params->job_bottom_margin - bottom_margin) *
83 (float) job_params->pixel_units));
84 } else {
85 job_params->print_bottom_margin = floorf(
86 ((bottom_margin) * (float) job_params->pixel_units));
87 }
88 }
89
90 job_params->width = (job_params->printable_area_width -
91 (job_params->print_left_margin + job_params->print_right_margin));
92 job_params->height = (job_params->printable_area_height -
93 (job_params->print_top_margin + job_params->print_bottom_margin));
94 }
95
printable_area_get_default_margins(const wprint_job_params_t * job_params,const printer_capabilities_t * printer_cap,float * top_margin,float * left_margin,float * right_margin,float * bottom_margin)96 void printable_area_get_default_margins(const wprint_job_params_t *job_params,
97 const printer_capabilities_t *printer_cap,
98 float *top_margin,
99 float *left_margin, float *right_margin,
100 float *bottom_margin) {
101 if ((job_params == NULL) || (printer_cap == NULL)) {
102 return;
103 }
104
105 bool useDefaultMargins = true;
106
107 if (job_params->borderless) {
108 useDefaultMargins = false;
109 switch (job_params->pcl_type) {
110 case PCLm:
111 case PCLPWG:
112 *top_margin = 0.0f;
113 *left_margin = 0.0f;
114 *right_margin = 0.0f;
115 *bottom_margin = 0.00f;
116 break;
117 default:
118 *top_margin = -0.065f;
119 *left_margin = -0.10f;
120 *right_margin = -0.118f;
121 *bottom_margin = -0.10f;
122 break;
123 }
124 } else {
125 switch (job_params->pcl_type) {
126 case PCLm:
127 *top_margin = (float) printer_cap->printerTopMargin / 2540;
128 *bottom_margin = (float) printer_cap->printerBottomMargin / 2540;
129 *left_margin = (float) printer_cap->printerLeftMargin / 2540;
130 *right_margin = (float) printer_cap->printerRightMargin / 2540;
131 useDefaultMargins = false;
132 break;
133 case PCLPWG:
134 *top_margin = 0.0f;
135 *left_margin = 0.0f;
136 *right_margin = 0.0f;
137 *bottom_margin = 0.00f;
138 useDefaultMargins = false;
139 break;
140 default:
141 break;
142 }
143 }
144
145 if (useDefaultMargins) {
146 if (!printer_cap->inkjet) {
147 // default laser margins
148 *top_margin = 0.2f;
149 *left_margin = 0.25f;
150 *right_margin = 0.25f;
151 *bottom_margin = 0.2f;
152 } else {
153 // default inkjet margins
154 *top_margin = 0.125f;
155 *left_margin = 0.125f;
156 *right_margin = 0.125f;
157 if ((job_params->duplex != DUPLEX_MODE_NONE) || !printer_cap->borderless) {
158 *bottom_margin = 0.5f;
159 } else {
160 *bottom_margin = 0.125f;
161 }
162 }
163 }
164
165 LOGD("printable_area_get_default_margins(): top_margin=%f, left_margin=%f, "
166 "right_margin=%f, bottom_margin=%f", *top_margin, *left_margin, *right_margin,
167 *bottom_margin);
168 }