Home | History | Annotate | Download | only in lib
      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 
     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     if (job_params->borderless && job_params->pcl_type == PCLm) {
     48         job_params->printable_area_width = (unsigned int) _MI_TO_PIXELS(
     49                 job_params->page_width * 1000, job_params->pixel_units);
     50         job_params->printable_area_height = (unsigned int) _MI_TO_PIXELS(
     51                 job_params->page_height * 1000, job_params->pixel_units);
     52     } else {
     53         job_params->printable_area_width = (unsigned int) floorf(((job_params->page_width -
     54                 (left_margin + right_margin)) * (float)job_params->pixel_units));
     55         job_params->printable_area_height =  (unsigned int) floorf(((job_params->page_height -
     56                 (top_margin + bottom_margin)) * (float)job_params->pixel_units));
     57     }
     58 
     59     job_params->page_top_margin = top_margin;
     60     job_params->page_left_margin = left_margin;
     61     job_params->page_right_margin = right_margin;
     62     job_params->page_bottom_margin = bottom_margin;
     63 
     64     if (!job_params->borderless) {
     65         if (job_params->job_top_margin > top_margin) {
     66             job_params->print_top_margin = floorf(
     67                     ((job_params->job_top_margin - top_margin) * (float) job_params->pixel_units));
     68         } else {
     69             job_params->print_top_margin = floorf(((top_margin) * (float) job_params->pixel_units));
     70         }
     71         if (job_params->job_left_margin > left_margin) {
     72             job_params->print_left_margin = floorf(((job_params->job_left_margin - left_margin) *
     73                     (float) job_params->pixel_units));
     74         } else {
     75             job_params->print_left_margin = floorf(
     76                     ((left_margin) * (float) job_params->pixel_units));
     77         }
     78         if (job_params->job_right_margin > right_margin) {
     79             job_params->print_right_margin = floorf(((job_params->job_right_margin - right_margin) *
     80                     (float) job_params->pixel_units));
     81         } else {
     82             job_params->print_right_margin = floorf(
     83                     ((right_margin) * (float) job_params->pixel_units));
     84         }
     85         if (job_params->job_bottom_margin > bottom_margin) {
     86             job_params->print_bottom_margin = floorf(
     87                     ((job_params->job_bottom_margin - bottom_margin) *
     88                             (float) job_params->pixel_units));
     89         } else {
     90             job_params->print_bottom_margin = floorf(
     91                     ((bottom_margin) * (float) job_params->pixel_units));
     92         }
     93     }
     94 
     95     job_params->width = (job_params->printable_area_width -
     96             (job_params->print_left_margin + job_params->print_right_margin));
     97     job_params->height = (job_params->printable_area_height -
     98             (job_params->print_top_margin + job_params->print_bottom_margin));
     99 }
    100 
    101 void printable_area_get_default_margins(const wprint_job_params_t *job_params,
    102         const printer_capabilities_t *printer_cap,
    103         float *top_margin,
    104         float *left_margin, float *right_margin,
    105         float *bottom_margin) {
    106     if ((job_params == NULL) || (printer_cap == NULL)) {
    107         return;
    108     }
    109 
    110     bool useDefaultMargins = true;
    111 
    112     if (job_params->borderless) {
    113         useDefaultMargins = false;
    114         switch (job_params->pcl_type) {
    115             case PCLm:
    116             case PCLPWG:
    117                 *top_margin = 0.0f;
    118                 *left_margin = 0.0f;
    119                 *right_margin = 0.0f;
    120                 *bottom_margin = 0.00f;
    121                 break;
    122             default:
    123                 *top_margin = -0.065f;
    124                 *left_margin = -0.10f;
    125                 *right_margin = -0.118f;
    126                 *bottom_margin = -0.10f;
    127                 break;
    128         }
    129     } else {
    130         switch (job_params->pcl_type) {
    131             case PCLm:
    132                 *top_margin = (float) printer_cap->printerTopMargin / 2540;
    133                 *bottom_margin = (float) printer_cap->printerBottomMargin / 2540;
    134                 *left_margin = (float) printer_cap->printerLeftMargin / 2540;
    135                 *right_margin = (float) printer_cap->printerRightMargin / 2540;
    136                 useDefaultMargins = false;
    137                 break;
    138             case PCLPWG:
    139                 *top_margin = 0.0f;
    140                 *left_margin = 0.0f;
    141                 *right_margin = 0.0f;
    142                 *bottom_margin = 0.00f;
    143                 useDefaultMargins = false;
    144                 break;
    145             default:
    146                 break;
    147         }
    148     }
    149 
    150     if (useDefaultMargins) {
    151         if (!printer_cap->inkjet) {
    152             // default laser margins
    153             *top_margin = 0.2f;
    154             *left_margin = 0.25f;
    155             *right_margin = 0.25f;
    156             *bottom_margin = 0.2f;
    157         } else {
    158             // default inkjet margins
    159             *top_margin = 0.125f;
    160             *left_margin = 0.125f;
    161             *right_margin = 0.125f;
    162             if ((job_params->duplex != DUPLEX_MODE_NONE) || !printer_cap->borderless) {
    163                 *bottom_margin = 0.5f;
    164             } else {
    165                 *bottom_margin = 0.125f;
    166             }
    167         }
    168     }
    169 
    170     LOGD("printable_area_get_default_margins(): top_margin=%f, left_margin=%f, "
    171             "right_margin=%f, bottom_margin=%f", *top_margin, *left_margin, *right_margin,
    172             *bottom_margin);
    173 }